在μC/OS-Ⅲ系统中,任务自身一共有五种状态。
1、休眠态
调用函数OSTaskCreate()创建任务后,任务就可以接受μC/OS-Ⅲ的管理。处于休眠态的任务代码实际上已经写入代码空间中了,但是μC/OS-Ⅲ还不知道它的存在。当不在需要μC/OS-Ⅲ管理某个任务时,用户可以调用任务删除函数OSTaskDel()来删除它。OSTaskDel()实际上并不会删除一个任务的代码,只是使该任务无法再获得CPU的使用权。
2、就绪态
当一个任务准备运行时,它就进入就绪态。在μC/OS-Ⅲ中可以有任意多个任务处于就绪态。
3、运行态
最重要的就绪任务会进入运行态。对于单核CPU,在任意时刻只能有一个任务运行。
4、等待态
当任务等待一个事件发生才能继续运行时,任务进入等待态。处于等待态的任务会被放入一个与该任务所等待的事件相对应的等代表。当任务等待的事件发生时,任务被重新放回就续表中,成为就绪态。
5、
中断服务态:如果允许CPU被中断,那么中断发生时,正在运行的任务会被挂起,CPU开始执行中断服务子程序ISR。此时处于中断服务态。注意,ISR程序应该尽可能的短,中断处理的大部分工作应该在μC/OS-Ⅲ系统中可管理的任务级完成。
在μC/OS-Ⅲ系统的任务中,均含有一个任务控制块TCB(Task Control Block)。这是内核使用的一种数据结构,用来维护任务相关的信息。在μC/OS-Ⅲ中,每个任务都要有自己的TCB。任务的TCB由用户在用户的存储空间中分配。当调用任务相关的函数时,要把任务TCB的地址传递给所调用的函数。需要特别注意的是,即便用户了解OS_TCB中各个成员的功能,在应用程序的代码中也不能直接访问这些成员,更不允许对其做任何改动。
μC/OS-Ⅲ共有5个系统内部任务
在5个系统任务中,空闲任务和时钟节拍任务是必须的,其他任务是可选的。
1、空闲任务:OS_IdleTask()----os_core.c
OS_IdleTask()是μC/OS-Ⅲ创建的第一个任务,也是μC/OS-Ⅲ必须创建的一个任务。空闲任务的优先级总是设置为OS_CFG_PRIO_MAX-1。实际上空闲任务是唯一一个可以使用该优先级的任务(该优先级为最低优先级)。在该任务中,可以调用一些特殊的处理器控制函数,比如设置处理器处于低功耗状态等等。
2、时钟节拍任务:OS_TickTask()---os_tick.c
几乎每个实时操作系统都需要一个周期性的时钟源,称为时钟节拍(Clock Tick)或系统节拍(System Tick),用来跟踪任务延时和任务等待超时。μC/OS-Ⅲ的时钟节拍处理函数封装在os_tick.c文件中。
OS_TickTask()是μC/OS-Ⅲ必须创建的一个系统任务。用户可以设置该任务优先级,通常该任务设置为一个相对较高的优先级。该任务的功能是跟踪正在演示的任务,以及在指定的时间内等待某个内核对象任务。OS_TickTask()是一个周期执行的任务,它等待时钟节拍ISR发送的信号。
3、统计任务:OS_StatTask()---os_stat.c
μC/OS-Ⅲ中的统计任务是一个可选系统任务,可以在系统运行时做一些统计工作,例如统计总的CPU利用率、各任务的CPU利用率一级各任务的堆栈使用量。
如果需要使用统计任务,必须在main()函数创建第一个也是唯一一个应用任务中调用OSStatTaskCPUUsageInt()函数(例程见本书第一版5.6.3节,P83)。
4、定时任务:OS_TmrTask()---os_tmr.c
μC/OS-Ⅲ可以向用户提供定时服务。定时服务可以周期性的执行一些用户自定义的操作。在μC/OS-Ⅲ中定时任务是可选的,用户可以创建任意数据的定时器。
5、中断服务管理任务:OS_IntQTask()---os_int.c
当把os_cfg.h文件中的配置常量OS_CFG_ISR_POST_DEFERRED_EN设置为1时,μC/OS-Ⅲ会创建一个名为OS_IntQTask()的任务,该任务负责“延迟”(deferring)在ISR中调用的系统post服务函数(OS post service)的行为。
一个任务就是一段可以认为CPU为其独享的程序。对于单CPU系统,任何时刻都只有一个任务在运行。μC/OS-Ⅲ支持多任务管理,允许在一个应用中有任务数目的任务。任务最大数目实际只受限于处理器可用的存储量。