STM32两个APP跳转间,内存的重叠,冲突和影响

STM32两个APP跳转间,内存的重叠,冲突和影响

前言

目前,通用的做法,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);

你可能感兴趣的:(物联网)