调试Micrium OS应用程序时检测任务堆栈溢出的简单方法

21 篇文章 2 订阅
7 篇文章 0 订阅

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值