历史上的今天
今天是:2025年01月08日(星期三)
2020年01月08日 | bootloader中关于flash擦除写和ram初始化的有关问题
2020-01-08 来源:eefocus
最近在做飞思卡尔16位单片机的在线升级bootloader程序。有2个问题不太清楚,请教下论坛里的高人。
1.bootloader程序中,对存放应用程序的flash空间进行擦除和写入新的应用程序以完成升级。比较特别的是,需要将flash操作代码拷贝到ram中执行,这是为什么?bootloader程序所在flash空间设置为被保护状态,不会误擦除,而且运行到哪个函数自然会把函数压栈到RAM里执行吧?为什么还要特地拷贝到RAM里呢?
2.单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?每次程序都是从bootloader的main函数开始执行,确定不是升级状态后跳转到应用程序重映射的reset中断向量地址(flash地址)执行。bootloader和应用程序中有些全局变量分配的ram重合了,有什么影响吗?会在跳转后重新初始化RAM吗?
哪位大侠帮帮忙,先行谢过!!
------解决方案--------------------
每个运行时态应该都有自己的startup,进行本运行时态所必须的初始化工作,包括块定位搬移、ZI等等。一般都可以在相应的配置文件中进行指定的。
16位的不太熟,CF的通过MEM CFG配置配置就行。
------解决方案--------------------
我们用的Freescale的9s12g128做的bootloader,通讯和诊断协议用的ISO15765-3,不知道你用的自定义通讯协议还是什么?
(1) Flash操作的那部分,也就是Flash的读写驱动程序是必须放到RAM中执行,原因是当进行Flash擦写时,Flash中的程序就不可以被执行了,这是硬件的限制。这是Freescale单片机的情况,我不清楚其它单片机会不会有这个限制。
你说的“运行到哪个函数自然会把函数压栈到RAM里执行吧”,不可能把函数压到堆栈里面的,只是在函数调用和函数被中断打断,一些寄存器和一些局部变量等会被压倒堆栈里面。默认情况下,16位freescale单片机在prm中配置的堆栈大小是0x100字节,很多函数都要比它大。
(2)"单片机上电初始化后,RAM存储初始化全局变量,这些全局变量是从调试器烧进去的S19文件中获取的吗?" 这是个很好的问题,全局变量和静态变量的初始化值是保存在Flash中的Const段里的,新建一个工程的时候默认有个startup的汇编程序文件,它负责将const段中的初始值付给这些全部变量。这些事情是发生在你的main函数之前的。
(3)"bootloader和应用程序中有些全局变量分配的ram重合了,有什么影响吗?",没有影响,bootloader和你的应用程序是分时复用RAM的,上电程序就跑到bootloader,如果有合法的应用程序就跑到应用程序,应用程序里面会再次初始化变量的,也就是上面2说到的。
------解决方案--------------------
flash不能同时读写,所以升级程序的时候要把程序拷贝到ram,防止写flash的过程中因为“读”程序而访问到flash
第二个问题属于编译原理方面的,数据初始化是在main之前的,如果你直接跳转到main,那就不会初始化。如果你是跳转到app程序烧写的位置(一般都是这样),那自然会再初始化一次。
而且,变量是否初始化也不是绝对的,有的编译器对未赋值的变量是不做初始化的
楼主不如自己写个程序验证下就知道了。这种问题,自己动手验证远比问人能学到更多。
------解决方案--------------------
探讨
liangboone君,还有个地方没弄明白,请教下。
“全局变量和静态变量的初始化值是保存在Flash中的Const段里的”:
这个const段的起始地址和内容也是在s19文件里的吧。可是bootloader的s19文件和应用的s19文件,要手动合成一个s19文件后烧入mcu的flash里,其中应用的s19文件只把中断向量表的地址重映射了,const段地址应该没有变动,这样const段不会……
史海拾趣
|
基于最新款飞思卡尔片子(MC9S08AC32)的实际应用代码 如题所说. 对于想使用这款飞思卡尔芯片,MC9S08AC32,FLASH有32K的同志位来说,我认为这个片子做得不错了,你们可以试着尝试一下,飞思卡尔是俺使用过的代码中,我觉得相对来说,抗干扰性较强的一款片子. 这里有一些代码,可以帮你迅速入门,迅速走入开发.… 查看全部问答> |
|
8255引脚电平变化无法读取 #define PA8255 (*((unsigned char xdata *)0x1fff))//总线地址 #define PB8255 (*((unsigned char xdata *)0x3fff))//总线地址用16位表示 p0是低八位 p2是高八位 #define PC8255 (*((unsigned char xdat ...… 查看全部问答> |
|
如题。 我自己定制了一个PB,编译好了后,把SDK导出了,但是这个SDK是要安装在VS2005的安装目录下吗??(我用的开发 工具是VS2005,但是是第一次使用)安装完了SDK,在启动VS2005,新建工程时,需要对它进行选择吗????… 查看全部问答> |
|
[交换]我有MSP430 Value Line LaunchPad +Capacitive Touch BoosterPack 我有MSP430 Value Line LaunchPad +Capacitive Touch BoosterPack全新套件想交换个JLINK仿真器,有意者站内联系。 MSP430 LaunchPad+Capacitive Touch BoosterPack 超值系列开发套件 详细见TI官网: http://e2e.ti.com/group/msp430launchpad/b/ ...… 查看全部问答> |
|
Getting Started with the MSP430 LaunchPad_Student Guide and Lab Manual 内容和大课堂的内容差不多,只不过是英文的。 大家看看!… 查看全部问答> |




