UCOS-API函数1
一、任务管理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 * // OSTimeDly() 任务延时若干时钟节拍
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 *
谢谢了,学习了一下