赞
踩
大家都知道,我们的变量,这里说的变量是指初始化或未初始化的全局变量,静态全局变量,初始化或未初始化的静态局部变量,这些变量的地址已经在编译器程序连接后固定,且在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初始化过程,但梳理了一下大概过程,也是比较有意思的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。