UCOSII学习---二、任务管理


任务管理基础知识

uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
在系统初始化完毕后启动任务时必须创建一份用户任务。

任务管理相关函数:

1、建立任务OSTaskCreat()/OSTaskCreatExt()
如果想让UCOS管理用户的任务,必须先建立任务。可以通过将任务的地址和其他参数传递到以下两个函数之一来建立任务。当调用OSTaskCreat()时(ucos老版本使用),需要四个参数:
 OSTaskCreate(void( *task)(void *pd),  
              void *pdata,  
              OS_STK *ptos,  
              INTU prio)

Task:是指向任务代码的指针;pdata:是任务开始执行时传递给任务的参数的指针,为(void*0时,表示传递一个空指针给函数;ptos:是分配给任务的堆栈的栈顶指针,prio是分配给任务的优先级。
也可以用OSTaskCreatExt(),不过该函数需要9个参数,前四个参数与OSTaskCreat()一样,例如:

INT8U OSTaskCreateExt(void( *task)(void *pd),
                      void *pdata,
                      OS_STK *ptos, 
                      INT16U   id, 
                      OS_STK  *pbos,
                      OS_STK  *pbos, 
                      INT16U  opt)     

id参数为要建立的任务创建一个特殊的标识符。pbos是指向任务的堆栈栈底的指针,用于堆栈的检验。stk_size用于指定堆栈成员数目的容量。pext是指向用户附加的数据域的指针,用来扩展任务的OS_TCB。opt用于设定OSTaskCreateExt()的选项,指定是否允许堆栈检验,是否将堆栈清零,任务是否要进行浮点操作等等。

2、任务堆栈OS_STK()

每个任务都有自己的堆栈,堆栈必须申明为 OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。

3、堆栈检验OSTaskStkChk()

有时确定任务实际需要的堆栈空间的大小是很有必要的,因为这样就可以避免为任务分配过多的堆栈空间,从而减少应用程序代码所需的RAM空间。

4、删除任务OSTaskDel()

有时需要删除任务,删除任务,是说任务返回并处于休眠态,并不是说任务的代码被删除了,只是任务的代码不再被UCOS调用。删除任务前应保证所删任务并非空闲任务。例如:OSTaskDel(INT8U prio),prio为任务优先级。

5、请求删除任务OSTaskDelReq()

有时,任务会占用一些内存缓冲或信号量一类的资源。这时,假如另一个任务试图删除该任务,这些被占用的资源就会因为没有被释放而丢失。在这种情况下,需想办法拥有这些资源的任务在使用完资源后先释放资源,再删除自己。

if(OSTaskDelReq(INT8U prio)==OS_TASK_DEL_REQ)
   OSTaskDel(INT8U prio);

OSTaskDelReq()具体执行解释执行如下:

//假设两个任务Task1和Task2,Task1优先级高于Task2,Task1删除Task2
if()  //Task1代码
{
While(OSTaskDelReq(被删的优先级号)!=OS_TASK_NOT_Exist)
{
  OSTimeDly(1);//这个有点就行
}
}

//被删的任务Task2是这样写的
if(OSTaskDelReq(OS_PRIO_SELF)==OS_TASK_DEL_REQ)
{
释放所占用的资源;//这里才是重点
释放动态内存;
OSTaskDel(OS_PRO_SELF);
}
Else
{
其他代码!
}
6、改变任务的优先级OSTaskChangePrio()

在建立任务时,会分配给任务一个优先级。在程序运行期间,可以通过调用该函数改变任务的优先级。也就是说,UCOS允许动态的改变任务的优先级。
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)。

7、挂起任务OSTaskSuspend()

任务挂起是一个附加功能,也就是说,如果任务在被挂起的同时也在等待延迟时间到,那么,需要对任务做取消挂起的操作,并且等待延迟时间到,任务才能转让就绪状态。任务可以挂起自己或者其他任务。例子OSTaskSuspend(INT8U prio)。

8、恢复任务OSTaskResume()

挂起的任务只有通过该函数才能被恢复。例子OSTaskResume(INT8U prio),prio为优先级。

9、获得任务的信息OSTaskQuery()

通过调用该函数,来获得自身或其他应用任务的信息。

猜你喜欢

转载自blog.csdn.net/ROM7RAM/article/details/81742092