OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3945|回复: 0

UCOS-II统计任务OSCPUUsage一直为0

[复制链接]

1

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2018-10-12
在线时间
61 小时
发表于 2020-1-5 15:08:13 | 显示全部楼层 |阅读模式
1金钱
OSInit()函数中有关统计任务部分

#if OS_TASK_STAT_EN > 0u
    OS_InitTaskStat();                                           /* Create the Statistic Task                */
#endif

#define OS_TASK_STAT_EN           1u   /*     Enable (1) or Disable(0) the statistics task   */
已设置为EN

//start_task()开始任务中创建的有软件定时器1,软件定时器2,及其他一些任务
//定时器1回调函数,对LED0进行100ms翻转一次【目前该现象正常】
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{                
                LED0 = ~LED0;                       
}

于是我想把CPU使用率通过串口打印出来
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{                
                LED0 = ~LED0;       
                printf("CPU使用率%d\r\n",OSCPUUsage);                        //显示CPU使用率
}

可是一直打印:CPU使用率0
参照原子哥例程,好像是5次求下平均值,打印出来。

于是改成下面
//软件定时器1的回调函数         100ms
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
                static u16 cpuusage=0;
                static u8 tcnt=0;                
                LED0 = ~LED0;
                if(tcnt==5)
                {
                        printf("CPU使用率%d\r\n",cpuusage/5);                        //显示CPU使用率  
                        cpuusage=0;
                        tcnt=0;
                }
                cpuusage+=OSCPUUsage;
                tcnt++;                               
}


依然打印:CPU使用率0
于是我下面对OS_TaskStat 函数内部Debug看现象【断点一】【断点二】

void  OS_TaskStat (void *p_arg)
{
#if OS_CRITICAL_METHOD == 3u                     /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    p_arg = p_arg;                               /* Prevent compiler warning for not using 'p_arg'     */
    while (OSStatRdy == OS_FALSE) {
【断点一】       OSTimeDly(2u * OS_TICKS_PER_SEC / 10u);  /* Wait until statistic task is ready                 */
    }
【断点二】    OSIdleCtrMax /= 100uL;
    if (OSIdleCtrMax == 0uL) {
        OSCPUUsage = 0u;
#if OS_TASK_SUSPEND_EN > 0u
        (void)OSTaskSuspend(OS_PRIO_SELF);
#else
        for (;;) {
            OSTimeDly(OS_TICKS_PER_SEC);
        }
#endif
    }
    for (;;) {
        OS_ENTER_CRITICAL();
        OSIdleCtrRun = OSIdleCtr;                /* Obtain the of the idle counter for the past second */
        OSIdleCtr    = 0uL;                      /* Reset the idle counter for the next second         */
        OS_EXIT_CRITICAL();
        OSCPUUsage   = (INT8U)(100uL - OSIdleCtrRun / OSIdleCtrMax);
        OSTaskStatHook();                        /* Invoke user definable hook                         */
#if (OS_TASK_STAT_STK_CHK_EN > 0u) && (OS_TASK_CREATE_EXT_EN > 0u)
        OS_TaskStatStkChk();                     /* Check the stacks for each task                     */
#endif
        OSTimeDly(OS_TICKS_PER_SEC / 10u);       /* Accumulate OSIdleCtr for the next 1/10 second      */
    }
}


F5运行,一直去【断点一】,【断点二】一次都没来,所以打印CPU使用率为初始值0。

但是,,,为什么啊?

OSStatRdy == OS_FALSE这个条件为啥一直成立???我和原子哥的例程目前没发现差异。
请各位老师帮忙解答,谢谢!














正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 13:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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