1、开启方法:configCHECK_FOR_STACK_OVERFLOW==2 2、检测原理:在任务创建时,将任务栈所有的数据初始化为一个固定值0xa5,通过任务切换的时候,来判断栈底16个或20个字节是否都为0xa5,如果被修改过,会触发堆栈溢出钩子Hook函数。 方法2 比 方法 1要慢一些,但是对用户而言还是很快的。方法2能检测到几乎所有的堆栈...
#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )#definetaskCHECK_FOR_STACK_OVERFLOW() \{ \constuint32_t *constpulStack = ( uint32_t * ) pxCurrentTCB->pxStack; \constuint32_t ulCheckValue = ( uint32_t )0xa5a5a5a5; \ \if( ( pulStack[0] != ...
将FreeRTOSConfig.h里面的configCHECK_FOR_STACK_OVERFLOW设置为2. 随便一个文件里,加入 #include"task.h"voidvApplicationStackOverflowHook( TaskHandle_t xTask,char*pcTaskName ){LogInfo("task: %s\n", pcTaskName); }
如果宏configCHECK_FOR_STACK_OVERFLOW没有设置成0,用户必须提供一个栈溢出钩子函数,这个钩子函数的函数名和参数必须如下所示: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 voidvApplicationStackOverflowHook(TaskHandle_t xTask,signed char*pcTaskName); 参数xTask和pcTaskName为堆栈溢出任务的句柄和名字。
参考API这次先不看,先从堆栈溢出的角度看一下。开启这个功能需要配置configCHECK_FOR_STACK_OVERFLOW这个参数。如果这个参数不为0的时候,就要提供上面的hook函数。这里写得是不为0,不知道是非零有多种含义还是含义全都相同呢? 堆栈的检查功能肯定会增加上下文切换的负载率,因此推荐在开发和测试的时候使用,产品中这个...
可以通过 FreeRTOSConfig.h文件中定义configCHECK_FOR_STACK_OVERFLOW 宏来开启, 在任务切换时会自动执行检测栈溢出操作。 两种堆栈溢出检测方法: 方法一 开启方法:#define configCHECK_FOR_STACK_OVERFLOW 1 检测原理:通过在任务切换时,检测栈顶指针和栈起始指针,或者帧顶指针和栈结束指针是否越界,如果越界,在任务切...
将configCHECK_FOR_STACK_OVERFLOW设为2就可以选用方法2。方法2在方法 1 的基础上进行了一些补充。 当创建任务时,任务栈空间中就预置了一个标记。方法2会检查任务栈的最后20个字节的数据,查看预置在这里的标记数据是否被覆盖。如果最后20 个字节的标记数据与预设值不同,则栈溢出钩子函数就会被调用。
#define configCHECK_FOR_STACK_OVERFLOW 1 任务创建的时候将任务栈所有数据初始化为 0xa5,任务切换时进行任务栈检测的时候会检测末尾的 16 个字节是否都是 0xa5,通过这种方式来检测任务栈是否溢出了。相比方法一,这种方法的速度稍慢些,但是这样就有效地避免了方法一里面的部分情况。不过依然不能保证所有的栈溢出都...
#define configCHECK_FOR_STACK_OVERFLOW 1 b. 在任务切换时检测任务栈指针是否过界了,如果过界...
4 configCHECK_FOR_STACK_OVERFLOW FreeRTOS 的栈溢出检测支持两种方法,称之为方法一和方法二。 ◆ 配置为 2 :栈溢出检测使用方法二 ◆ 配置为 1 :栈溢出检测使用方法一 ◆ 配置为 0 :禁止栈溢出检测 任务运行信息获取配置: 1 configGENERATE_RUN_TIME_STATS ...