LPC23XX的程序移植.docVIP

  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文档。上传文档
查看更多
关于LPC24XX的程序移植 ??????? 近来单片机升级了,一下子进入32位时代,有点措手不及!还好,网络互相的现代,工程师不必从头开始,充分利用网络资源,加快开发进程。由于以前一直使用KEIL开发51单片机,使用方便,便于调试仿真。值得庆幸的是现在ARM型单片机也可以在KEIL中调试。可是网上大部分ARM实例是基于ADS的。直接移植过来就会一警告和错误。 ? 为了加快开发进程,还是选择移植借鉴部分实用例程。具体解决问题方法如下: 新推出的KEIL版开发工具RVMDK与老版ADS在工具架构组成上有以下不同:ARM编译器版本、调试器、软件仿真、以及调试单元。 ?? 出现如下提示: USBdma.h(128): warning:? #1-D: last line of file ends without a newline compiling USBDriver.c... USBHAL.h(40): warning:? #1-D: last line of file ends without a newline USBdma.h(128): warning:? #1-D: last line of file ends without a newline 提示:文件结束了但没有空行这个警告, 这是由RVMDK编译器产生的警告,所有程序文件最后一行必须有空行,也可不去理它。在提示处按一下回车就行了。 ?? Startup.s(214): warning: A1608W: MOV pc,rn instruction used, but BX rn is preferred Startup.s(258): warning: A1608W: MOV pc,rn instruction used, but BX rn is preferred 由于编译器版本的变化,对应的编译选项也有所变化。将options for target中asm标签页里面的Eenable ARM/Thumb interworking复选框去掉,就不产生这样的告警信息啦,不过不知道这样做会影响什么! 也可以根据提示改为BX跳转。如果您的程序中存在ARM/Thumb指令相互调用的情况,那么使用BX指令能够返回到正确的处理器状态。而使用MOV指令则不能实现处理器状态的切换。所以keil编译器建议您使用BX指令。例如把MOV ?PC, LR 改为BX ?LR ?。 fio_release.axf: Error: L6238E: startup.o(vectors) contains invalid call from ~PRES8 function to REQ8 function FIQ_Exception. fio_release.axf: Error: L6238E: startup.o(vectors) contains invalid call from ~PRES8 function to REQ8 function TargetResetInit. 这是由于对目标文件进行链接时,ARM工具的连接器会严格检查各个文件(objects),判断它们是否复合ARM体系结构的ABI表准。由于RVCT与ADS编译链接工具所遵循的ARM ABI不同,所以将ADS的遗留工程直接移植到RVMDK并进行连接时,用户可能会遇到错误或者警告:新工具的ABI要求在函数调用时,系统必须保证堆栈指针8byte对齐,即每次进栈或者出栈的寄存器数目必须为偶数。这是为了能够更加高效的使用STM与LDR指令对“double”或者“long long”类型的数据进行访问。而老的ARM开发工具ADS并没有考虑到新的ARM内核架构,其ABI对于堆栈的操作仅仅要求4byte对齐。所以当用户将在ADS中编译连接成功的工程代码移植到RVMDK上,或者将老的、ADS遗留的目标文件、库文件在新工具RVMDK中进行连接时,RVMDK的连接器就会报出以上的错误。 解决方法如下: 在每个汇编文件的开头,添加“PRESERVE8”指令。 ? ??? AREA??? vectors,CODE,READONLY之前加?? PRESERVE8。 如下: ???????? AREA ???vectors,CODE,READONLY??????? ???????? 改为: ?? PRESERVE8 ? AREA ???vectors,CODE,READONLY 检查汇编源码中的指令,确保堆栈操作指令是8byte对其的。ADS的遗留代码一次性将5个寄存器压栈,由于ARM的指令寄存器宽度为32位,即4byte,显然5个寄存器入栈之后,堆栈指针不能够满足64位,8byte对齐。为了解决这种情况,我们可以将另外一个并不需要压栈的寄存器

文档评论(0)

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

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

1亿VIP精品文档

相关文档