嵌入式软件开发课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《嵌入式软件开发课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 软件 开发 课件
- 资源描述:
-
1、嵌入式软件开发嵌入式开发过程嵌入式开发过程“PC软件软件”hello world独立的嵌入式应用独立的嵌入式应用当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于“HELLO WORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:n 硬件环境中所使用的C库函数n 目标板上的存储器资源n 应用程序的初始化议程议程nPC软件的构造软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGEADS默认的标准默认的标准C库库A
2、NSI Cinput/outputerror handlingstack&heapsetupotherSemihosting Support应用程序调用的应用程序调用的C库库函数函数eg:fputc()设备驱动层设备驱动层使用使用semihosting SWIseg:_sys_write()调试工具环境调试工具环境C LibraryDebug AgentC库函数功能是支持PC软件软件的,而目标板上的可执行软件则依赖相关的硬件资源;在ARM体系中,我们可以采用semihosting通过相应的驱动来进行调试。ADS默认的存储器映射默认的存储器映射n在默认的情况下,我们链接、定位、在默认的情况下,我
3、们链接、定位、运行在运行在0 x8000nheap 被直接放置在数据区的上面被直接放置在数据区的上面n堆栈的基地址是通过调试环境从堆栈的基地址是通过调试环境从C库库函数的函数的Startup Code 里读取出来的。里读取出来的。nARMulator=from configuration file(peripherals.ami)ndefault=0 x08000000nMulti-ICE=from debugger internal variable$top_of_memoryndefault=0 x80000RORWZI0 x8000链接时确定由调试环境提供Heap(malloc,allo
4、c)StackC LibraryUser Code应用程序启动应用程序启动_mainncopy code and datanzero uninitialized data_rt_entryset up application stack and heapinitialize library functionscall top-level constructors(C+)Exit from applicationmain()causes the linker to pull in library initialization code程序入口点Agenda一个PC软件的构造定制标准C库函数到目标
5、板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE重定向重定向C库函数库函数(1)SemihostingSupportANSI Cinput/outputn你可以使用适合你目标板运行的驱动来替换标准你可以使用适合你目标板运行的驱动来替换标准C库中的设备驱动。库中的设备驱动。Eg:printf()可打印到可打印到LCD上,而不是打印控制台上上,而不是打印控制台上input/outputANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget重定向重定向C库函数库函数(2)n要重定向要重定向C库
6、函数库函数,简单的办法是使用你自己的可执行的简单的办法是使用你自己的可执行的semihosting SWIs来代来代替原来的替原来的C库函数,从而来满足你的系统要求库函数,从而来满足你的系统要求 比如说比如说,the printf()系列函数系列函数(sprintf()除外)都会调用都会调用fputc().在默认情况在默认情况下下fputc()的执行使用了semihosting SWI.用下面的语句来代替:用下面的语句来代替:extern void sendchar(char*ch);int fputc(int ch,FILE*f)/*e.g.write a character to an L
7、CD*/char tempch=ch;sendchar(&tempch);return ch;n可查看在ADS Embedded example目录下的retarget.c,可看到更多的重定向例子可看到更多的重定向例子 n你可以确定有不在连接时使用semihosting SWI 的吗?.消除消除C库函数中的库函数中的semi hostingn为了确保在连接时没有函数使用了为了确保在连接时没有函数使用了semi hosting SWIs,你可以在程序中加入你可以在程序中加入下面的句子:下面的句子:#pragma import(_use_no_semihosting_swi)n如果在程序中仍然使用
8、了如果在程序中仍然使用了semihosting,编译时将会报错:编译时将会报错:Error:Symbol _semihosting_swi_guard multiply definedn修改修改:n 如果使用(check-verbose linker output for occurrences of I use_ semihosting_ swi),那么连接器将会把那些使用了smeihosting 的程序列出来,然后:n提供你自己可运行的功能函数。n在在ADS 1.2 编译器和库函数手册编译器和库函数手册,表表4-2给出了所有使用了给出了所有使用了semihosting的的C库函库函数。数。
9、n注意注意:连接器在用户自己的应用代码中不会出现任何有关连接器在用户自己的应用代码中不会出现任何有关 semihosting SWI使使用的报告。用的报告。Agenda一个PC软件的构造定制定制标准C库函数到目标板 定制定制IMAGE的存储器映射到目标板的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE分散加载(分散加载(Scatterloading)n在一个实际应用当中,你可能并不想在在一个实际应用当中,你可能并不想在0 x8000处开始运行。处开始运行。n大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。n分散加载提供了一种把你的代码和
10、数据放在不同的存储器定位上的办法n分散加载定义了两种类型的存储器区域。nLoad 区:-在reset/load时保留了应用程序的代码和数据(典型应用为 ROM).nExecution 区 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个load区都可创建一个或多个可执行区。n分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给给armlink使用使用 eg:armlink program.o-scatter scatter.scf-o program.axfExecute ViewRAM0
11、x100000 x180000 x40000 x0000ROMRO分散加载分散加载(简单例子简单例子)只读代码和数据保存在ROM中C库函数初始化代码(在 _main)将:从ROM拷贝RW数据到RAM在RAM中的ZI 数据初始化RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWFill with zerosZICopyRWExecute ViewRAM0 x100000 x180000 x40000 x0000ROMROLOAD_ROM 0 x0000 0 x4000RAM0 x100000 x180000 x40000 x0000ROMLoad
12、ViewRORWScatter 描述文件描述文件n通配符(*)语法允许简单的对CODE 和DATA 进行分组EXEC_ROM 0 x0000 0 x4000 *(+RO)RAM 0 x10000 0 x8000 *(+RW,+ZI)RWZIRORWZIROCODERO-DATARO-CODEAB链接器放置规则链接器放置规则n在每个可执行区,链接器通过一些基本的规则来放置在每个可执行区,链接器通过一些基本的规则来放置CODE 和和DATAn基本的排序方法是通过属性来安排的基本的排序方法是通过属性来安排的:nRO 领先于RW,RW 领先于ZIn有相同的属性时,CODE 在DATA之前放置。n更多的
13、排序方法决定于:更多的排序方法决定于:n输入的组名按字母排序,n在ARMLINK命令行中指定的顺序。neg:armlink file1.o file2.o Asection Afrom file1.osection Afrom file2.o在在SCATTOR 文件中的对象排序文件中的对象排序n为了把特定的为了把特定的CODE 和和DATA 放在指定的地址上,你可以不考虑标准的放置规则放在指定的地址上,你可以不考虑标准的放置规则n使用使用+FIRST 和和+LAST,直接把第一个和最后一个对象放在可执行区。直接把第一个和最后一个对象放在可执行区。n图例:把VECTOR表放在区的开始。LOAD_
14、ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o(Vectors,+FIRST)file1.o(+RO)file2.o(+RO):在可执行区内,scattor 文件中要排序的对象对输出image没有影响链接器的标准放置规则仍然适用ROOT区区LOAD_ROM 0 x0000 0 x4000 ;start address and length EXEC_ROM 0 x0000 0 x4000;root(load=exec address)_main.o(+RO);copying code *(Region$Table);RO/RW ad
15、dresses to copy *(ZISection$Table);ZI addresses to zero RAM 0 x10000 0 x8000 *(+RO);All other RO areas *(+RW,+ZI);program variables Must be in a root regionoutside root region一个 root 区是一个可执行区,它的加载地址等于执行地址。Root区要点区要点n一个 root 区是一个可执行区,它的加载地址等于执行地址.n每个每个scatter描述文件必须最少包含一个描述文件必须最少包含一个root区,并且最少要包含下列内容:
16、区,并且最少要包含下列内容:n_main.o 含有拷贝code/data的代码nRegion$Table 和 ZISection$Table 含有将要拷贝的code/data的地址,他是由链接器产生的,不是一个对象文件。(所以*必须用)Error:L6202E:Section Region$Table cannot be assigned to a non-root region.Error:L6202E:Section ZISection$Table cannot be assigned to a non-root region.n注意注意:如果如果*(+RO)被定位在被定位在 root 区
17、区,在此之前的将被自动放置在此之前的将被自动放置nMain应用程序的入口点必须放在应用程序的入口点必须放在root区。区。Error:L6203E:Entry point(0 x08000000)lies within non-root region EXE_FLASH.Run-time 存储器管理存储器管理 SemihostingSupportANSI CStack&HeapSetupStack&HeapSetupANSI CC LibraryUser CodeDebug AgentTarget HardwareRetarget如何设置stack和 heap来满足我们的目标存储器?n我们已经
18、通过执行我们已经通过执行_user_initial_stackheap()把把C标准库的运行存储器标准库的运行存储器模式修改到目标平台上。模式修改到目标平台上。Stack 和和 Heap 初始化初始化C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall top-level constructors(C+)Exit from applicationmain()cause linker to pull in library initializ
19、ation codeImage Entry Point_user_initial_stackheap()set up application stack and heapRun-time 存储器模式存储器模式n你必须决定在放置你必须决定在放置stack和和heap时所使用的区域是单一的区时所使用的区域是单一的区(one-region model)或是不同的两个区或是不同的两个区(two-region model)HeapStackStackOne region modelTwo region modelHBSBSBHBHL单一存储器模式是默认方式为了实现多区域模式,你可以使用 use_two_
20、region_memory在所有的模式下,软件堆栈检查要许可。编译开关是:-apcs/swst 指定堆栈限制(为 two-region 模式)heap is checked against stack pointerHeapheap is checked against heap limit(SL)_user_initial_stackheap()n可以用可以用C或汇编来写,他要返回:或汇编来写,他要返回:nHeap 基地址在R0,STACK 的基地址在R1.nHeap 的限制地址在R2,STACK的限制地址在R3EXPORT _user_initial_stackheap_user_init
21、ial_stackheapLDR r0,=0 x80000;HBLDR r1,=0 x88000;SB;r2 not used(HL);r3 not used(SL)MOV pc,lrHeapStackHeap 的限制地址在单一模式是不被使用的。Stack 的限制地址只在软件堆栈检查许可的情况下才有效。HB=0 x80000SB=0 x88000警告警告!n当使用分散加载时你必须执行当使用分散加载时你必须执行 _user_initial_stackheap()n在在C库初始化代码内的库初始化代码内的_user_initial_stackheap()的默认执行是在映像文件的的默认执行是在映像文件
22、的RW/ZI数据段后放置数据段后放置HEAP。n使用 Image$RW$Base/Image$ZI$Base 连接符号n这些符号对scatterloading是无效的。n在在ADS 1.1和早期版本的软件中:和早期版本的软件中:n符号被设置为0X0,heap被定位在这!nHeap的并发使用,无论是直接(e.g.with malloc()或间接(by use of argc/argv)的都可能破坏向量表或其他代码,典型的结果是不可预知的程序在运行时出错了。n在在ADS 1.2:n符号没有定义,应用程序不会联接:Error:L6218E:Undefined symbol Image$ZI$Limi
23、t(referred from sys_stackheap.o).Agenda一个PC软件的构造裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化复位和初始化深层次的存储器器映象考虑编译和调试IMAGEThe Vector TableAREA Vectors,CODE,READONLYIMPORT Reset_Handler;import other exception handlers;ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP;Reserved v
24、ectorBIRQ_Handler;FIQ_Handler will follow directlyEND在使用scatterloading+FIRST时直接定位在0X0(或 0 xFFFF0000)ENTRY 直接告诉链接器这是一个入口点,防止某些段被删除中断向量表中断向量表初始化步骤初始化步骤C LibraryUser Code_maincopy code and datazero uninitialized data_rt_entryinitialize library functionscall top-level constructors(C+)Exit from applicati
展开阅读全文