RH850 setup RAM初始化过程分析

        大家都知道,我们的变量,这里说的变量是指初始化或未初始化的全局变量,静态全局变量,初始化或未初始化的静态局部变量,这些变量的地址已经在编译器程序连接后固定,且在map表里可以查看到,分配于date段和未初始化的分配于bss段中,但这些变量的值在编译后以二进制文件存于ROM中,并在MCU setup时由ROM搬运到RAM中,那么变量是怎么由ROM搬到RAM的map地址处呢?RAM数据又是怎么初始化的呢?带着如上问题一起来分析一下

1,Bebug发现,reset后会将在setup时候会将整个RAM段清除

map中ram段开始地址如下

                  febd0000+000000 ___ghs_ramstart

map中ram段结束地址如下

                  febf0000+000000 ___ghs_ramend

首先将所有RAM数据清0,汇编代码如下,将 ghs_ramstart地址存于R6,将___ghs_ramend存于R7,将R6地址里面的数据清0,R7寄存器里面地址+8,比较R6,R7有没有到ramend处,如没有继续清除R6地址里面数据,如相等向下执行

2,ram清除完成后进入_start处开始执行,接下来执行至ghs_ind_crt0处

我们查看 build_v800.pdf,文档查看有关_start信息,描述和如上调试结果一致,接下来就是调用

调用ghs_borad_memory_init,初始化RAM

查看 build_v800.pd,ghs_board_memory_init 在ind_initmem.800中

代码如下

___ghs_board_memory_init:

        -- If the program is not built to boot from ROM, return
    MOV32(___ghs_romstart, r1)
    MOV32(___ghs_romend, r14)
    jarl    .L1,r5
.L1:
    cmp    r1,r5
    blt    return
    cmp    r14,r5
    bgt    return

map地址如下

         00020000+000000 ___ghs_romstar

         00200000+000000 ___ghs_romend

很可惜___ghs_board_memory_init实现在库中,无法看到,接下来程序跑到main时候,RAM已经初始化完成了,虽然没有看到RAM初始化过程,但梳理了一下大概过程,也是比较有意思的

  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值