加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 19:49:51 所属栏目:百科 来源:网络整理
导读:liangboone君,还有个地方没弄明白,请教下。 “全局变量和静态变量的初始化值是保存在Flash中的Const段里的”: 这个const段的起始地址和内容也是在s19文件里的吧。可是bootloader的s19文件和应用的s19文件,要手动合成一个s19文件后烧入mcu的flash里,其中
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程序烧写的位置(一般都是这样),那自然会再初始化一次。
而且,变量是否初始化也不是绝对的,有的编译器对未赋值的变量是不做初始化的
楼主不如自己写个程序验证下就知道了。这种问题,自己动手验证远比问人能学到更多。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读