CMSIS-RTOS和裸跑时栈的使用区别分析

最近使用CMSIS-RTOS(以下简称RTX)时遇到全局变量被意外更改的情况,检查代码没有发现有更改这个变量的情况,因此怀疑是栈溢出导致的,修改的是启动文件里的Stack_Size后问题解决,因此确定是栈溢出导致的。说明下,因为我维护的代码并不全部是自己写的,很多东西都是移植以前的代码,只是将以前的一套实时系统改为了RTX。以前的代码里有很多局部变量,而且定义的非常大,我怀疑就是在这些函数嵌套...
摘要由CSDN通过智能技术生成

最近使用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+&#
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值