一、任务管理OS_TASK.C(API) 1、 改变一个任务的优先级 INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio) 调用:OSTaskChangePrio (5, 10); //把优先级为5的改为10 2、建立一个任务 INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) OSTaskCreate (MyTask,(void *)0, &Task0Stk[Task0StkLengh - 1], 10); MyTask指向的函数名,(void *)0就是指向空的意思 3 建立一个任务 INT8U OSTaskCreateExt (void (*task)(void *pd), //建立扩展任务(任务代码指针 void *pdata, //传递参数指针 OS_STK *ptos, //分配任务堆栈栈顶指针 INT8U prio, //分配任务优先级 INT16U id, //(未来的)优先级标识(与优先级相同) OS_STK *pbos, //分配任务堆栈栈底指针 INT32U stk_size, //指定堆栈的容量(检验用) void *pext, //指向用户附加的数据域的指针 INT16U opt) //建立任务设定选项) 4、删除任务(删除有占用共享资源任务会出错) INT8U OSTaskDel (INT8U prio) //删除任务(任务的优先级) 5、删除任务(可靠删除任务并清理占用共享资源) INT8U OSTaskDelReq (INT8U prio) //请求一个任务删除其它任务或自身?(任务的优先级) 6、唤醒任务 INT8U OSTaskResume (INT8U prio) //唤醒一个用OSTaskSuspend()函数挂起的任务(任务的优先级) 7、挂起任务 INT8U OSTaskSuspend (INT8U prio) //无条件挂起一个任务(任务优先级) 8、获取任务信息 INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata) //获取任务信息(任务指针、保存数据结构指针) 9、检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间(STACK CHECKING) INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata) 610 * 描述: 检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间。使用OSTaskStkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的,且opt参数中OS_TASK_OPT_STK_CHK操作项打开。 611 * 计算堆栈未用空间的方法是从堆栈底端向顶端逐个字节比较,检查堆栈中0的个数,直到一个非0的数值出现.这种方法的前提是堆栈建立时已经全部清零.要实现清零操作,需要在任务建立初始化 612 * 堆栈时设置OS_TASK_OPT_STK_CLR为1.如果应用程序在初始化时已经将全部RAM清零,且不进行任 613 * 任务删除操作,也可以设置OS_TASK_OPT_STK_CLR为0,这将加快OSTaskCreateExt()函数的执行速度。 1.1改变任务的优先级 /* ********************************************************************************** 19 * 改变一个任务的优先级(CHANGE PRIORITY OF A TASK) 21 * 描述: 改变一个任务的优先级。 23 * 参数: oldp 是任务原先的优先级。 25 * newp 是任务的新优先级。 27 * 返回: OS_NO_ERR 任务优先级成功改变。 28 * OS_PRIO_INVALID 参数中的任务原先优先级或新优先级大于或等于OS_LOWEST_PRIO。 29 * (i.e. >= OS_LOWEST_PRIO) 30 * OS_PRIO_EXIST 优先级为PIP的任务已经存在; 31 * OS_PRIO_ERR 参数中的任务原先优先级不存在。 33 * 注意: 参数中的新优先级必须是没有使用过的,否则会返回错误码.在OSTaskChangePrio()中还会先 34 * 判断要改变优先级的任务是否存在。 ***********************************************************************************/ INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio) 调用:OSTaskChangePrio (5, 10); //把优先级为5的改为10 1.2建立任务 /***************************************************************************************** 125 * 建立一个新任务(CREATE A TASK) 127 * 描述: 建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立.中断处理程序中不能建立任务.一个任务必须为无限循环结构(如下所示),且不能有返回点。 129 * OSTaskCreate()是为与先前的μC/OS版本保持兼容,新增的特性在OSTaskCreateExt()函数中. 130 * 无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与CPU中断后寄存器入栈的顺序结构相同.详细说明请参考所用处理器的手册。 133 * 参数: task 是指向任务代码的指针。 135 * pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。下例中说明uC/OS中的任务结构以及如何传递参数pdata: 137 * void Task (void *pdata) 138 * { 139 * ... // 对参数'pdata'进行操作 140 * for (;;) { // 任务函数体. 143 * // 在任务体中必须调用如下函数之一: 144 * // OSMboxPend() 用于任务等待消息,消息通过中断或另外的任务发送给需要的任务 145 * // OSFlgPend() 用于任务等待事件标志中的事件标志 146 * // OSMutexPend() 任务需要独占资源 147 * // OSQPend() 用于任务等待消息 148 * // OSSemPend() 用于任务试图取得共享资源的使用权,任务需要与其它任务或中断 149 * 同步及任务需要等待特定事件的发生场合 150 * // OS timeDly() 任务延时若干时钟节拍 151 * // OSTimeDlyHMSM() 任务延时若干时间 152 * // OSTaskSuspend() 挂起任务本身 153 * // OSTaskDel() 删除任务本身 154 * ... 156 * } 157 * ptos 为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址以及任务被中断时的CPU寄存器内容.任务堆栈的大小决定于任务的需要及预计的中断嵌套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长,此时ptos应该指向任务堆栈空间的最高地址。反之,如果OS_STK_GROWTH设为0,堆栈将从内存的低地址向高地址增长。 164 * prio 为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。 166 * 返回: OS_NO_ERR 函数调用成功; 167 * OS_PRIO_EXIT 具有该优先级的任务已经存在; 168 * OS_PRIO_INVALID 参数指定的优先级大于OS_LOWEST_PRIO; (i.e. >= OS_LOWEST_PRIO) 169 * OS_NO_MORE_TCB 系统中没有OS_TCB可以分配给任务了。 170 * 171 * 注意: 1、任务堆栈必须声明为OS_STK类型。 172 * 2、在任务中必须调用uC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信 173 * 号量,消息邮箱、消息队列),以使其他任务得到CPU。 174 * 3、用户程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS系统保留,其余的56个优先级提供给应用程序。 177 ***********************************************************************************/ 181 INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 10); 1.3建立带扩展任务 221 **************************************************************************************** 222 * CREATE A TASK (Extended Version) 224 * 描述: 建立一个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许用户设置更多的细节内容.任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立,但中断处理程序中不能建立新任务。一个任务必须为无限循环结构(如下所示),且不能有返回点。 228 * 参数: task 是指向任务代码的指针。 230 * pdata Pdata指针指向一个数据结构,该结构用来在建立任务时向任务传递参数。下例中说 231 * 明uC/OS中的任务代码结构以及如何传递参数pdata:(如果在程序中不使用参数pdata, 232 * 为了避免在编译中出现"参数未使用"的警告信息,可以写一句pdata= pdata;) 233 * void Task (void *pdata) 234 * { 235 * ... //对参数pdata进行操作,例如pdata= pdata 236 * for (;;) { // 任务函数体.总是为无限循环结构 252 * } 253 * } 254 * ptos 为指向任务堆栈栈顶的指针.任务堆栈用来保存局部变量,函数参数,返回地址以及中断时的CPU寄存器内容.任务堆栈的大小决定于任务的需要及预计的中断嵌套层数.计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间.如果初始化常量OS_STK_GROWTH设为1,堆栈被设为向低端增长(从内存高地址向低地址增长).此时ptos应该指向任务堆栈空间的最高地址.反之, 如果OS_STK_GROWTH设为0,堆栈将从低地址向高地址增长. 261 * prio 任务的优先级。每个任务必须有一个唯一的优先级作为标识.数字越小,优先级越高。 263 * id 是任务的标识,目前这个参数没有实际的用途,但保留在OSTaskCreateExt()中供今后扩展,应用程序中可设置id与优先级相同.(0..65535) 266 * pbos 为指向堆栈底端的指针。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长.此时pbos应该指向任务堆栈空间的最低地址.反之,如果OS_STK_GROWTH设为0,堆栈将从低地址向高地址增长。pbos应该指向堆栈空间的最高地址.参数pbos用于堆栈检测函数OSTaskStkChk(). 271 * stk_size 指定任务堆栈的大小。其单位由OS_STK定义:当OS_STK的类型定义为INT8U、INT16U、 272 * INT32U的时候, stk_size的单位为分别为字节(8位)、字(16位)和双字(32位)。 274 * pext 是一个用户定义数据结构的指针,可作为TCB的扩展。例如,当任务切换时,用户定义 275 * 的数据结构中可存放浮点寄存器的数值,任务运行时间,任务切入次数等等信息。 277 * opt 存放与任务相关的操作信息。opt的低8位由uC/OS保留,用户不能使用。用户可以使用 278 * opt的高8位。每一种操作由opt中的一位或几位指定,当相应的位被置位时,表示选择 279 * 某种操作。当前的μC/OS版本支持下列操作: 280 * OS_TASK_OPT_STK_CHK:决定是否进行任务堆栈检查; 281 * OS_TASK_OPT_STK_CLR:决定是否清空堆栈; 282 * OS_TASK_OPT_SAVE_FP:决定是否保存浮点寄存器的数值。此项操作仅当处理器有浮 283 * 点硬件时有效。保存操作由硬件相关的代码完成。 286 * 返回: OS_NO_ERR:函数调用成功; 287 *
|