keil中定义全局变量时赋初值,这样会不会以后每次重新上电变量的值一样?

2019-03-24 16:56发布

keil中定义全局变量时赋初值,这样会不会以后每次重新上电变量的值一样?如果一样?为什么?谢谢了!
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
BasaraTama
2019-03-26 06:29
本帖最后由 BasaraTama 于 2018-11-26 22:42 编辑

一般arm程序默认包含Code段,RW段,ZI段;
RW段是初始化的全局变量;
ZI段是未初始化的全局变量;其初始值为0,所以可以不占据rom空间,直接对ram清0即可,也就不会影响编译器输出的bin/hex可执行文件大小。
RW段和ZI段以及堆栈的初始化需要在main函数执行前完成。
可以看看crt0.o,startup.s里做了哪些操作。
一般你可以看到在crt0.o,startup.s代码里调用了main函数,在main执行前还有memcpy(搬运加载空间rom中全局变量的初始值到执行空间ram中)和memset(对未初始化化的全局变量所在的执行空间ram清零)操作。上述的段地址以及空间地址可由链接器的链接脚本描述。

建议看看编译器原理/程序员的自我修养。

一周热门 更多>