微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > UCOS-API函数1

UCOS-API函数1

时间:10-02 整理:3721RD 点击:

一、任务管理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 *

谢谢了,学习了一下

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top