版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统设计与实例开发——ARM与C/OS-Ⅱ第八讲程序设计与分析北京航空航天大学嵌入式机电控制研究室本节提要132程序编译技术程序优化技术Linux初步嵌入式软件的要求功能性要求:满足系统所要求的功能。时限性要求:满足系统的实时性要求。存储器要求:适应系统内存总量要求。功耗要求:满足系统能耗的要求。嵌入式编程 语言的选择高级语言:C、C++、JAVA、Ada等。汇编语言:硬件体系结构相关。程序的编译执行过程嵌入式C编译环境
嵌入式C交叉编译环境一般都包括汇编器、链接器和定位器。汇编器的任务是将符号级的汇编语言翻译成称为目标代码的指令位级表示。链接器是用来将不同的模块(编译或汇编过的文件)链接成目标文件。定位器则允许将代码和数据放置在目标处理器的指定内存空间。汇编程序汇编完成汇编语言到二进制代码的转换。标记处理方法:第一次扫描代码以决定每个标记的地址。第二次用第一次中的标记值汇编指令,产生二进制代码。符号表 ADDr0,r1,r2Label1ADDr3,r4,r5 CMPr0,r3Label2SUBr5,r6,r7assemblycodeLabel10x8Label20x10symboltable编译过程高级编程语言语法分析、生成符号表和语义分析独立于机器的优化指令级优化和代码生成汇编代码ARM开发环境包含的C/C++编译器编译=翻译+优化编译结合了翻译和优化两个环节翻译是将高级语言翻译为低级指令形式(或汇编语言形式)。优化一方面产生更好的指令顺序,另一方面从整体上考虑程序效率。编译过程中,高级语言被拆分成语句和表达式。编译技术——语句翻译a*b+5*(c-d)expressionDFG*-*+abcd52341算术表达式的代码翻译ADRr4,aMOVr1,[r4]ADRr4,bMOVr2,[r4]MULr3,r1,r2DFG*-*+abcd5ADRr4,cMOVr1,[r4]ADRr4,dMOVr5,[r4]SUBr6,r4,r5MULr7,r6,#5ADDr8,r7,r3code控制代码的产生if(a+b>0) x=5;else x=7;a+b>0x=5x=7321控制代码的翻译 ADRr5,a LDRr1,[r5] ADRr5,b LDRr2,b ADDr3,r1,r2 BLElabel3a+b>0x=5x=7 LDRr3,#5 ADRr5,x STRr3,[r5] Bstmtent label3LDRr3,#7 ADRr5,x STRr3,[r5]stmtent...过程链接过程一般指不返回值的结构。要求代码:调用并返回。传递参数和结果。参数和结果是在堆栈中传递的。带有几个参数的过程可以使用寄存器。过程堆栈proc1growthproc1(inta){proc2(5);}proc2SPstackpointerFPframepointer5accessedrelativetoSP编译技术——ARM过程调用标准(APCS)APCS,ARM过程调用标准(ARMProcedureCallStandard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自C、Pascal,也可以是用汇编语言写成的。APCS定义了:r0-r3passparametersintoprocedure.Extraparametersareputonstackframe.r0holdsreturnvalue.r4-r7holdregistervalues.r11isframepointer,r13isstackpointer.编译技术——数据结构编译程序必须对相关数据结构的引用翻译成对原始存储器的引用,通常需要在运行时进行地址计算。一维数组二维数组结构体A[0]A[1]Field1Field2]A[0,0]A[0,1]A[1,0]A[1,0]编译技术——表达式简化1.A*B+A*CA*(B+C)2.for(i=0;i<8+1;i++)for(i=0;i<9;i++)编译技术——死代码清除死代码是指永远不会被执行的代码,在编译时要能够识别这些代码,并将其从程序中清除掉。死代码大都是一些调试信息。编译技术——循环变换循环是重要的程序结构,经常占用大量的CPU的计算时间,在编程时需要优化;循环展开:循环合并:循环折叠:for(i=0;i<N;i++)a[i]=b[i]*5;for(j=0;j<N;j++)w[j]=c[j]*d[j];ðfor(i=0;i<N;i++){ a[i]=b[i]*5;w[i]=c[i]*d[i]; }for(i=0;i<4;i++) a[i]=b[i]*c[i];ðfor(i=0;i<2;i++){ a[i*2]=b[i*2]*c[i*2]; a[i*2+1]=b[i*2+1]*c[i*2+1];编译技术——寄存器分配寄存器分配选择寄存器变量的分配以使所需的寄存器总数最少;w=a+b;x=c+w;y=c+d;ar0br1cr2dr0wr3xr0yr3timeabcdwxy123t=1t=2t=3本节提要132程序编译技术程序优化技术Linux初步程序优化Optimizingforexecutiontime.Optimizingforenergy/power.Optimizingforprogramsize.影响程序运行时间的主要因素源代码:编写高效优化的高级语言源代码可以缩短程序运行的时间。编译器:编译器负责把高级语言代码转换成机器代码程序,不同的编译器会导致代码效率的不同。硬件的体系结构:硬件的体系结构对程序的运行时间有较大的影响,如CPU内部寄存器的数量、高速缓存的大小和组织、系统的内存大小等。操作系统:操作系统决定了任务调度与内存管理等对程序执行时间有重要影响,结合硬件的体系结构,决定了系统的中断响应时间。程序优化的基本策略1.高级程序设计:选择适当的算法与数据结构,避免使用可能会渐进产生较差性能的算法与编码技术。2.基本编码原则:避免采用限制编译器优化的因素,从而令编译器产生高效的代码;消除连续的函数调用:如将计算移动循环外。消除不必要的存储器引用:引入临时变量来保存中间结果,只有当最后的值计算出来时,才将结果存放到数组或全局变量中。3.低级优化:尝试各种与数组代码相对的指针形式。通过展开循环降低循环开销。通过迭代分割的技术,找到使用流水线优化的功能单元的方法。程序剖析(Profiling)1.程序剖析用来分析程序的各个部分需要多少CPU时间,程序剖析一边可以在现实的基准数据上运行实际的程序,一边进行剖析。2.GPROF——UNIX提供的剖析程序:确定程序中每个函数花费了多少CPU时间。计算每个函数被调用的次数,以调用函数来分类。Amdahl定律Amdahl定律主要用于描述提高系统某一部分性能对整个系统性能的影响;例:设一个系统执行某个应用程序需要时间Told,而系统的某个部分运行所需要时间的百分比为a,如果性能提高了k倍,则这个部分原来需要时间aTold,而现在需要时间(aTold)/K。因此,整个程序执行时间为:Tnew=(1-a)Told+(aTold)/k=Told[(1-a)+a/k]所以程序加速比为:S=Told/Tnew=1/[(1-a)+a/k]即:如果以前占系统60%时间的部分性能提高了3倍(k=3),则程序加速比为1.67。所以要想提高整个系统的速度,光大幅度提高某一部分的速度是不够的。影响程序性能的要素程序的执行时间=程序路径+指令耗时路径是被程序(或者说它等价于程序的高级语言表示)执行的指令序列。指令耗时基于被程序路径跟踪的指令序列,它考虑数据相关性、流水线行为和高速缓存。本节提要132程序编译技术程序优化技术Linux初步嵌入式Linux分类第一类是在利用Linux强大功能的前提下,使它尽可能得小,以满足许多嵌入式系统对体积的要求,如µCLinux()。第二类是将Linux开发成实时系统尤其是硬(firm)实时系统,应用于一些关键的控制场合,如Fsmlabs公司()的RTLinux、MontaVista()的HardHatLinux等。第三类的产品就是将实时性和嵌入式方案结合起来的方案,很多公司都这么做,并且提供集成化的开发方案,如Lineo、TimeSys等。全球每年生产的CPU的数量在二十亿颗左右,超过80%应用于专用性很强的各类嵌入式系统。其中,又有相当一部分面向低端市场。为降低硬件成本及运行功耗,有一类CPU在设计中取消了内存管理单元(MemoryManagementUnit,简称MMU)功能模块。如Motorola公司的M68328、M68EN322、MC68360、DragonBall系列如68EZ328、68VZ328,ColdFire系列的如5272、5307,ARM7TDMI和MC68EN302、ETRAX、Inteli960、PRISMA、Atari68k等。标准Linux针对有MMU的处理器设计。在这种处理器上,虚拟地址被送到MMU,把虚拟地址映射为物理地址。通过赋予每个任务不同的虚拟地址/物理地址转换映射,可支持不同任务之间的保护。为什么要使用µCLinux最初,运行于这类没有MMU的CPU之上的都是一些很简单的单任务操作系统,或者更简单的控制程序,甚至根本就没有操作系统而直接运行应用程序。在这种情况下,系统无法运行复杂的应用程序,或者效率很低,而且,所有的应用程序需要重写,并要求程序员十分了解硬件特性。这些都阻碍了应用于这类CPU之上的嵌入式产品开发的速度。
然而,随着µCLinux的诞生,这一切都改变了。µCLinux是一个完全符合GNU/GPL公约的项目,完全开放代码,现由Lineo公司支持维护。英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以µCLinux就是Micro-Control-Linux,字面上的理解就是“微控制领域中的Linux系统”。它专门针对没有MMU的CPU,并专为嵌入式系统做了许多小型化的工作,已支持前面提到的多款CPU。官方主页在。EmbeddedLinux/MicrocontrollerProjectµCLinux内核简介µCLinux是Linux2.0核心的分支,是针对没有MMU管理单元的微控制器设计的。继承了Linux的大多数特性。多数的Linux下应用程序和驱动程序都可以在µCLinux下运行。内核精简。Kernel<512KB。Kernel+root<900KB。并入Linux2.6内核中。µCLinux与Linux的区别(1)内存管理µCLinux运行于没有MMU的处理器上。使用平坦式(flat)内存管理模式,虚拟内存到物理内存是一对一的映射关系。对于应用程序,使用固定的栈空间。加载应用程序的时候需要重新定位。可用内存空间的大小受到物理内存的限制。µCLinux与Linux的区别(2)fork与vforkµCLinux的多进程管理通过vfork来实现,µCLinux只能支持vfork。vfork使父进程锁定直到子进程exec()或exit()。注:µCLinux的应用程序的多线程可以依赖于标准C库来实现(µCLibc)。µCLinux与µC/OS-II(1)µCLinux源于Linux,是一个很完整的系统,包括:多任务调度;内存管理;文件系统(及接口);设备驱动程序;完整的TCP/IP的支持.源码开放,支持广泛(GUI、FS、驱动程序等等)。µCLinux与µC/OS-II(2)µC/OS-II源码开放,内核简单,易于学习和移植。占先式内核,实时性好。只有多任务调度的简单内核。内存管理过于简单,几乎没有动态内存管理功能。文件系统和图形界面需要外挂。对于设备驱动程序没有专门统一的接口。µCLinux的实时性问题µCLinux内核不关心实时性问题。可以和RTLinux配合来实现实时。RTLinux处理实时任务,非实时任务由Linux完成。RTLinux是为Linux提供实时性的方法,同样也适用于µCLinux。通过RTLinux的patch,可以满足µCLinux对实时性的需求。µCLinux的移植版本MotorolaDragonBall、68KMotorolaColdfireARM7TDMI、ARM9TDMI(ARM940T)AlteraNios…µCLinux的内核组成初始化程序段(init) 32KB左右数据段(data) 50~100KB左右未初始化数据段(bss) 100~150KB左右代码段(text) 300KB左右(init、data、bss和text的地址是由编译链接时的定位文件vmlinux.lds决定的)文件系统(romfs) >80KB左右移植µCLinux的主要工作选择处理器对应的交叉编译器。选择并修改Bootloader。修改链接文件(vmlinux-armv.lds.in),定位各个数据段。定义系统定时器、控制台(Console)。编写中断的控制函数。定义根文件系统。编写其他系统设备驱动…编译器的选择µCLinux内核在ARM上的编译交叉编译器arm-elf-gcc、arm-linux-gcc标准C库——应用程序µC-libc、µCLibc(µC)Linux的bootloader系统配置、中断接管、引导。装载内核、根文件系统、参数传递、内核调试、内核和根文件系统的下载等。常见的µCLinux(Linux)的Bootloader:RedbootBlobViviUbootarmBoot…µCLinux发行版的目录结构uCLinux-dist/NetSilicon/Samsung/ArcturusRomfs的相关工具根文件系统新版的标准C库
uClibc应用程序各制造商的配置文件forNET+40forS3C4510foruCdimmanduCsimmconfigDocumentationvendorsliblinux-2.0.xlinux-2.4.xtoolsuClibcuserromfsuClinux-2.4内核uClinux-2.0内核旧版的标准C库uC-libc配置脚本相关的文档uClinux的内核目录结构Linux2.4.x/arch/drivers/fs/include/init/ipc/kernel/lib/mm/mmnommu/net/scripts/armnommu/i196/m68knommu/boot/mach-s3c44b0/kernel/lib/mm/asm-armnommu/linux/net/arch-netarm/proc-netarmuClinux内核结构读懂µCLinux内核源码(µC)Linux内核庞大,结构复杂。对µCLinux内核的统计:接近1万个文件,4百万行代码。内核编程习惯(技巧)不同于应用程序。(µC)Linux内核的C代码Linux内核的主体使用GNUC,在ANSIC上进行了扩充。Linux内核必须由gcc编译。gcc和Linux内核版本并行发展,对于版本的依赖性强。内核代码中使用的一些编程技巧,在通常的应用程序中很少遇到。建立嵌入式Linux开发环境(1)建立开发环境操作系统REDHAT-Linux(7或9),安装GCC交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc。配置开发主机配置MINICOM(与windows系统类似),作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具;配置网络,主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。建立引导装载程序BOOTLOADER在一些公开源代码的BOOTLOADER,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度住宅小区水电安装与节能评估承包合同3篇
- 二零二五版茶叶店店长聘用及茶文化推广合同3篇
- 2025年度环保型建筑材料采购供应合同范本4篇
- 二零二五年度草坪围栏施工与生态旅游开发合同3篇
- 二零二五年度生态公园打桩工程设计合同4篇
- 现代农业科技引领办公自动化新趋势
- 2025年度民房建筑项目施工监理合同范本4篇
- 二零二五版高端制造企业厂长职务聘用合同与防盗门安全协议2篇
- 二零二五年度新能源风力发电项目投资合同4篇
- 二零二五足浴行业承包经营合同样本4篇
- 2024年考研英语(一)真题及参考答案
- 2024年采购代发货合作协议范本
- 工业自动化设备维护保养指南
- 《向心力》参考课件4
- 2024至2030年中国膨润土行业投资战略分析及发展前景研究报告
- 【地理】地图的选择和应用(分层练) 2024-2025学年七年级地理上册同步备课系列(人教版)
- JBT 14588-2023 激光加工镜头 (正式版)
- 2024年四川省成都市树德实验中学物理八年级下册期末质量检测试题含解析
- 廉洁应征承诺书
- 2023年四川省成都市中考物理试卷真题(含答案)
- 泵车述职报告
评论
0/150
提交评论