打印

使用MDK调试uc/OS-II显示任务栈使用情况的代码。

[复制链接]
1947|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
i55|  楼主 | 2012-2-6 18:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
MDK是个封闭的IDE,不支持别人的RTOS,这样使用uc/OS-II无法显示任务栈使用情况,相比IAR就成了一个很**肋的开发工具,但是你可以在程序里面自己添加任务栈检查程序,如下所述:

static  void  AppTaskStacks (void *p_arg)
{
    CPU_INT08U  i;
    CPU_INT16U  green1;
    CPU_INT16U  green2;
    CPU_INT16U  green3;
    CPU_INT16U  black;
    CPU_INT16U  stk_pct;
    CPU_INT32U  stk_sz;
    CPU_INT32U  stk_use;
    CPU_INT32U  stk_max;
    OS_TCB     *ptcb;     
    CPU_INT08U  s[10];
     
      
    green1  = AppFormatColor(0, 31, 0);
    green2  = AppFormatColor(0, 17, 0);
    green3  = AppFormatColor(0,  8, 0);
    black   = AppFormatColor(0,  0, 0);

    LCD_DispStr(27, 0, "Stack Size Demo:                ", green3);
    LCD_DispStr(28, 0, "The stack size, current stack   ", green2);
    LCD_DispStr(29, 0, "use and max stack use are shown ", green2);
    LCD_DispStr(30, 0, "for each task.                  ", green2);

    ptcb    = &OSTCBTbl[0];
    i       = 0;

    while (DEF_TRUE) {
        OSTimeDlyHMSM(0, 0, 0, 25);
         
        if (ptcb != NULL) {
            stk_sz      = ptcb->OSTCBStkSize * sizeof (OS_STK);
            stk_use     = (CPU_INT32U)(ptcb->OSTCBStkBase) - (CPU_INT32U)(ptcb->OSTCBStkPtr);
            stk_max     = ptcb->OSTCBStkUsed;
            
            if (stk_sz != 0) {            
                stk_pct     = 100 * stk_use / stk_sz;
                LCD_DispStr   (32 + i * 2,     0, ptcb->OSTCBTaskName,      black);
                if (stk_sz / 5 < 256) {
                    LCD_DispHorBar(32 + i * 2 + 1, 3, stk_sz  / 5, 200,         green1);
                }
                if (stk_max / 5 < 256) {
                    LCD_DispHorBar(32 + i * 2 + 1, 3, stk_max / 5, stk_max / 5, green2);
                }
                if (stk_use / 5 < 256) {
                    LCD_DispHorBar(32 + i * 2 + 1, 3, stk_use / 5, stk_use / 5, green3);
                }
                 
                AppFormatDec(s, stk_pct, 2);
                s[2] = '%';
                LCD_DispStr   (32 + i * 2 + 1,(stk_sz / 40) + 1, s,          black);  
            }
            
            ptcb        = ptcb->OSTCBPrev;
            i++;
        } else {
            ptcb        = &OSTCBTbl[0];   
            i           = 0;            
        }
    }
}



相关帖子

沙发
fe07fe| | 2012-2-7 15:27 | 只看该作者
好厉害!

使用特权

评论回复
板凳
john_lee| | 2012-2-7 17:04 | 只看该作者
本帖最后由 john_lee 于 2012-2-7 17:05 编辑

µVision4可以支持第3方的RTOS,楼主自己去看看keil的µVision Application Notes。

使用特权

评论回复
地板
billchian| | 2015-4-11 16:09 | 只看该作者
john_lee 发表于 2012-2-7 17:04
µVision4可以支持第3方的RTOS,楼主自己去看看keil的µVision Application Notes。

大哥!具体怎么操作的呢,有没有相关的文档可以借鉴了,小弟正需要这个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

i55
个人签名:诸葛一生唯补肾 吕端房事不糊涂 虽然我不是基督徒,但你可以用身体传福音给我,我必有所感动。

28

主题

750

帖子

6

粉丝