一、前言
目前,通用的做法,STM32的Flash分成两块App,一个BootLoader,一个应用App。
二、原因
因为,两个App是两个工程编译而成的,虽然Flash的地址划分开了,但是内存RAM没有分开。所以会导致某些问题。
看map文件就知道了。
三、问题
App中定义的全局变量,通常刚上电后,如果没有对其赋值,全局变量一般是0,全局指针一般是NULL。
假如,A应用的全局变量a在0x20000004的地址,B应用的全局变量的b也在0x20000004的地址。
A应用先启动,经过一番运行,a变量被赋值成了10。然后跳转到B应用,这是B应用的b也的值也成了10,而不是一般情况下的0。
我们普通惯性思维是全局变量如果未赋值一般是0,局部变量才会随机。这样就会导致其他异常问题。
四、处理
方法1 内存划分开
不推荐,因为本身内存就不多,再划分根本不够用。
方法2 初始化前做memset清零
不推荐,程序最开头,memset(0x20000000,0,0x1000);
简单粗暴,但是也容易把一些不该清零的变量清零了。
方法3 逐个对变量清零
推荐,虽然麻烦,胜在稳妥。
如果有些不方便的,直接弄成const。如下
char *const at_version= "AT+VERSION?\r\n";
char *const at_pwr= "AT+PWR\r\n";
const uint8_t ostd_promt_start_cmd[]={0x02,0x10,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x73,0x60};
const uint8_t ostd_promt_start_ack[]={0x02,0x10,0x00,0x00,0x00,0x01,0x01,0xfa};
const uint8_t ostd_promt_start_cmd_len = sizeof(ostd_promt_start_cmd)/sizeof(uint8_t);
const uint8_t ostd_promt_start_ack_len = sizeof(ostd_promt_start_ack)/sizeof(uint8_t);
五、其他
本文评论底下有些网友说,遇到这个问题,
跳转前在IAP中关中断,跳转后在APP中开中断
做一次软重启就行了
这些都没有用,不是一个问题。
- IAP关中断是一定要关的,但是不为了解决内存重叠问题
- 软重启就更没用了。硬重启都不顶用。