×
嵌入式 > 技术百科 > 详情

bootloader中关于flash擦除写和ram初始化的问题

发布时间:2020-05-29 发布时间:
|
liangboone君,还有个地方没弄明白,请教下。

“全局变量和静态变量的初始化值是保存在Flash中的Const段里的”:
这个const段的起始地址和内容也是在s19文件里的吧。可是bootloader的s19文件和应用的s19文件,要手动合成一个s19文件后烧入mcu的flash里,其中应用的s19文件只把中断向量表的地址重映射了,const段地址应该没有变动,这样const段不会重叠吗?boot或者app程序调用Startup函数的时候会不会把boot和app的全局变量、动态变量都复制到ram?

(1) bootlaoder的需要初始化值对应的const段和application的不在一个地方。在prm里面进行段配置的时候,把bootloader分在0x4000-0x8000,和其他的分页的Flash中;Bootloader是放在0xC000-0xFF00这样的区间内。所以两者合成一个s19文件后也是不重合的。

(2) 在Bootlaoder里面的时候,只是初始化bootloader用到的全局变量,在app的时候,只初始化app的变量。


(3) 正如skylkj所说,并不是所有的全局变量和局部变量都会被初始化,比如,也可以定义NON_INIT的RAM段,这些变量是不会初始化的。另外,初始化的代码startup是IDE提供的,你也可以不用,自己写都是可以的。我所说的全局变量和静态变量会被初始化是Codewarrior在默认情况下的结果。


flash不能同时读写,所以升级程序的时候要把程序拷贝到ram,防止写flash的过程中因为“读”程序而访问到flash

第二个问题属于编译原理方面的,数据初始化是在main之前的,如果你直接跳转到main,那就不会初始化。如果你是跳转到app程序烧写的位置(一般都是这样),那自然会再初始化一次。

而且,变量是否初始化也不是绝对的,有的编译器对未赋值的变量是不做初始化的楼主不如自己写个程序验证下就知道了。这种问题,自己动手验证远比问人能学到更多。


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分拣机器人的工作原理是什么