最近使用CMSIS-RTOS(以下简称RTX)时遇到全局变量被意外更改的情况,检查代码没有发现有更改这个变量的情况,因此怀疑是栈溢出导致的,修改的是启动文件里的Stack_Size后问题解决,因此确定是栈溢出导致的。
说明下,因为我维护的代码并不全部是自己写的,很多东西都是移植以前的代码,只是将以前的一套实时系统改为了RTX。以前的代码里有很多局部变量,而且定义的非常大,我怀疑就是在这些函数嵌套是导致栈溢出。因此我决定修改以前的代码,把比较大的局部变量修改为全局变量。
为了验证自己的想法,我还是决定做个测试模拟我遇到的问题。
首先我复制了一份正点原子的跑马灯工程,将配置修改为自己的测试板,用这个工程来验证栈溢出问题。
我的思路是先在第一个函数func1里定义一个大的数组,值全部设置位0xA5。然后循环调用这个函数,并在这个函数里调用另一个函数func2,这个函数里检查栈底位置是否为0,如果被改写,说明栈用完甚至溢出了。
#define STACK_DEFAULT_VALUE 0xA5A5A5A5
static u32 stack_addr = 0x20000348; //通过查询MAP文件得到栈底地址
#define BUFF_SIZE 200
static void func2(void)
{
if( *((u32*)(stack_addr)) != 0) //断点2
{
LED = 0;
delayMS(100);
LED = 1;
delayMS(100);
}
}
//1 函数内部定义大数组
static void func1(void)
{
u16 i;
u32 test_buff[BUFF_SIZE];
for(i = 0; i < BUFF_SIZE; i+&#