2019-03-24 16:56发布
ena 发表于 2018-11-21 15:55 哦!那么没有赋初值的变量存放在哪里? 实际编译的时候,增加或减少变量并不会影响到code的大小。那么下 ...
最多设置5个标签!
看你的数据类型是什么样子,默认是内存 code 指定在rom区分配,不能写 xdata在扩展外存 pdata在分页外存 ...
你看看51扩展关键字就知道了.
keil在初始化会清0所有的内存数据,这段在建工程时的那段汇编里
如果不执行这段初始化清0,而且是软件复位,那么是原来的值.
一般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清零)操作。上述的段地址以及空间地址可由链接器的链接脚本描述。
建议看看编译器原理/程序员的自我修养。
一周热门 更多>