关于FreeRTOS堆栈溢出检测的几个问题
平台:stm32F103ZET6源码下载:关于FreeRTOS堆栈溢出检测的几个问题-星球号-电源网 (dianyuan.com)1、问题:在移植、使用安富莱的FreeRTOS堆栈溢出检测例程的过程中,出现如下情况https://eestar-public.oss-cn-shenzhen.aliyuncs.com/article/image/20210903/7ce82a119ede97105c58d16a064ee298.jpg串口数据并没有打印完成,直接进入了硬件报错。同时在仿真过程中,溢出检测的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, 低地址 是buf。如果任务栈溢出了,也是从高地址buf到buf的某个地址开始溢出。 因此,如果用户直接修改的是buf开始的数据且这些溢出部分的数据比较重要,会直接导致 进入到硬件异常。 2. 栈溢出检测是在任务切换的时候执行的,我们这里加个延迟函数,防止修改了重要的数据导致直接 进入硬件异常。 3. 任务vTaskTaskUserIF的栈空间大小是2048字节,在此任务的入口已经申请了栈空间大小 ------uint8_t ucKeyCode; ------uint8_t pcWriteBuffer; 这里再申请如下这么大的栈空间 -------int16_t i; -------uint8_t buf; 必定溢出。 */ for(i = 2047; i >= 0; i--) { buf = 0x55; vTaskDelay(10); }}Copy修改之后的结果:https://eestar-public.oss-cn-shenzhen.aliyuncs.com/article/image/20210903/58c1d942360ba10650bea8c8fd769ce4.jpg3、原因分析在一开始的串口打印过程中,因为延时不够,没有将所有的数据打印出来,同时,因为延时时间太少,导致在进入空闲线程之后,串口数据未打印未完成,并且产生溢出中断,导致直接进入硬件报错。我不知道,我的原因分析的对不对求大神指点。
页:
[1]