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

2019-03-24 16:56发布

keil中定义全局变量时赋初值,这样会不会以后每次重新上电变量的值一样?如果一样?为什么?谢谢了!
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
Li_Lei
1楼-- · 2019-03-25 18:16
本帖最后由 huo_hu 于 2018-11-21 16:17 编辑
ena 发表于 2018-11-21 15:55
哦!那么没有赋初值的变量存放在哪里?
实际编译的时候,增加或减少变量并不会影响到code的大小。那么下 ...

看你的数据类型是什么样子,默认是内存 code 指定在rom区分配,不能写 xdata在扩展外存 pdata在分页外存 ...
你看看51扩展关键字就知道了.

keil在初始化会清0所有的内存数据,这段在建工程时的那段汇编里
如果不执行这段初始化清0,而且是软件复位,那么是原来的值.
liushiming82
2楼-- · 2019-03-25 20:40
除非你保存在E2中的数据不会丢掉,其他的数据重新上电,数据的值不确定,所以最好每个变量都初始化一下
ena
3楼-- · 2019-03-26 01:16
 精彩回答 2  元偷偷看……
BasaraTama
4楼-- · 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清零)操作。上述的段地址以及空间地址可由链接器的链接脚本描述。

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

一周热门 更多>