uc-os-ii Task模块详解

    对于uc-os-ii系统的任务模块,其主要有创建任务、删除任务、挂起任务、恢复任务等函数组成。任务模块其主要作用:所有应用层程序在的运行,一般使用一个for循环或while循环,一旦任务开始运行,只要不被删除,则不会退出来;使用时间延迟函数OSTimeDly (INT16U ticks)、OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)暂停任务执行。下面详细介解说任务模块相关函数,具体代码可以参考下面资源:

https://download.csdn.net/download/qq_35715756/11252324

1.INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
任务创建函数用来创建一个可执行任务,主要包括任务结构体、任务的优先级分配、任务堆栈分配,具体步骤如下:
①任务优先级进行检查;

②检查该优先级的结构体链表是否被使用,若没有使用,则占用;

③给任务分配堆栈,用于存储CPU相关的寄存器,主要在任务切换时把相关CPU 寄存器推入栈中,当该任务再次被执行,从栈中取出,继续执行。
另一个任务创建函数为OSTaskCreateExt (···)可扩展任务创建,增加了相关ID,目前与一般任务创建不同的地方是堆栈的清零操作,以及增加低端堆栈指针赋值。

2.INT8U OSTaskDelReq (INT8U prio)
删除任务,不再讲解OSTaskDel(···)函数,该函数一般与OSTaskDelReq (···)配合使用。因为若直接使用OSTaskDel(···)函数,则直接删除掉任务,若任务占用其他资源,则其他资源无法释放,而OSTaskDelReq (···)会先请求删除任务,等资源释放后,任务再次调用OSTaskDel(···)函数删除任务。
举一个粒子,任务A和任务B,任务A想删除任务B,那么任务A中会存在OSTaskDelReq (···)函数,任务B中也会存在该函数,当任务A把请求状态赋值给任务B的结构体,任务B检测到请求删除的状态,则释放任务B占用的相关资源,而后调用OSTaskDel (···)删除任务B。
任务A:
if()
{
while( OSTaskDelReq(prio_A)!=OS_TASK_NOT_Exist )
{
OSTmeDly(1);
}
}
任务B:
if(OSTaskDelReq(OS_PRIO_SELF)!=OS_TASK_DEL_REQ )
{
释放资源;
释放动态内存;
OSTaskDel(OS_PRIO);
}

3.INT8U OSTaskSuspend (INT8U prio)
任务被挂起,是指目前的任务不再继续执行,而执行目前任务就绪表中优先级最高的任务,当前任务挂起可以被自己挂起或其他任务挂起。任务挂起函数的具体步骤如下:
①空闲任务不能被挂起,因为当没有任务执行时,则空闲任务执行,CPU不可能停止,且使用空闲任务与统计任务可用了解CPU的利用率;

②判断挂起任务调用来自自身还是其他任务,若是自身,则在执行该函数结束时,进行任务切换;

③删除任务在就绪表中的标志。

4.INT8U OSTaskResume (INT8U prio)
恢复任务主要是取消任务的状态中任务挂起这一状态,至于是否任务恢复后就立即执行或者是放入任务就绪表,还需要看任务的延迟时间,以及任务是否还存在其他状态。具体步骤如下:
①任务优先级检查以及判断该任务是否存在;

②判断任务的状态,取消任务挂起状态;

③若任务存在其他状态(如:任务之间通讯状态或时间延迟),则不把当前任务放入就绪表,否则放入任务就绪表,等待任务被执行。

5.其他
任务模块还存在其他函数,如:改变任务的优先级、取得任务的相关信息、任务堆栈检查等。

总结:对于任务模块的调用,最常用的则是创建任务、挂起任务、恢复任务,当可以灵活使用这三个函数后,可再调用其他函数来调试。欢迎大家指指正、交流。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值