首页 > 代码库 > 任务管理(uC/OS-II)

任务管理(uC/OS-II)

任务可以是一个无限的循环,也可以在一次执行完毕后被删除掉。任务的返回类型必须定义成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调用。

任务管理(uC/OS-II)