请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1198|回复: 0
收起左侧

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

[复制链接]

3

主题

8

回帖

17

积分

新手上路

积分
17
发表于 2021-9-3 10:11:16 | 显示全部楼层 |阅读模式
平台:stm32F103ZET6
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 = 0x55;                vTaskDelay(10);        }}Copy


修改之后的结果:
3、原因分析
在一开始的串口打印过程中,因为延时不够,没有将所有的数据打印出来,同时,因为延时时间太少,导致在进入空闲线程之后,串口数据未打印未完成,并且产生溢出中断,导致直接进入硬件报错。
我不知道,我的原因分析的对不对求大神指点。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-16 12:37 , Processed in 0.174174 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表