硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2483|回复: 8
收起左侧

[有问必答] 安富莱的例程中,CPU任务信息串口打印出来CPU占用率均为0.00%?

[复制链接]

1

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2019-1-15 11:41:01 | 显示全部楼层 |阅读模式
打印信息函数如下,在用keil调试过程中发现download后显示cpu占用率均为0,而在线仿真之后cpu占用率不为0,这个是什么原因呢?望大神指点
/*
*********************************************************************************************************
*        函 数 名: DispTaskInfo
*        功能说明: 将uCOS-III任务信息通过串口打印出来
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void DispTaskInfo(void)
{
        OS_TCB      *p_tcb;                /* 定义一个任务控制块指针, TCB = TASK CONTROL BLOCK */
        CPU_SR_ALLOC();

        CPU_CRITICAL_ENTER();
    p_tcb = OSTaskDbgListPtr;
    CPU_CRITICAL_EXIT();
        
        /* 打印标题 */
        printf("===============================================================\r\n");
    printf (" CPU使用率:%5.2f%%, CPU最大使用率:%5.2f%%\r\n", (float)OSStatTaskCPUUsage / 100, (float)OSStatTaskCPUUsageMax / 100);
    printf("---------------------------------------------------------------\r\n");
        printf(" 优先级 使用栈 剩余栈 百分比 利用率   任务名\r\n");
        printf("  Prio   Used  Free   Per    CPU     Taskname\r\n");

        /* 遍历任务控制块列表(TCB list),打印所有的任务的优先级和名称 */
        while (p_tcb != (OS_TCB *)0)
        {
                printf("   %2d  %5d  %5d   %02d%%   %5.2f%%   %s\r\n",
                p_tcb->rio,
                p_tcb->StkUsed,
                p_tcb->StkFree,
                (p_tcb->StkUsed * 100) / (p_tcb->StkUsed + p_tcb->StkFree),
                (float)p_tcb->CPUUsage / 100,
                p_tcb->NamePtr);        
                 
                CPU_CRITICAL_ENTER();
        p_tcb = p_tcb->DbgNextPtr;
        CPU_CRITICAL_EXIT();
        }
    printf("===============================================================\r\n");
}

download:
===============================================================
CPU使用率: 8.14%, CPU最大使用率:68.25%
---------------------------------------------------------------
优先级 使用栈 剩余栈 百分比 利用率   任务名
  Prio   Used  Free   Per    CPU     Taskname
    5     98    158   38%    0.00%   App Task KeyPro
    3     25    231   09%    0.00%   App Task Disp
    3     25    231   09%    0.00%   App Msp Pro
   29     41     87   32%    0.00%   uC/OS-III Timer Task
   30     30     70   30%    0.00%   uC/OS-III Stat Task
    1     30     98   23%    0.00%   uC/OS-III Tick Task
   31     18    110   14%    0.00%   uC/OS-III Idle Task
===============================================================

debug:
===============================================================
CPU使用率: 8.21%, CPU最大使用率:68.89%
---------------------------------------------------------------
优先级 使用栈 剩余栈 百分比 利用率   任务名
  Prio   Used  Free   Per    CPU     Taskname
    5    106    150   41%    0.21%   App Task KeyPro
    3     25    231   09%    0.01%   App Task Disp
    3     25    231   09%    2.32%   App Msp Pro
   29     41     87   32%    4.46%   uC/OS-III Timer Task
   30     30     70   30%    0.30%   uC/OS-III Stat Task
    1     30     98   23%    2.79%   uC/OS-III Tick Task
   31     18    110   14%   89.88%   uC/OS-III Idle Task
===============================================================

1.png
2.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-1-15 11:45:03 | 显示全部楼层
你的统计任务应该没开,要开开。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-1-15 13:21:15 | 显示全部楼层
eric2013 发表于 2019-1-15 11:45
你的统计任务应该没开,要开开。

static  void  AppTaskStart (void *p_arg)
{
        OS_ERR      err;

   (void)p_arg;
       

        CPU_Init();
        bsp_Init();
        BSP_Tick_Init();

#if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);   
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_IntDisMeasMaxCurReset();
#endif
   
   
        /* 创建任务 */
    AppTaskCreate();  

        /* 创建任务通信 */
        AppObjCreate();
       
    OSTaskDel ( 0, & err );                     //删除起始任务本身,该任务不再运行
}

初始化中开启了
#if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);   
#endif

OS_CFG_STAT_TASK_EN是使能的状态
而且在debug的状态下是不为0的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-1-15 14:12:28 | 显示全部楼层
小孟 发表于 2019-1-15 13:21
static  void  AppTaskStart (void *p_arg)
{
        OS_ERR      err;

为什么要删掉起始任务呢? 起始任务的栈空间留着浪费?

OSTaskDel ( 0, & err );      //删除起始任务本身,该任务不再运行



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-1-15 14:13:23 | 显示全部楼层
使用这个测试下,是不是你的某个比空闲任务和统计任务优先级高任务没有释放CPU权限

【专题教程第2期】uC/Probe简易使用说明,含MDK和IAR,支持F103,F407和F429开发板
http://www.armbbs.cn/forum.ph ... id=50280&fromuid=58
(出处: 安富莱电子论坛)


回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-1-16 10:45:42 | 显示全部楼层
eric2013 发表于 2019-1-15 14:12
为什么要删掉起始任务呢? 起始任务的栈空间留着浪费?

OSTaskDel ( 0, & err );      //删除起始任 ...

这个倒不是为了能省多少栈空间,可能我对起始任务的功能定位就是创建任务,任务创建完之后就不必干其他的事情了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2019-1-16 10:50:19 | 显示全部楼层
小孟 发表于 2019-1-16 10:45
这个倒不是为了能省多少栈空间,可能我对起始任务的功能定位就是创建任务,任务创建完之后就不必干其他的 ...

你这个不是省,是浪费掉了。

因为uCOS是静态的创建方式。如果你改成用malloc类的动态申请和释放,无谓的增加内存碎片,降低系统稳定性。

ps:如果有这种需求,直接在main函数里面把想创建的全部创建好即可。
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-1-16 10:51:23 | 显示全部楼层
eric2013 发表于 2019-1-15 14:13
使用这个测试下,是不是你的某个比空闲任务和统计任务优先级高任务没有释放CPU权限

【专题教程第2期】uC ...

显示为0的问题解决了,只要download完之后再手动复位一下就可以了,偶然间才发现,具体原因还不知道,但download之后是设置了Reset and Run的,另外您推荐的工具试用了,非常强大,感谢!!!
1.png
回复

使用道具 举报

1

主题

4

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2019-1-16 11:17:04 | 显示全部楼层
eric2013 发表于 2019-1-16 10:50
你这个不是省,是浪费掉了。

因为uCOS是静态的创建方式。如果你改成用malloc类的动态申请和释放,无谓 ...

嗯,是的,不用也是浪费了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 04:18 , Processed in 0.183018 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表