硬汉嵌入式论坛

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

[μCOS-II] ucosii统计任务是怎么保证1s执行一次的?

[复制链接]

2

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2016-2-21 22:38:07 | 显示全部楼层 |阅读模式
   请问关于统计任务OS_TaskStat   最后延时1s钟 OSTimeDly(OS_TICKS_PER_SEC);    假如前半秒钟空闲任务得到运行,然后一个更高优先的任务运行了时间为2.5s。最后统计任务得到运行,那么这时总共是3s钟内空闲任务运行了半秒钟。 那此时计算出的cup利用率是50% 吗??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106847
QQ
发表于 2016-2-21 23:21:42 | 显示全部楼层
我简单介绍下uCOS-II的统计原理。假设系统时钟节拍是1ms,
1. 首先如果用户启动了统计任务,那些系统要先计算100ms内(注意就是固定的100ms),空闲任务的最大计数值。
2. 统计任务是固定的100ms执行一次,系统源码决定的,用户不可以修改,多任务运行时,他统计的是100ms内空闲任务计数值,
   如果100ms内空闲任务没有得到执行,那么CPU利用率就100%

现在你计算一下你自己的问题。
回复

使用道具 举报

2

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2016-2-24 13:18:05 | 显示全部楼层
恩,谢谢您的解答。 我还有个疑问,就是ucos不是基于优先级调度的吗??假如大于1s内都有优先级高于统计任务的任务在运行那么在1s内统计任务是不是根本就得不到运行的机会???我该怎么理解统计任务每秒钟都会执行一次??
回复

使用道具 举报

2

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2016-2-24 13:18:32 | 显示全部楼层

回 eric2013 的帖子

eric2013:我简单介绍下uCOS-II的统计原理。假设系统时钟节拍是1ms,
1. 首先如果用户启动了统计任务,那些系统要先计算100ms内(注意就是固定的100ms),空闲任务的最大计数值。
2. 统计任务是固定的100ms执行一次,系统源码决定的,用户不可以修改,多任务运行时,他统计的是100ms内空闲任 .. (2016-02-21 23:21) 
恩,谢谢您的解答。 我还有个疑问,就是ucos不是基于优先级调度的吗??假如大于1s内都有优先级高于统计任务的任务在运行那么在1s内统计任务是不是根本就得不到运行的机会???我该怎么理解统计任务每秒钟都会执行一次??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106847
QQ
发表于 2016-2-24 13:36:03 | 显示全部楼层

回 syjwz 的帖子

syjwz:

恩,谢谢您的解答。 我还有个疑问,就是ucos不是基于优先级调度的吗??假如大于1s内都有优先级高于统计任务的任务在运行那么在1s内统计任务是不是根本就得不到运行的机会???我该怎么理解统计任务每秒钟都会执行一次??
统计任务一直没有得到运行是没有统计值的,统计的是上次的数值,一旦得到运行那就是100%。因为空闲任务没有计数。
看统计任务源码的实现即可:

    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      */
    }

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 13:14 , Processed in 0.182026 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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