嵌入式实时操作系统uC/OS-II(二)
uC/OS-II中的任务
- uC/OS-II的任务由如图2-1所示的三个部分组成:任务程序代码(函数)、任务堆栈和任务控制块。
任务控制块就是关联任务代码的程序控制块,其记录了任务的各个属性;任务堆栈用于保存任务的工作环境。
图2-1 uC/OS-II任务的组成
- 进程和线程的区分
根据任务是否具有自己的私有运行空间,人们把任务也分别叫做“进程”或“线程”。具体来说,具有私有空间的任务叫做进程,没有私有空间的任务就叫做线程。显然,从任务的组成上来看,uC/OS-II没有给任务定义私有空间,因此uC/OS-II中所有任务都属于线程。
- 如何对任务进行管理
uC/OS-II用任务控制块链表对任务进行管理,如图2-2所示。
图2-2 任务链表
- 任务的状态
根据具体情况,uC/OS-II系统中的任务共有5种状态,如表2-1所列。
表2-1 uC/OS-II任务的5种状态
任务的状态 |
说 明 |
睡眠状态 |
任务只是以代码的形式驻留在程序空间,还没有交给操作系统管理 |
就绪状态 |
任务配备了任务控制块且在任务就绪表中进行登记了 |
运行状态 |
处于就绪状态的任务如果经调度器判断获得CPU的使用权 |
等待状态 |
正在运行的任务,需要等待一段时间或等待一个事件发生在运行,该任务就会把CPU的使用权让给其他任务而使任务进入等待状态 |
中断服务状态 |
正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务函数 |
5个不同状态之间发生转换。其转换关系如图2-3所示。
图2-3 任务状态及其转换关系
- 系统任务
空闲任务:系统运行时,系统极有可能在某个时间内无用户任务可运行而处于所谓的空闲状态。为了使CPU在没有用户任务可执行时有事可做,uC/OS-II提供了一个叫做空闲任务 OSTaskIdle(void *pdata)的系统任务。其代码如下。
Void OSTaskIdle(void *pdata) { pdata = pdata; for(;;) { OS_ENTER_CRITICAL(); OSdleCtr++; OS_EXIT_CRITICAL(); } } |
- 解析:空闲任务只是对系统定义的一个空闲任务运行次数计数器OSdleCtr++进行加1操作。如果用户有需要可在空闲任务中编写一些做用户工作的代码。
- 统计任务:uC/OS-II提供了另一个系统任务就是统计任务OSTaskStat()。该任务每秒计算一次CPU在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUsage中,以便其他应用程序来了解CPU的利用率。
是否使用统计任务,用户可通过修改OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置1,并且在调用OSStatInit()对统计任务进行初始化。