1. 任务的状态及其转换
睡眠状态:
任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态。
等待状态:
正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。
就绪状态:
系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,这时任务的状态叫做就绪状态。
运行状态:
处于就绪状态的任务如果经调度器判断获得了CPU的使用权,则任务就进入运行状态。
中断状态:
一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。
2. 任务控制块
系统为每个任务创建一个保存与该任务有关的相关信息的数据结构,这个数据结构就叫做该任务的任务控制块(TCB)。
任务控制块结构的主要成员:
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; //指向任务堆栈栈顶的指针
……
struct os_tcb *OSTCBNext;//指向后一个任务控制块的指针
struct os_tcb *OSTCBPrev; //指向前一个任务控制块的指针
……
INT16U OSTCBDly; //任务等待的时限(节拍数)
INT8U OSTCBStat; //任务的当前状态标志
INT8U OSTCBPrio; //任务的优先级别
……
} OS_TCB;
当进行系统初始化时,初始化函数会按用户提供的任务数为系统创建具有相应数量的任务控制块并把它们链接为一个链表。
3. 空闲任务与统计任务
μC/OS-II 规定,一个用户应用程序必须使用这个空闲任务,而且这个任务是不能用软件来删除的 。
OS_TaskIdle(空闲任务):
空闲任务只是简单的做了一个计数工作。
OS_TaskStat(统计任务):
这个统计任务每秒计算一次 CPU 在单位时间内被使用的时间,并把计算结果以百分比的形式存放在变量 OSCPUsage 中,以便应用程序通过访问它来了解 CPU 的利用率。
4. 任务的创建
void main(void)
{
……
OSTaskCreate(
MyTask, //任务的指针
&MyTaskAgu, //传递给任务的参数
& MyTaskStk[MyTaskStkN-1],//任务堆栈栈顶地址
20 //任务的优先级别
);
……
}
使用函数OSTaskCreate( ) 创建任务时,一定要注意所使用的处理器对堆栈增长方向的支持是向上的还是向下的。
参考自:《μC/OS-II 入门教程》