还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
嵌入式实验心得体味学期开始,我们开始学习《嵌入式系统及应用》,由于初次接触嵌入式系统,感觉蛮难的,所以收获不是很大,不少的概念都比较含糊,等到学期完毕开始做嵌入式课程设计时,真是茫然无从下手,自从拿到设计主题后,我就像热锅上的蚂蚁,一个字“急”最后实在没有方法,逼着自己去学习,查资料,总算对嵌入式有了浅层理解嵌入式系统本身是一个相对含糊的定义,一个手持的MP3和一个PC104的微型工业控制计算机都可以认为是嵌入式系统总体来说,嵌入式系统是“用于控制,监视或者辅助操作机器和设备的装备”一个典型的桌面Linux系统包括3个主要的软件层——linux内核、C库和应用程序代码内核是惟一可以彻底控制硬件的层,内核驱动程序代表应用程序与硬件之间发展会话内核之上是C库,负责把POSIXAPI转换为内核可以识别的形式,然后调用内核,从应用程序向内核传递参数应用程序依靠驱动内核来完成特定的任务在了解了根抵知识之后,我开始发展上机操作,固然,其中遇到不少的难题,不少东西都是第一次接触,又没有别人在旁边指导操作,彻底凭借自己去摸索练习其中的艰难可想而知然而坚持就是胜利,牙一咬眼一闭坚持做下去,而通过本次实验,我感觉收获还是蛮多的可能我对于嵌入式的知识学习的还是不太多,但是这之外的东西收获颇丰它让我学会了如何通过自己的努力去认知一个新事物,更重要的是端正自己的学习态度,惟独真正下功夫去学习,才干有收获,里面大牛们的恭敬嵌入式的调试是非常麻烦的,很耗时虽然有gdbserver这种工具,但是你用的开辟工具链中不一定包括它,而且就算用上了调试仍然是很花时间的所以要是不想天天通宵调程序呢,那就要时时以编写无错程序为目标
5.了解一点编译知识这对编写高性能程序很有匡助
6.学习设计模式设计模式普通在高级语言中讨论较多,但是好东西应该大家一起分享学习设计模式对提高我们的设计能力非常有匡助用C语言也可以实现一些模式思想,例如我们常用的回调函数,就可看做是Command模式的C语言版本
7.要有前瞻性,要积极学习新技术目前的嵌入式开辟普通都是将PC应用加以剪裁,移植到嵌入式系统中但是随着通信技术的开展,IPv6的广泛应用,设备上网是大势所趋许多新技术有可能在嵌入式领域率先应用把握住这个趋势,嵌入式程序员大有可为现在不少公司招程序员要求有嵌入式开辟经历,其实本质上嵌入式开辟和我们寻常的开辟没什么不同,只是要求严格一点我写下这些希翼对学习嵌入式开辟的朋友们有所匡助正所谓“一份耕耘,一份收获”没有付出,何谈回报呢再者,通过本次实验,我也学会了如何去分析问题,如何找出自己设计中的缺乏,继而去排除解决问题,这就是一个自我学习的过程当我们通过实验去学习理论知识时,自己动手得出的结论,不仅能加深我们对嵌入式的理解,更能加深我们对此的记忆固然,在这其中,我也发现自己的许多缺乏之处,由于学期伊始我没有好好学习,才落到如此地步,这也可以说是一个教训吧!我相信在以后的学习工作中,我一定会端正自己的学习态度,一丝不苟的去对待每一件事惟独做好足够的准备,才干事半功倍!Uboot是1999年由德国DENX软件工程中心的Wolfgang Denk发起的,全称Universal Bootloader具有如下特点o★支持多种硬件构架包括ARM、x
86、PPC、MIPS、m68kNIOS、Blackfin★支持多种操作系统包括Linux、VxWorks.NETBSD、QNX、RTEMS ARTOSLynxOS★支持多达216种以上的开辟板★开放源代码,遵循GPL条款★易于移植、调试
1、进一步了解Uboot的启动流程
2、进一步分析Uboot的启动过程
3、实现Uboot的移植分析Uboot的启动流程,实现Uboot的移植
1、Uboot的启动流程、分析U-Boot的启动过程可以分成3个阶段首先在Flash中运行汇编程序,将Flash中的启动代码部份复制到SDRAM中,同时创造环境准备运行C程序;然后在SDRAM中执行,对硬件发展初始化;最后设置内核参数的标记列表,复制镜像文件,进入内核的入口函数1程序首先在Flash中运行CPU入口函数/cpu/arm920t/start.s详细工作包括设置异常的入口地址和异常处o理函数;配置PLLCON存放器,确定系统的主频;屏蔽看门狗和中断;初始化I/O存放器;关闭MMU功能;初始化存储器空间,设置刷新频率;将U-Boot的内容复制到SDRAM中;设置堆栈的大小,Idr pc,startarmbootoboard/yqliu2410中config,mk文件TEXTBASE=0x31F00000用于设置程序编译连接的起始地址,在程序中要特殊注意与地址相关指令的使用当程序在Flash中运行时,执行程序跳转时必须要使用跳转指令,而不能使用绝对地址的跳转即直接对PC操作如果使用绝对地址,那末,程序的取指是相对于当前PC位置向前或者向后的32MB空间内,而不会跳入SDRAM中2程序跳转到SDRAM中执行/libarm/board.c中的startarmboot函数该函数将完成如下工作*设置通用端口;设置处理器类型;设置启动参数地址;*envinit设置环境变量,初始化环境;*initbaudrate设置串口的波特率;*serialinit设置串口的工作方式;*flashinit设置ID号、每一个分页的起始地址等信息,将信息送到相应的构造体中;*draminit设置SDRAM的起始地址和大小;*envrelocate将环境变量的地址送到全局变量构造体中;*enable interrupts开启中断;*mainloop该函数主要用于设置延时等待,从而确定目标板是进入下载操作模式还是下载镜像文件启动内核在设定的延时时间范围内,目标板将在串口等待输入命令,当目标板接到正确的命令后,系统进入下载模式在延时时间到达后,如果没有接收到相关命令系统将自动进入装载模式3装载模式下系统将执行dobootmlinux函数,0x30008000是内核在SDRAM中的起始地址;0x30800000是ramdisk在SDRAM中的起始地址;0x40000是内核在Flash中的位置,0x100000是数据块的大小;0x140000是ramdisk在FLASH中的位置,0x440000是数据块的大小系统调用memcpyO函数将内核从flash和ramdisk复制到SDRAM中,详细如下memcpyvoid*0x30008000,void*0x40000,0x100000;〃复制数据块memcpyvoid*0x30800000,void*0x140000,0x440000;〃复制数据块通常,将内核参数传递给Linux操作系统有两种方法采用structparamstruct构造体或者标记列表一个合法的标记列表开始于ATAGC0RE,完毕于ATAGNONEATAGCORE可以为空,一个空的ATAGCORE的size字段设为“2”0x00000002ATAGNONE的size字段必须设为“0”o标记列表可以有任意多的标记tag在嵌入式Linux系统中,通常由U-Boot设置的启动参数有ATAGCORE、ATAGMEM、ATAGCMDLINE、ATAGRAMDISK.ATAGINITRD等在本系统中,传递参数时分别调用了以下tag setupstarttagbd;〃标记列表开始setupmemorytags bd;〃设置内存的起始位置和大小setupmandlinetag bd,mandline;/*Linux内核在启动时可以命令行参数的形式来接收信息,利用这一点可以向内核提供那些内核不能检测的硬件参数信息,或者重载override内核检测到的信息setupramdisktagbd;〃表示内核解压后ramdisk的大小setupinitrdtagbd,initrdstart,initrdend;〃设置ramdisk的大小和物理起始地址setupendtag bd;〃标记列表完毕其中bdt*bd=gd-bd是指向bdt构造体的指针,在该构造体中存放了关于开辟板配置的根本信息系统采用以下代码来进入内核函数theKernel=void*int,intntohl hdr-ihep;hdr是imageheadert类型的构造体,hdr-〉ihep指向内核的第一条指令地址,即Linux操作系统下的/kernel/arch/arm/boot/pressed/head.S汇编程序theKernel函数调用应该不会返回,如果该调用返回,那末说明出错
2、Uboot的移植步骤1)建立板级支持包根据S3C2410处理器,在board目录下依照smdk2410目录配置,创立自己开辟板的板级资源目录,相应的在include/configs目录下创立头文件修改规那末文件Makfile,添加开辟板编译参数支持2)添加外设支持添加存储设备支持NANDFLASH启动支持添加网络设备支持DM9000A添加USB接口支持添加文件系统支持3)设置环境变量U-Boot中提供了丰富的命令,smdk2410开辟板配置了一部份命令,我们需要通过相应的环境变量为自己的开辟板增加一些命令:#define CONFIGCMDNAND#define CONFIGCMDPINGttdefineCONFIGCMDDLF ttdefineCONFIGCMDENV ttdefineCONFIGCMDNETftdefine CONFIGBOOTDELAY3ttdefine CFGLOADADDR0x30008000ttdefine CFGTFTPLOADADDR0x
1.不要玩Linuxo这一点主要是对像我这样在Linux下面开辟的程序员来说的因为Linux对程序员的吸引力很大,但它下面可以直接用的软件还是比较少于是我们总想到网上找一些开源的软件装到我们的机器上,从无到有让人很有成就感的,呵呵二要是装上的不是最新版〜本的还不满意,于是又开始忙升级在Windows下这个过程大概没什么意思,全都next了在Linux下就不一样了,直接拿过来的源代码不少编译都不能通过,最新版本更是这样,得我们自己改,而且往往时改了又改这个过程很花时间,我就在这方面浪费了不少时间,本来有个月工作比较轻松,打算阅读Linux kernel代码也想成高手,呵呵,当时我机子上没有好的阅读工具,于是先弄了个source navigator,觉得不够又装了个open office,然后又找来了几份不同版本的kernel代码结果一个月过去了,一个文件夹还没看完后面工作紧了,只能把看kernel当歇息,直到现在才粗略看完fs,mm两个文件夹
2.不要满足于C语言C语言很优秀,也很简单程序设计能力不等同于用C语言能力嵌入式开辟程序员要有扎实的数据构造根抵,要积极的学习操作系统,积极的学习网络编程,要是想发展驱动开辟还需要积极的学习硬件知识
3.了解几种芯片体系构造嵌入式不像PC领域x86一统天下,在嵌入式领域ARM、MIPS、M68k等各显神通例如ARM7是没有MMU的,uClinux在它上面跑是最适宜了,但是没有MMU我们也必须实现简单的MM功能,同时没有MMU一些常用库函数是不能实现的,这些嵌入式开辟程序员必须要了解
4.编写无错的C程序关于这一点建议阅读Steve Maguire的Writing CleanCode》我对MS没有好感,但这不影响我对MS。
个人认证
优秀文档
获得点赞 0