datasheet

Silicon Labs 芯科科技

文章数:539 被阅读:71150

账号入驻

应用Micrium OS内核红区功能检测任务堆栈溢出

2018-12-13
    阅读数:

本篇博文主要在介绍在调试Micrium OS应用程序时检测任务堆栈溢出的简单方法,欢迎点击阅读原文访问Silicon Labs(亦称芯科科技)中文社区参考应用。


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/

 

全系列Micrium OS设计应用教学博文,请访问:https://www.silabs.com/search?q=Micrium;page=1

 

您也可以扫描以下二维码,关注Silicon Labs社交媒体平台



About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved