找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6629|回复: 0
打印 上一主题 下一主题
收起左侧

uC/OS-II学习笔记—特殊任务

[复制链接]
跳转到指定楼层
楼主
uC/OS-II的特殊任务包括空闲任务和统计任务,又称操作系统的系统任务。虽然统计任务不是必需的,但是却二十默认的系统任务。这两个任务在操作系统初始化时被创建,在多任务启动后被执行。那么,这两个任务都具有什么功能,又使用了哪些重要的数据结构呢?
空闲任务OS_TaskIdle是uC/OS-II的系统任务因为它占据了最低优先级63,所以只有在其他的任务都因为等待事件的发生而被阻塞的时候才能得到运行。
空闲任务的代码在os_core.c内核中,代码如下所示:

由空闲任务的代码可知,空闲任务除了不停地将空闲计数器OSIdleCtr的值加1之外,几乎什么都不做。当没有任何其他任务能够运行的时候,操作系统就会执行这段代码。而OSTaskIdleHook默认情况下也只是一个空函数,如没有特殊需要我们不需要去填写它,该函数的另一个作用就是占据一点时间,给系统足够的时间响应中断。
统计任务OS_TaskStat是uC/OS-II的另一个重要的系统任务,我们可以通过宏设置取消统计任务,但一般情况下不这么做,因为统计任务执行的统计工作时比较重要的。统计任务的主要功能是计算CPU的利用率。如果没有统计任务,就不知道多任务环境下系统的运行情况是否良好。
CPU的利用率使用全局变量OSCPUUsage表示,这里涉及的几个全局变量如下所示:

分析一下统计任务的代码。首先是统计任务的初始化,该初始化任务的主要目的是获得系统空闲计数的最大值,代码如下所示:

该统计任务初始化函数在用户任务中被调用,这个函数在移植过程中被App_TaskStart调用,App_TaskStart的优先级设置为1。代码如下所示:

这时系统没有运行其他的任务。系统任务初始化函数首先将自己阻塞两个时钟周期,在系统时钟中断2次后,由调度器进行任务调度而恢复运行,目的是与时钟同步。接着,统计任务初始化函数清空空闲计数器OSIdleCtr,访问全局变量OSIdleCtr必须关中断,访问完后再开中断。接下来调用OSTimeDly(OS_TICKS_PER_SEC/10u)又把自己阻塞100ms,100ms后才恢复运行。在这100ms之内,运行的任务只有空闲任务。空闲任务会拼命将空闲计数器OSIdleCtr的值往上加,加到多大就要看CPU的速度。延时结束后,用OSIdleCtrMax接纳OSIdleCtr的值,因此OSIdleCtrMax表示空闲状态100ms内OSIdleCtr的计数值,称为空闲计数最大值。那么,在系统运行了其他用户任务的情况下,每100ms内OSIdleCtr的计数值肯定小于这个数值的。获得了这个数值,统计任务就有了统计的基础了,因此统计任务就准备好了,可以设置OSStatRdy的值为真。

统计任务优先级仅仅比空闲任务高,空闲任务的优先级是63,统计任务的优先级是62,这个数值越小优先级越高。因此,统计任务优先于空闲任务运行。在操作系统初始化过程中,初始化OSStatRdy为假,并创建了统计任务和空闲任务。初始化后又创建了一个名为App_TaskStart的优先级为1的任务。在多任务启动后,如果没有其他的任务就绪,那么首先要运行App_TaskStart,App_TaskStart中运行OSStatInit。在OSStatInit没有结束前,由于OSStatRdy的值一直是假,所以

此处的循环不能结束,统计任务OS_TaskStat就把自己延时,等待,把CPU留给空闲任务用于做空闲计数。
OSStatInit结束时,100ms过后,OSStatRdy为真,统计任务OS_TaskStat经过200ms的延时时间后被唤醒,发现OSStatRdy为真就离开循环,为方便以后的计算,将空闲计数的最大值OSIdleCrMax除以100,商仍放在OSIdleCtrMax中。如果这时OSIdleCtrMax的值是0,说明空闲计数的值太少了(不到100),系统状况很差,统计任务干脆讲自己挂起来不再进行统计。
如果一切正常,那么统计任务进入死循环进行统计工作。首先将100ms内空闲计数值OSIdleCtr存到OSIdleCtrRun中,然后将OSIdleCtr清0以初始化下一个100ms的计数,然后进行CPU利用率的计算,公式为:OSCPUUsage = 100uL - OSIdleCtrRun/OSIdleCtrMax 。
因为OSIdleCtrMax的值是在前面除过100的,因此还原为:
OSCPUUsage = 100*(1-OSIdleCtrRun/OSIdleCtrMax)
OSIdleCtrRun是100ms内空闲任务对OSIdleCtr的计数值,OSIdleCtrMax是系统空闲的时候最大的计数值。OSIdleCtrRun/OSIdleCtrMax就是系统的空闲度了,但系统完全空闲的时候这个值就是1,而当系统繁忙的时候空闲任务可能得不到运行,这个值就是0。OSCPUUsage反映了系统的繁忙程度,也就是CPU的利用率。
接下来再延迟100ms来让空闲任务统计下一个100ms的计数值,循环继续进行下一次的统计。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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