嵌入式软件开发课件.ppt
《嵌入式软件开发课件.ppt》由会员分享,可在线阅读,更多相关《嵌入式软件开发课件.ppt(49页珍藏版)》请在三一办公上搜索。
1、嵌入式软件开发,嵌入式软件开发,嵌入式开发过程,“PC软件”,独立的嵌入式应用,当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于“HELLO WORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的: 硬件环境中所使用的C库函数 目标板上的存储器资源 应用程序的初始化,嵌入式开发过程“PC软件”独立的嵌入式应用当程序员开始开发一,议程,PC软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,议程PC软件的构造,
2、ADS默认的标准C库,ANSI C,input/output,error handling,stack &heapsetup,other,Semihosting Support,应用程序调用的C库函数eg: fputc(),设备驱动层使用semihosting SWIseg: _sys_write(),调试工具环境,C Library,Debug Agent,C库函数功能是支持PC软件的,而目标板上的可执行软件则依赖相关的硬件资源;在ARM体系中,我们可以采用semihosting通过相应的驱动来进行调试。,ADS默认的标准C库ANSI Cinput/error st,ADS默认的存储器映射,
3、在默认的情况下,我们链接、定位、运行在0 x8000heap 被直接放置在数据区的上面堆栈的基地址是通过调试环境从C库函数的Startup Code 里读取出来的。ARMulator = from configuration file (peripherals.ami) default = 0 x08000000Multi-ICE = from debugger internal variable $top_of_memorydefault = 0 x80000,RO,RW,ZI,0 x8000,链接时确定,由调试环境提供,Heap(malloc,alloc),Stack,ADS默认的存储器映
4、射在默认的情况下,我们链接、定位、运行在,C Library,User Code,应用程序启动,_maincopy code and datazero uninitialized data,程序入口点,C LibraryUser Code应用程序启动_main,Agenda,一个PC软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,Agenda一个PC软件的构造,重定向C库函数 (1),SemihostingSupport,ANSI C,input/output,你可以使用适合你目标板运行的驱动来替换标准C库中的设备
5、驱动。 Eg: printf( ) 可打印到LCD上,而不是打印控制台上,input/output,ANSI C,C Library,User Code,Debug Agent,Target Hardware,Retarget,重定向C库函数 (1)SemihostingANSI Cin,重定向C库函数(2),要重定向C库函数,简单的办法是使用你自己的可执行的semihosting SWIs来代替原来的C库函数,从而来满足你的系统要求 比如说, the printf()系列函数(sprintf()除外) 都会调用fputc(). 在默认情况下fputc()的执行使用了semihosting S
6、WI. 用下面的语句来代替:extern void sendchar(char *ch);int fputc(int ch, FILE *f) /* e.g. write a character to an LCD */ char tempch = ch; sendchar(可查看在ADS Embedded example目录下的retarget.c,可看到更多的重定向例子 你可以确定有不在连接时使用semihosting SWI 的吗?.,重定向C库函数(2)要重定向C库函数,简单的办法是使用你自己,消除C库函数中的semi hosting,为了确保在连接时没有函数使用了semi hosti
7、ng SWIs ,你可以在程序中加入下面的句子:#pragma import(_use_no_semihosting_swi) 如果在程序中仍然使用了semihosting ,编译时将会报错:Error: Symbol _semihosting_swi_guard multiply defined修改: 如果使用 (check -verbose linker output for occurrences of I use_ semihosting_ swi), 那么连接器将会把那些使用了smeihosting 的程序列出来, 然后:提供你自己可运行的功能函数。在ADS 1.2 编译器和库函数手
8、册, 表4-2给出了所有使用了semihosting的C库函数。注意: 连接器在用户自己的应用代码中不会出现任何有关 semihosting SWI使用的报告。,消除C库函数中的semi hosting为了确保在连接时没有,Agenda,一个PC软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,Agenda一个PC软件的构造,分散加载(Scatterloading),在一个实际应用当中,你可能并不想在0 x8000处开始运行。大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。分散加载提供了
9、一种把你的代码和数据放在不同的存储器定位上的办法分散加载定义了两种类型的存储器区域。Load 区: - 在reset/load时保留了应用程序的代码和数据 (典型应用为 ROM).Execution 区 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个load区都可创建一个或多个可执行区。分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给armlink使用 eg: armlink program.o -scatter scatter.scf -o program.axf,分散加载(Scatterloading)在一个实际应用当中,,分散加载(简单例子),只
10、读代码和数据保存在ROM中C库函数初始化代码 (在 _main) 将 :从ROM拷贝RW数据到RAM在RAM中的ZI 数据初始化,Execute ViewRAM0 x100000 x180000,Scatter 描述文件,通配符(*)语法允许简单的对CODE 和DATA 进行分组,EXEC_ROM 0 x0000 0 x4000 * (+RO),Execute ViewRAM0 x100000 x180000,链接器放置规则,在每个可执行区,链接器通过一些基本的规则来放置CODE 和DATA基本的排序方法是通过属性来安排的:RO 领先于RW ,RW 领先于ZI有相同的属性时,CODE 在DAT
11、A之前放置。更多的排序方法决定于:输入的组名按字母排序, 在ARMLINK命令行中指定的顺序。eg: armlink file1.o file2.o ,RORWZIROCODERO -DATARO -CODEAB,在SCATTOR 文件中的对象排序,为了把特定的CODE 和DATA 放在指定的地址上,你可以不考虑标准的放置规则使用+FIRST 和 +LAST ,直接把第一个和最后一个对象放在可执行区。图例:把VECTOR表放在区的开始。,LOAD_ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o (Vectors, +FIRST) f
12、ile1.o (+RO) file2.o (+RO) :,在可执行区内,scattor 文件中要排序的对象对输出image没有影响链接器的标准放置规则仍然适用,在SCATTOR 文件中的对象排序为了把特定的CODE 和D,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 addresses to copy * (ZI
13、Section$Table) ; ZI addresses to zero RAM 0 x10000 0 x8000 * (+RO) ; All other RO areas * (+RW,+ZI) ; program variables ,Must be in a root region,outside root region,一个 root 区是一个可执行区,它的加载地址等于执行地址。,ROOT区LOAD_ROM 0 x0000 0 x4000,Root区要点,一个 root 区是一个可执行区,它的加载地址等于执行地址.每个scatter描述文件必须最少包含一个root区,并且最少要包含下
14、列内容:_main.o 含有拷贝code/data的代码Region$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.注意: 如果 * (+RO)被定位在 root 区,在此之前的将被自动放置Ma
15、in应用程序的入口点必须放在root区。Error: L6203E: Entry point (0 x08000000) lies within non-root region EXE_FLASH.,Root区要点一个 root 区是一个可执行区,它的加载地址,Run-time 存储器管理,SemihostingSupport,ANSI C,Stack &HeapSetup,Stack &HeapSetup,ANSI C,C Library,User Code,Debug Agent,Target Hardware,Retarget,如何设置stack和 heap来满足我们的目标存储器?,我们
16、已经通过执行_user_initial_stackheap()把C标准库的运行存储器模式修改到目标平台上。,Run-time 存储器管理 SemihostingANSI,Stack 和 Heap 初始化,C Library,User Code,_maincopy code and datazero uninitialized data,Image Entry Point,Stack 和 Heap 初始化C LibraryUser,Run-time 存储器模式,你必须决定在放置stack和heap时所使用的区域是单一的区(one-region model)或是不同的两个区(two-region
17、model),Heap,Stack,Stack,One region model,Two region model,HB,SB,SB,HB,HL,单一存储器模式是默认方式为了实现多区域模式,你可以使用 use_two_region_memory在所有的模式下,软件堆栈检查要许可。编译开关是: -apcs /swst 指定堆栈限制 (为 two-region 模式),heap is checked against stack pointer,Heap,heap is checked against heap limit,(SL),Run-time 存储器模式你必须决定在放置stack和he,_u
18、ser_initial_stackheap( ),可以用C或汇编来写,他要返回:Heap 基地址在R0 ,STACK 的基地址在R1.Heap 的限制地址在R2,STACK的限制地址在R3,EXPORT _user_initial_stackheap_user_initial_stackheapLDR r0, =0 x80000 ;HBLDR r1, =0 x88000 ;SB; r2 not used (HL); r3 not used (SL)MOV pc, lr,Heap,Stack,Heap 的限制地址在单一模式是不被使用的。Stack 的限制地址只在软件堆栈检查许可的情况下才有效。,
19、HB = 0 x80000,SB = 0 x88000,_user_initial_stackheap( )可以用,警告!,当使用分散加载时你必须执行 _user_initial_stackheap()在C库初始化代码内的_user_initial_stackheap() 的默认执行是在映像文件的RW/ZI数据段后放置HEAP。使用 Image$RW$Base / Image$ZI$Base 连接符号这些符号对scatterloading是无效的。在ADS 1.1和早期版本的软件中:符号被设置为0X0, heap被定位在这!Heap的并发使用,无论是直接(e.g. with malloc()或
20、间接(by use of argc/argv)的都可能破坏向量表或其他代码,典型的结果是不可预知的程序在运行时出错了。在ADS 1.2:符号没有定义,应用程序不会联接:Error: L6218E: Undefined symbol Image$ZI$Limit (referred from sys_stackheap.o).,警告! 当使用分散加载时你必须执行 _user_initi,Agenda,一个PC软件的构造裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE,Agenda一个PC软件的构造,The Vector Tabl
21、e,AREA Vectors, CODE, READONLYIMPORT Reset_Handler; import other exception handlers; ENTRYBReset_HandlerBUndefined_HandlerBSWI_HandlerBPrefetch_HandlerBData_HandlerNOP; Reserved vectorBIRQ_Handler; FIQ_Handler will follow directlyEND,在使用scatterloading+FIRST时直接定位在0X0(或 0 xFFFF0000)ENTRY 直接告诉链接器这是一个入口
22、点,防止某些段被删除,中断向量表,The Vector TableAREA Vectors,初始化步骤,C Library,User Code,_maincopy code and datazero uninitialized data,Image Entry Point,$Sub$main( )enable caches & interrupts,初始化步骤C LibraryUser Code_main_,ROM or RAM at 0 x0?,需要一个有效的地址在 0 x0,这项功能可被编码在像RESET HANDLER 一样的模块中在本章结束的时候,我们还会讲到。,ROM,0 x1000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 软件 开发 课件
链接地址:https://www.31ppt.com/p-1390752.html