1、开启方法:configCHECK_FOR_STACK_OVERFLOW==2 2、检测原理:在任务创建时,将任务栈所有的数据初始化为一个固定值0xa5,通过任务切换的时候,来判断栈底16个或20个字节是否都为0xa5,如果被修改过,会触发堆栈溢出钩子Hook函数。 方法2 比 方法 1要慢一些,但是对用户而言还是很快的。方法2能检测
如果宏configCHECK_FOR_STACK_OVERFLOW没有设置成0,用户必须提供一个栈溢出钩子函数,这个钩子函数的函数名和参数必须如下所示: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 voidvApplicationStackOverflowHook(TaskHandle_t xTask,signed char*pcTaskName); 参数xTask和pcTaskName为堆栈溢出任务的句柄和名字。
3 configUSE_TICK_HOOK ◆ 配置为 1 :使能滴答定时器中断里面执行的钩子函数 ◆ 配置为 0 :禁能滴答定时器中断里面执行的钩子函数 4 configCHECK_FOR_STACK_OVERFLOW FreeRTOS 的栈溢出检测支持两种方法,称之为方法一和方法二。 ◆ 配置为 2 :栈溢出检测使用方法二 ◆ 配置为 1 :栈溢出检测使用方法一 ◆ ...
使用堆栈溢出检测方法1,是不断的检测任务堆栈指针是否指向有效空间当configCHECK_FOR_STACK_OVERFLOW=2时...
参考API这次先不看,先从堆栈溢出的角度看一下。开启这个功能需要配置configCHECK_FOR_STACK_OVERFLOW这个参数。如果这个参数不为0的时候,就要提供上面的hook函数。这里写得是不为0,不知道是非零有多种含义还是含义全都相同呢? 堆栈的检查功能肯定会增加上下文切换的负载率,因此推荐在开发和测试的时候使用,产品中这个...
版本:9.0 在TCB_t结构体中,有pxEndOfStack。默认用0xa5填充栈空间。如果configCHECK_FOR_STACK_OVERFLOW=1,将比较当前栈顶指针与pxEndOfStack,超出执行hook:vApplicationStackOverflowHook如果configC
FreeRTOSConfig.h文件中配置宏定义: 1 2 #define configCHECK_FOR_STACK_OVERFLOW 2 #define INCLUDE_uxTaskGetStackHighWaterMark 1 在任务切换时检测任务栈指针是否过界了,如果过界了,在任务切换的时候会触发栈溢出钩子函数。 1 voidvApplicationStackOverflowHook( TaskHandle_t xTask,signedchar*pcTaskName ); ...
将configCHECK_FOR_STACK_OVERFLOW设为2就可以选用方法2。方法2在方法 1 的基础上进行了一些补充。 当创建任务时,任务栈空间中就预置了一个标记。方法2会检查任务栈的最后20个字节的数据,查看预置在这里的标记数据是否被覆盖。如果最后20 个字节的标记数据与预设值不同,则栈溢出钩子函数就会被调用。
可以通过 FreeRTOSConfig.h文件中定义configCHECK_FOR_STACK_OVERFLOW 宏来开启, 在任务切换时会自动执行检测栈溢出操作。 两种堆栈溢出检测方法: 方法一 开启方法:#define configCHECK_FOR_STACK_OVERFLOW 1 检测原理:通过在任务切换时,检测栈顶指针和栈起始指针,或者帧顶指针和栈结束指针是否越界,如果越界,在任务切...
使用方法一需要用户在 FreeRTOSConfig.h 文件中配置如下宏定义: #define configCHECK_FOR_STACK_OVERFLOW 1 任务创建的时候将任务栈所有数据初始化为 0xa5,任务切换时进行任务栈检测的时候会检测末尾的 16 个字节是否都是 0xa5,通过这种方式来检测任务栈是否溢出了。相比方法一,这种方法的速度稍慢些,但是这样就有效...