3 configUSE_TICK_HOOK ◆ 配置为 1 :使能滴答定时器中断里面执行的钩子函数 ◆ 配置为 0 :禁能滴答定时器中断里面执行的钩子函数 4 configCHECK_FOR_STACK_OVERFLOW FreeRTOS 的栈溢出检测支持两种方法,称之为方法一和方法二。 ◆ 配置为 2 :栈溢出检测使用方法二 ◆ 配置为 1 :栈溢出检测使用方法一 ◆ ...
1、开启方法:configCHECK_FOR_STACK_OVERFLOW==2 2、检测原理:在任务创建时,将任务栈所有的数据初始化为一个固定值0xa5,通过任务切换的时候,来判断栈底16个或20个字节是否都为0xa5,如果被修改过,会触发堆栈溢出钩子Hook函数。 方法2 比 方法 1要慢一些,但是对用户而言还是很快的。方法2能检测到几乎所有的堆栈...
使用堆栈溢出检测方法1,是不断的检测任务堆栈指针是否指向有效空间当configCHECK_FOR_STACK_OVERFLOW=2时...
前面刚刚出现的疑问在这里接着找到了答案,configCHECK_FOR_STACK_OVERFLOW的配置不同的数值是有不同含义的。从上面的信息,结合FreeRTOS可以提供两种堆栈检查方法可以知道这个参数可以有3种数值选择。结合下面的信息,参数值可以是0、1、2。 回到针对第一个方法的梳理。堆栈的检查一般是在OS完成了上下文切换之后,因为这个...
configUSE_TICK_HOOK0#define configCHECK_FOR_STACK_OVERFLOW0#define configUSE_MALLOC_FAILED_HOOK0/*Run time and task stats gathering related definitions. */#define configGENERATE_RUN_TIME_STATS0#define configUSE_TRACE_FACILITY0#define configUSE_STATS_FORMATTING_FUNCTIONS0/*Co-routine related ...
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 检测原理:通过在任务切换时,检测栈顶指针和栈起始指针,或者帧顶指针和栈结束指针是否越界,如果越界,在任务切...
#define configCHECK_FOR_STACK_OVERFLOW 1 ◆ 方法二任务创建的时候将任务栈所有数据初始化为 0xa5,任务切换时进行任务栈检测的时候会检测末尾的 16 个字节是否都是 0xa5,通过这种方式来检测任务栈是否溢出了。 相比方法一,这种方法的速度稍慢些,但是这样就有效地避免了方法一里面的部分情况。不过依然不能保证所有...
2.3 configCHECK_FOR_STACK_OVERFLOW 堆栈溢出检测。堆栈的大小是从任务创建时就已经定义完成的。如果定义了堆栈溢出检测,用户必须定义一个钩子函数(回调函数)当堆栈溢出时,就会调用该函数。函数原型: void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName ); ...