实时操作系统中任务的概念和操作系统中进程的概念差不多,就是一个对正在运行的程序的抽象。任务和程序之间的区别是很微妙的,任务是某种类型的一个活动,它可以有程序、输入、输出及状态。在uC/OS-II中,一个任务看起来像其它C的函数一样,有函数返回类型,有形式参数变量,但是任务是绝不会返回的。故返回参数必须定义成void,如程序清单1就是一个任务函数:
程序清单1
TASK()
---------------------------void Task (void *pdata)
{
for(;;){
/* 用户代码 */
/* 调用μC/OS-Ⅱ的各种服务 */
/* 用户代码 */
}
}
-----------------------------------------------------------
当任务完成以后,任务可以自我删除,任务函数可以调用OSTaskDel()来实现这个目的。
任务删除不是指任务代码被删除了,而是指内核将不再处理这个任务了,当然任务函数也不会被执行。任务想要再次进入内核可以调用OSTaskCreat()或者OSTaskCreatExt()。任务函数的形式参数变量是由用户代码在第一次执行时带入的,将变量定义成void指针是为了允许用户应用程序传递任何类型的数据给任务。用户也可以建立许多相同的任务,且所有都使用同一个任务函数,但可以向这个任务传入不同的数据,就可以达到不同的任务使用同一个任务函数的目的,大大节省了代码的存储空间.
μC/OS-Ⅱ可以管理多达64个任务,但目前版本的μC/OS-Ⅱ有两个任务已经被系统占用了。作者保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI-0这8个任务以被将来使用。须给每个任务赋以不同的优先级,优先级号越低,任务的优先级越高。μC/OS-Ⅱ总是运行进入就绪态的优先级最高的任务。
任务控制块(OS_TCB)是一个数据结构,是用来描述任务的一些属性。当一个任务建立时,任务控制块将被初始化。当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用任务控制块来保存改任务的状态,当任务重新得到CPU使用权时,任务控制块能确保任务从中断的那一点继续执行下去。OS_TCB全部驻留在RAM中。每个任务都有自己的栈,μC/OS-Ⅱ中栈的容量是可以任意大小的。有些商业内核要求所有任务栈的容量都是一样的,这种限制就浪费了RAM。