UC/OS-II中的任务(三)

来源:互联网 发布:2016全球网络摄影大赛 编辑:程序博客网 时间:2024/05/18 02:40

2.5  任务的创建

创建任务的工作实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。

2.5.1  用函数OSTaskCreate()创建工作

该函数对待创建任务的优先级别进行一系列判断,确认该优先级别合法且未被使用后,随机调用函数OSTaskStkInit()和OSTCBInit()对任务堆栈和任务控制块进行初始化。初始话成功后,不仅要把任务计数器加1 ,还有进一步判断的核是否在运行状态,若在运行,则用 OSSched()进行任务调度。

调用函数OSTaskCreate()成功后,将返回OS_NO_ERR;,否则,返回OS_PRIO_INVALID,OS_PRIO_EXIST及在函数内调用任务控制块初始化函数失败时返回的信息。

2.5.2  用函数OSTaskCreateExt()创建任务

2.5.3 创建任务的一般方法

在调用OSStart()之前,必须已经创建了至少一个任务,并赋予它最高优先级别,不允许在中断服务程序中创建任务。

PC功能函数提供了三类服务:字符显示、运行时间测量和其他服务

2.6任务的挂起与恢复

挂起任务:停止这个任务的运行。

系统提供的函数OSTaskSuspend()来挂起自身或者除空闲任务之外的其他任务。用函数OSTaskSuspend()挂起的任务,只能在其他任务中通过调用恢复函数OSTaskResume()使其恢复为就绪状态。

任务在运行状态,就绪状态和等待状态之间的转移关系如下图所示:

2.6.1 挂起任务

挂起任务函数OSTaskSuspend()的原型如下:

挂起任务:

INT8U OSTaskSuspend(INTBU prio);

如果调用函数OSTaskSuspend()的任务要挂起自身,则参数必须为常数OS_PRIO_SELF(该常数在文件UCOS-II.H中被定义为0xFF)

函数OSTaskSuspend()的流程图

2.6.2 恢复任务

OSTaskResume()

INT8U  OSTaskResume (INT8U prio);

2.7  其他任务管理函数

2.7.1  任务优先级别的修改

每一个任务都有一个优先级别,优先级别可改变,函数OSTaskChangePrio()来改变任务的优先级。

OSTaskChangePrio()的原型如下:

INT8U OSTaskChangePrio(

                       INT8U oldprio,

                       INT8U newprio

                     );

若调用函数成功,则函数返回OS_NO_ERR.

2.7.2  任务的删除

删除任务:将该任务置于睡眠状态。

具体做法:将被删除任务的任务控制块从任务控制块链表中删除,并归还给空任务控制块链表,然后再任务就绪表中把该任务的就绪状态位置0,于是该任务就不能被调用了。

在任务中,调用函数OSTaskDel()来删除任务自身或者除了空闲任务的其他任务。

#if OS_TASK_DEL_EN

INT8U OSTaskDel(

                 INT8U  prio

              );

若任务调用函数删除自己,则在调用函数时令函数的参数prio为OS_PRIO_SELF.

μC/OS-Ⅱ利用被删除任务的任务控制块成员OSTCBDelReq作为请求删除方的被删除方的联络信号,同时提供了一个函数OSTaskDelReq(),双方都能访问OSTCBDelReq信号,从而根据信号的状态决定各自的行为。

INTBU OSTaskDelReq(INTBU prio);

函数OSTaskDelReq()的流程图

 

 2.7.3 查询任务的信息 

函数OSTaskQuery()来获取选定的任务的信息,原型如下:

INT8U OSTaskQuery(

                   INT8U prio,

                   OS_TCB  *pdata

                 );

函数调用成功,将返回OS_NO_ERR,把结果存放在结构OS_TCB类型的变量中。

 

2.8 UCOS-II的初始化和任务的启动

2.8.1 UCOS-II的初始化

 使用OSInit()初始化μC/OS-Ⅱ自身的运行环境,将对所有全局变量和数据结构进行初始化,并创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远的就绪状态。

主要是创建包括空任务控制块链表在内的5个空数据缓冲区,还要创建一个数组OSTCBPrioTbl[OS_LOWEST_PRIO + 1](按任务的优先级别的顺序把任务控制块的指针存放在对应的元素中)。

2.8.2 UCOS-II的启动

UCOS-II进行任务的管理是从调用启动函数OSSstart()开始的,前提条件是在调用该函数之前至少创建一个用户任务。




0 0
原创粉丝点击