《《嵌入式软件开发》PPT课件》由会员分享,可在线阅读,更多相关《《嵌入式软件开发》PPT课件(49页珍藏版)》请在金锄头文库上搜索。
1、1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L D嵌入式软件开发嵌入式软件开发2TM266v06 Embedded Software Development嵌入式开发过程嵌入式开发过程“PC软件软件”独立的嵌入式应用独立的嵌入式应用当程序员开始开发一个基于ARM应用的时候,你可以使用ARM的ADS编写类似于“HELLO WORLD”的程序,使用ARMulator或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:n 硬件环境中所使用的C库函数n 目标板上的存储器资
2、源n 应用程序的初始化3TM366v06 Embedded Software Development议程议程nPC软件的构造软件的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE4TM466v06 Embedded Software DevelopmentADS默认的标准默认的标准C库库ANSI Cinput/outputerror handlingstack &heapsetupotherSemihosting Support应用程序调用的应用程序调用的C库库函数函数eg: fputc()设备驱动层设备驱动层使用使用se
3、mihosting SWIseg: _sys_write()调试工具环境调试工具环境C LibraryDebug AgentC库函数功能是支持PC软件软件的,而目标板上的可执行软件则依赖相关的硬件资源;在ARM体系中,我们可以采用semihosting通过相应的驱动来进行调试。5TM566v06 Embedded Software DevelopmentADS默认的存储器映射默认的存储器映射n在默认的情况下,我们链接、定位、在默认的情况下,我们链接、定位、运行在运行在0 x8000nheap 被直接放置在数据区的上面被直接放置在数据区的上面n堆栈的基地址是通过调试环境从堆栈的基地址是通过调试环
4、境从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,alloc)Stack6TM666v06 Embedded Software DevelopmentC LibraryUser Code应用
5、程序启动应用程序启动_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程序入口点7TM766v06 Embedded Software DevelopmentAgenda一个PC软件
6、的构造定制标准C库函数到目标板 定制IMAGE的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE8TM866v06 Embedded Software Development重定向重定向C库函数库函数 (1)SemihostingSupportANSI Cinput/outputn你可以使用适合你目标板运行的驱动来替换标准你可以使用适合你目标板运行的驱动来替换标准C库中的设备驱动。库中的设备驱动。 Eg: printf( ) 可打印到可打印到LCD上,而不是打印控制台上上,而不是打印控制台上input/outputANSI CC LibraryUser CodeDeb
7、ug AgentTarget HardwareRetarget9TM966v06 Embedded Software Development重定向重定向C库函数库函数(2)n要重定向要重定向C库函数库函数,简单的办法是使用你自己的可执行的简单的办法是使用你自己的可执行的semihosting SWIs来代来代替原来的替原来的C库函数,从而来满足你的系统要求库函数,从而来满足你的系统要求 比如说比如说, the printf()系列函数系列函数(sprintf()除外) 都会调用都会调用fputc(). 在默认情况在默认情况下下fputc()的执行使用了semihosting SWI. 用下面的
8、语句来代替:用下面的语句来代替:extern void sendchar(char *ch);int fputc(int ch, FILE *f) /* e.g. write a character to an LCD */ char tempch = ch; sendchar(&tempch); return ch;n可查看在ADS Embedded example目录下的retarget.c,可看到更多的重定向例子可看到更多的重定向例子 n你可以确定有不在连接时使用semihosting SWI 的吗?.10TM1066v06 Embedded Software Development消除
9、消除C库函数中的库函数中的semi hostingn为了确保在连接时没有函数使用了为了确保在连接时没有函数使用了semi hosting SWIs ,你可以在程序中加入你可以在程序中加入下面的句子:下面的句子:#pragma import(_use_no_semihosting_swi) n如果在程序中仍然使用了如果在程序中仍然使用了semihosting ,编译时将会报错:编译时将会报错:Error: Symbol _semihosting_swi_guard multiply definedn修改修改:n 如果使用 (check -verbose linker output for occ
10、urrences of I use_ semihosting_ swi), 那么连接器将会把那些使用了smeihosting 的程序列出来, 然后:n提供你自己可运行的功能函数。n在在ADS 1.2 编译器和库函数手册编译器和库函数手册, 表表4-2给出了所有使用了给出了所有使用了semihosting的的C库函库函数。数。n注意注意: 连接器在用户自己的应用代码中不会出现任何有关连接器在用户自己的应用代码中不会出现任何有关 semihosting SWI使使用的报告。用的报告。11TM1166v06 Embedded Software DevelopmentAgenda一个PC软件的构造定制
11、定制标准C库函数到目标板 定制定制IMAGE的存储器映射到目标板的存储器映射到目标板复位和初始化深层次的存储器器映象考虑编译和调试IMAGE12TM1266v06 Embedded Software Development分散加载(分散加载(Scatterloading)n在一个实际应用当中,你可能并不想在在一个实际应用当中,你可能并不想在0 x8000处开始运行。处开始运行。n大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。n分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法n分散加载定义了两种类型的存储器区域。nLoad 区: - 在reset/l
12、oad时保留了应用程序的代码和数据 (典型应用为 ROM).nExecution 区 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个load区都可创建一个或多个可执行区。n分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给给armlink使用使用 eg: 13TM1366v06 Embedded Software DevelopmentExecute ViewRAM0 x100000 x180000 x40000 x0000ROMRO分散加载分散加载(简单例子简单例子)只读代码和数据保存
13、在ROM中C库函数初始化代码 (在 _main) 将 :从ROM拷贝RW数据到RAM在RAM中的ZI 数据初始化RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWFill with zerosZICopyRW14TM1466v06 Embedded Software DevelopmentExecute ViewRAM0 x100000 x180000 x40000 x0000ROMROLOAD_ROM 0 x0000 0 x4000RAM0 x100000 x180000 x40000 x0000ROMLoad ViewRORWScatter
14、描述文件描述文件n通配符(*)语法允许简单的对CODE 和DATA 进行分组EXEC_ROM 0 x0000 0 x4000 * (+RO)RAM 0 x10000 0 x8000 * (+RW,+ZI)RWZI15TM1566v06 Embedded Software DevelopmentRORWZIROCODERO -DATARO -CODEAB链接器放置规则链接器放置规则n在每个可执行区,链接器通过一些基本的规则来放置在每个可执行区,链接器通过一些基本的规则来放置CODE 和和DATAn基本的排序方法是通过属性来安排的基本的排序方法是通过属性来安排的:nRO 领先于RW ,RW 领先于
15、ZIn有相同的属性时,CODE 在DATA之前放置。n更多的排序方法决定于:更多的排序方法决定于:n输入的组名按字母排序, n在ARMLINK命令行中指定的顺序。neg: armlink Asection Afrom file1.osection Afrom file2.o16TM1666v06 Embedded Software Development在在SCATTOR 文件中的对象排序文件中的对象排序n为了把特定的为了把特定的CODE 和和DATA 放在指定的地址上,你可以不考虑标准的放置规则放在指定的地址上,你可以不考虑标准的放置规则n使用使用+FIRST 和和 +LAST ,直接把第一
16、个和最后一个对象放在可执行区。直接把第一个和最后一个对象放在可执行区。n图例:把VECTOR表放在区的开始。LOAD_ROM 0 x0000 0 x4000 EXEC_ROM 0 x0000 0 x4000 vectors.o (Vectors, +FIRST) file1.o (+RO) file2.o (+RO) :在可执行区内,scattor 文件中要排序的对象对输出image没有影响链接器的标准放置规则仍然适用17TM1766v06 Embedded Software DevelopmentROOT区区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 * (ZISection$Table) ; ZI addresses to zero RAM 0 x10000 0 x8000