任务可以是一个无限的循环,也可以在一次执行完毕后被删除掉。任务的返回类型必须定义成void,只是它决不返回。任务必须是以下两种结构之一:
void YourTask(void *pdata) { for (;;) { /*用户代码*/ } } void YourTask(void *pdata) { /*用户代码*/ OSTaskDel(OS_PRIO_SELF); }
一、建立任务
OSTaskCreate()或OSTaskCreateExt()建立任务。任务可以在多任务调度开始前建立,也可在其他任务的执行过程中建立。在开始多任务调度(调用OSStart())前,必须建立至少一个任务。任务不能由中断服务程序(ISR)建立。
注意:
(1)OSTaskCreate()或OSTaskCreateExt()须确保定义的优先级没有被其他任务占用。在uC/OS-II中,每个任务的优先级必须各不相同。
(2)如果OSTaskCreate()函数是在某个任务的执行过程中被调用的(OSRunning == TRUE),则任务调度函数会被调用,以判断新建立的任务是否比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换。如果该任务是在多任务调度开始之前建立的,则任务调度函数不会起作用。
(3)OSTaskCtr用于跟踪已建立的任务数目。
二、任务堆栈
堆栈必须声明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间(编译时分配),也可以动态分配堆栈空间(运行时分配)。
typedef INT32U OS_STK;
注意:在动态分配中,要时刻注意内存碎片问题。特别是当反复建立和删除任务时,内存堆中可能会出现大量的内存碎片,导致没有足够大的一块连续内存区域可用做任务堆栈。
当OS_STK_GROWTH == 1时,堆栈是从上往下递减的,需将堆栈的最高内存地址传递给任务创建函数。
当OS_STK_GROWTH == 0时,堆栈是从下往上递增的,需将堆栈的最低内存地址传递给任务创建函数。
三、删除任务
删除任务,是说任务将返回并处于休眠状态,并不是说任务的代码被删除了,只是任务的代码不再被uC/OS-II调用。