ADS1.2启动分析

在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等等来替换,同样可以完成以上功能,
紧接着我们就可以用直接用“B  ”指令跳到我们自己的c程序中,完成我们想做的事。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值