关于FreeRTOS堆栈溢出检测的几个问题

1、问题:

在移植、使用安富莱的FreeRTOS堆栈溢出检测例程的过程中,出现如下情况

串口数据并没有打印完成,直接进入了硬件报错。同时在仿真过程中,溢出检测的vApplicationStackOverflowHook也没有进入。

2、解决方案:

通过修改vTaskDelay(1);改成vTaskDelay(10);之后,串口数据会全部打印,并且进入vApplicationStackOverflowHook。

/*
*********************************************************************************************************
*	函 数 名: StackOverflowTest
*	功能说明: 任务栈溢出测试
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
static void StackOverflowTest(void)
{
	int16_t i;
	uint8_t buf[2048];
	
	(void)buf; /* 防止警告 */
	
	/*
	  1. 为了能够模拟任务栈溢出,并触发任务栈溢出函数,这里强烈建议使用数组的时候逆着赋值。
	     因为对于M3和M4内核的MCU,堆栈生长方向是向下生长的满栈。即高地址是buf[2047], 低地址
	     是buf[0]。如果任务栈溢出了,也是从高地址buf[2047]到buf[0]的某个地址开始溢出。
	        因此,如果用户直接修改的是buf[0]开始的数据且这些溢出部分的数据比较重要,会直接导致
	     进入到硬件异常。
	  2. 栈溢出检测是在任务切换的时候执行的,我们这里加个延迟函数,防止修改了重要的数据导致直接
	     进入硬件异常。
	  3. 任务vTaskTaskUserIF的栈空间大小是2048字节,在此任务的入口已经申请了栈空间大小
		 ------uint8_t ucKeyCode;
	     ------uint8_t pcWriteBuffer[500];
	     这里再申请如下这么大的栈空间
	     -------int16_t i;
		 -------uint8_t buf[2048];
	     必定溢出。
	*/
	for(i = 2047; i >= 0; i--)
	{
		buf[i] = 0x55;
		vTaskDelay(10);
	}
}

修改之后的结果:

3、原因分析

在一开始的串口打印过程中,因为延时不够,没有将所有的数据打印出来,同时,因为延时时间太少,导致在进入空闲线程之后,串口数据未打印未完成,并且产生溢出中断,导致直接进入硬件报错。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
本篇所含全部资料,点击此处留下邮箱我会发给你
资料明细:STM32F103-内存溢出检测.zip
觉得内容不错的朋友,别忘了一键三连哦!
赞 1
收藏 1
关注 9
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧