上海交大ARM培训教材ARM嵌入式软件开发.pptVIP

上海交大ARM培训教材ARM嵌入式软件开发.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
object1 entry library entry object2 entry exec image entry which entry point to use? 扩展功能 系统初始化代码通常在进入主应用之前运行 当然,reset handler 不是一个适合使能中断和使能caches地方。 在reset handler最后应该放一个C运行库初始化代码 EG。 IMPORT __main B __main 我们可使用$Sub和$Super功能来包装符号 extern void $Super$$main(void); void $Sub$$main(void) { cache_enable(); // enables caches int_enable(); // enables interrupts sys_to_usr_mode(); // change mode - see next slide $Super$$main(); // calls original main() } 相关描述可在ADS 1.2 Linker and Utilities Guide - 4.4章查阅到。 运行模式考虑 主应用程序运行在何种模式是要考虑的重要问题。 用户模式(User mode)是非特权模式(unprivileged mode)-保护你的系统 系统初始化代码只能运行在特权模式(privileged mode)。 需要执行特权操作 比如:使能中断。 如果你的应用要运行在管理模式,简单的在管理模式下退出你的reset handler 就可。 如果你想在用户模式下运行你的应用,你需在$Sub$$main( )改变为用户模式 当然, __user_initial_stackheap( ) 必须有权使用你的应用模式寄存器。 解决办法是在系统模式里退出reset handler 所有C库初始化代码有权使用用户寄存器,但是仍然可以执行特权操作。 Agenda 一个PC软件的构造 裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE 长跳转Veneers ROM_LOAD 0x0000 { ROM_EXEC 0x0000 { * (+RO) } RAM 0 { farfunc.o (+RO) * (+RW,+ZI) } } /* main.c */ int main(void) { farfunc(); } /* farfunc.c */ void farfunc(void); { : } 代码段可被远距离分开放置 (比BL的跳转范围还远) 链接器可自动增加长跳转Veneers,远距离的函数可被成功调用。 0 bl Ven$AA$L$$farfunc : : Ven$AA$L$$farfunc ldr pc,[pc,#-4] dcd 0 : : 0: mov pc,lr 存储器映射寄存器 你可以使用scatterloading来放置外设寄存器的存储器映射 在文件中定义它 e.g. timer_reg.c struct { volatile unsigned reg1; /* timer control */ volatile unsigned reg2; /* timer value */ } timer_reg; 在存储器映射的请求地址上增加另外的可执行区来放置他们: LOAD_FLASH 00 { : TIMER 0UNINIT { timer_reg.o (+ZI) } : } UNINIT 显示在 ZI 段没有被初始化为0。 Stack 和 Heap 区(1) 你也可以在SCATTER文件中放置stack和heap 在汇编原文件里定义stack 和heap 区 比如. stackheap.s 这个空间直接保留一个为0的存储器块 AREA stack, DATA, NOINIT SPACE 0x3000 ; Reserve stack space AREA heap, DATA, NOINIT SPACE 0x3000 ; Reserve he

文档评论(0)

kfcel5889 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档