Micrium OS内核红区
内核的红色区域为功能区域,当通过os_cfg.h中的OS_CFG_TASK_STK_REDZONE_EN启用时,会在任务堆栈的末尾创建一个受监视区域。用户可以通过os_cfg.h中的#define OS_CFG_TASK_STK_REDZONE_DEPTH配置红色区域的长度。默认情况下,它被设置为8个堆栈元素(CPU_STK)。
启用红色区域后,每次在任务级别或中断级别切换任务时,内核都会检查红色区域是否已被命中。默认情况下,使用ARMv7m端口中的CPU_SW_EXCEPTION宏会引发软件异常。但是,如果您希望在红色区域被命中时更好地控制应用程序应该执行的操作,则可以通过在os_cfg.h中将OS_CFG_APP_HOOKS_EN设置为DEF_ENABLED来打开应用程序挂钩。
使用红区应用程序挂钩
如果您希望在任务到达红色区域而不是抛出软件异常的情况下应用程序确定应该怎么做,那么必须定义一个钩子函数来执行此操作。
一个简单的例子:
static void RedzoneHitHook (OS_TCB *p_tcb)
{
BSP_LedSet(0);
while(1);
}
有了这个,您可以看到,如果您见到LED0永久打开并且您的代码被困在while循环,那么您已经达到红色区域。紧接着,您可以在局部变量面板中检查p_tcp-> NamePtr,并找到达到限制的任务。
请不要忘记将红区的点击钩子指针赋值给自定义函数。
以上例子说明:
OS_AppRedzoneHitHookPtr =RedzoneHitHook;
确保在调用OSStart()之前添加它,否则指针永远不会分配给您的应用程序挂钩。
有关检测堆栈溢出和红色区域的更多详细信息,请访问以下链接:
https://www.micrium.com/detecting-stack-overflows-part-2-of-2