嵌入式软件开发课件

上传人:txadgkn****dgknqu... 文档编号:244843528 上传时间:2024-10-06 格式:PPT 页数:49 大小:827.01KB
返回 下载 相关 举报
嵌入式软件开发课件_第1页
第1页 / 共49页
嵌入式软件开发课件_第2页
第2页 / 共49页
嵌入式软件开发课件_第3页
第3页 / 共49页
点击查看更多>>
资源描述
Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,TM,Click to Edit Master Title Style,*,66v06 Embedded Software Development,嵌入式软件开发,嵌入式开发过程,“,PC,软件”,独立的嵌入式应用,当程序员开始开发一个基于,ARM,应用的时候,你可以使用,ARM,的,ADS,编写类似于“,HELLO WORLD”,的程序,使用,ARMulator,或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时,下面这些问题就成为我们首要考虑的:,硬件环境中所使用的,C,库函数,目标板上的存储器资源,应用程序的初始化,议程,PC,软件的构造,定制标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,ADS,默认的标准,C,库,ANSI C,input/,output,error,handling,stack&,heap,setup,other,Semihosting,Support,应用程序调用的,C,库函数,eg,:,fputc,(),设备驱动层,使用,semihosting,SWIs,eg,:_sys_write(),调试工具环境,C Library,Debug Agent,C,库函数功能是支持,PC,软件,的,而目标板上的可执行软件则依赖相关的硬件资源;在,ARM,体系中,我们可以采用,semihosting,通过相应的驱动来进行调试。,ADS,默认的存储器映射,在默认的情况下,我们链接、定位、运行在0,x8000,heap,被直接放置在数据区的上面,堆栈的基地址是通过调试环境从,C,库函数的,Startup Code,里读取出来的。,ARMulator,=from configuration file(peripherals.,ami,),default=0 x08000000,Multi-ICE,=from debugger internal variable$top_of_memory,default=0 x80000,RO,RW,ZI,0,x8000,链接时确定,由调试环境提供,Heap(,malloc,alloc,),Stack,C Library,User Code,应用程序启动,_,main,copy code and data,zero,uninitialized,data,_,rt,_entry,set up application stack and heap,initialize library functions,call top-level constructors(C+),Exit from application,main(),causes the linker to pull in library initialization code,程序入口点,Agenda,一个,PC,软件的构造,定制,标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,重定向,C,库函数(1),Semihosting,Support,ANSI C,input/,output,你可以使用适合你目标板运行的驱动来替换标准,C,库中的设备驱动。,Eg,:,printf,(),可打印到,LCD,上,而不是打印控制台上,input/,output,ANSI C,C Library,User Code,Debug Agent,Target Hardware,Retarget,重定向,C,库函数,(2),要重定向,C,库函数,简单的办法是使用你自己的可执行的,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 LCD*/char,tempch,=,ch,;,sendchar,(&,tempch,);return,ch,;,可查看在,ADS Embedded example,目录下的,retarget.c,可看到更多的重定向例子,你可以确定有不在连接时使用,semihosting,SWI,的吗?.,消除,C,库函数中的,semi hosting,为了确保在连接时没有函数使用了,semi hosting,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,编译器和库函数手册,表4-2给出了所有使用了,semihosting,的,C,库函数。,注意:连接器在用户自己的应用代码中不会出现任何有关,semihosting,SWI,使用的报告。,Agenda,一个,PC,软件的构造,定制,标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,分散加载(,Scatterloading,),在一个实际应用当中,你可能并不想在0,x8000,处开始运行。,大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。,分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法,分散加载定义了两种类型的存储器区域。,Load,区:-在,reset/load,时保留了应用程序的代码和数据,(,典型应用为,ROM).,Execution,区 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个,load,区都可创建一个或多个可执行区。,分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给,armlink,使用,eg,:,armlink,program.o-scatter scatter.,scf,-o program.,axf,Execute View,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,RO,分散加载,(,简单例子,),只读代码和数据保存在,ROM,中,C,库函数初始化代码(在,_main),将:,从,ROM,拷贝,RW,数据到,RAM,在,RAM,中的,ZI,数据初始化,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,Load View,RO,RW,Fill with zeros,ZI,Copy,RW,Execute View,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,RO,LOAD_ROM 0 x0000 0 x4000,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,Load View,RO,RW,Scatter,描述文件,通配符(*)语法允许简单的对,CODE,和,DATA,进行分组,EXEC_ROM 0 x0000 0 x4000,*(+RO),RAM 0 x10000 0 x8000,*(+RW,+ZI),RW,ZI,RO,RW,ZI,RO,CODE,RO-DATA,RO-CODE,A,B,链接器放置规则,在每个可执行区,链接器通过一些基本的规则来放置,CODE,和,DATA,基本的排序方法是通过属性来安排的:,RO,领先于,RW,RW,领先于,ZI,有相同的属性时,,CODE,在,DATA,之前放置。,更多的排序方法决定于:,输入的组名按字母排序,在,ARMLINK,命令行中指定的顺序。,eg,:,armlink,file1.o file2.o,A,section A,from file1.o,section A,from file2.o,在,SCATTOR,文件中的对象排序,为了把特定的,CODE,和,DATA,放在指定的地址上,你可以不考虑标准的放置规则,使用,+FIRST,和,+,LAST,,直接把第一个和最后一个对象放在可执行区。,图例:把,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,没有影响,链接器的标准放置规则仍然适用,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,*(,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 region,outside root region,一个,root,区是一个可执行区,它的加载地址等于执行地址。,Root,区要点,一个,root,区是一个可执行区,它的加载地址等于执行地址,.,每个,scatter,描述文件必须最少包含一个,root,区,并且最少要包含下列内容:,_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,区,在此之前的将被自动放置,Main,应用程序的入口点必须放在,root,区。,Error:L6203E:Entry point(0 x08000000)lies within non-root region EXE_FLASH.,Run-time,存储器管理,Semihosting,Support,ANSI C,Stack&,Heap,Setup,Stack&,Heap,Setup,ANSI C,C Library,User Code,Debug Agent,Target Hardware,Retarget,如何设置,stack,和,heap,来满足我们的目标存储器,?,我们已经通过执行,_u
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!