(一)任务管理
uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。
在系统初始化完毕后启动任务时必须创建一份用户任务,也就是说必须有一个应用程序(用户任务,使用应用程序对于我们经常使用Windows用户容易接受一些。呵呵),否则系统会崩溃。当然还有一些其他的要求,咱们后续再说,下面简要概述一下任务管理相关的函数:
1:建立任务OSTaskCreat()/OSTaskCreatExt()
如果想让UCOS管理用户的任务,必须先建立任务。可以通过将任务的地址和其他参数传递到以下两个函数之一来建立任务。当调用OSTaskCreat()时,需要四个参数:
OSTaskCreate(void(*task)(void*pd), //任务代码的指针
void*pdata, //传递给任务的参数
OS_STK*ptos, //任务的堆栈的栈顶指针
INT8U prio //任务的优先级别
);
2:任务堆栈OS_STK()
为了定义任务堆栈的方便,在OS_CPU.H中定义了一个数据类型OS_STK:
typedef unsigned int OS_STK;//该类型长度为16位
这样在定义任务堆栈的战区时,只要定义一个OS_STK的数据类型即可,如:
#define TASK_STK_SIZE 512 //1024字节
OS_STK TaskStk[TASK_STK_SIZE];//定义一个数组来作为任务堆栈
每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。
3:堆栈检验OSTaskStkChk()
有时确定任务实际需要的堆栈空间的大小是很有必要的,因为这样就可以避免为任务分配过多的堆栈空间,从而减少应用程序代码所需的RAM空间。
4:删除任务OSTaskDel()
有时需要删除任务,删除任务,是说任务返回并处于休眠态,并不是说任务的代码被删除了,只是任务的代码不再被UCOS调用。删除任务前应保证所删任务并非空闲任务。
5:请求删除任务OSTaskDelReq()
有时,任务会占用一些内存缓冲或信号量一类的资源。这时,假如另一个任务试图删除该任务,这些被占用的资源就会因为没有被释放而丢失。在这种情况下,需想办法拥有这些资源的任务在使用完资源后先释放资源,再删除自己。
6:改变任务的优先级OSTaskChangePrio()
在建立任务时,会分配给任务一个优先级。在程序运行期间,可以通过调用该函数改变任务的优先级。也就是说,UCOS允许动态的改变任务的优先级。
7:挂起任务OSTaskSuspend()
任务挂起是一个附加功能,也就是说,如果任务在被挂起的同时也在等待延迟时间到,那么,需要对任务做取消挂起的操作,并且等待延迟时间到,任务才能转让就绪状态。任务可以挂起自己或者其他任务。
8:恢复任务OSTaskResume()
挂起的任务只有通过该函数才能被恢复。
9:获得任务的信息OSTaskQuery()
通过调用该函数,来获得自身或其他应用任务的信息