ARM中main[]函数前初始化代码.docVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM中__main()函数前的初始化代码 2007年08月09日 星期四 16:29正文 这次主要任务是移植uc/os到2410上,因为移植uc/os需要修改中断向量表,而原来2410上跑的是ppcboot,我对ppcboot不熟,感觉修改起来比较麻烦,所以打算用通用的2410简短的启动代码来进行启动;然后就是uc/os的移植了,因为2410是一款很流行的型号,所以很多人已经做过这些工作了,我于是就在www.uc/os-II.com上下了一个移植的源码,这样我的主要任务就是把启动代码和移植程序调通。 本来想写一个ADS1.2的编译环境,启动代码的过程等等总结,但看了truelyboy写的S3c2410软件调试总结(1)~(7),觉得我写的不会比他好,所以作罢,(大家可以看看trulyboy原帖,原帖: /dispbbs.asp?boardID=20ID=52020page=1,原帖名字是“S3c2410软件调试总结”),在这里对trulyboy文中没有提到的“不用__main()初始化运行环境”进行说明。 在ADS1.2中__main()作为c语言的入口函数,它主要做了以下工作: 1.把RO,RW从他们的加载域复制到他们的运行域中去(可以用在LINKER中设置RO=,RW=,来确定,也可以用scatter文件来定义) 2.初始化ZI域 3.跳到__rt_entry. 而库函数__rt_entry()会完成以下工作: 1.调用__rt_stackheap_init()设置stack和heap 2.调用__rt_lib_init()初始化相应的库函数, 3.调用main(),即是我们自己的应用程序了 4.调用exit()来处理main()函数的返回值 从上面我们可以看到__main()运行时库主要是初始化一些东西,然后跳到用户的main()中去,所以我们不用__main()函数初始化运行环境的时候,要自己编写相应的代码来完成相应的内容,下面以一个例子来说明。 为了完成RO,RW段的复制,和初始化ZI域,所以我们要以下代码, IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) IMPORT |Image$$RW$$Base| ; Base of RAM to initialize IMPORT |Image$$ZI$$Base| ; Base and limit of area IMPORT |Image$$ZI$$Limit| ; to zero initialize ldr r0,=|Image$$RO$$Limit| ; Get pointer to ROM data ldr r1,=|Image$$RW$$Base| ; and RAM copy ldr r3,=|Image$$ZI$$Base| ; Zero init base = top of initialized data cmp r0,r1 ; Check that they are different beq %F1 0 cmp r1,r3 ; Copy init data ldrcc r2,[r0],#4 strcc r2,[r1],#4 bcc %B0 1 ldr r1,=|Image$$ZI$$Limit| ; Top of zero init segment mov r2,#0 2 cmp r3,r1 ; Zero init strcc r2,[r3],#4 bcc %B2 以上是没有使用scatter文件,如果使用了scatter文件来映射地址,那Image$$RO$$Limit。 Image$$RW$$Base,Image$$ZI$$Base,Image$$ZI$$Limit这些符合就会失效,相应的我们可以用Image$$region_name$$ZI$$Base Image$$region_name$$ZI$$Limit等等来替换,同样可以完成以上功能, 紧接着

文档评论(0)

185****7617 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档