首页 > 试题广场 >

在μCOS-II操作系统下,能使运行态任务转入等待态的系统

[单选题]
在μC/OS-II操作系统下,能使运行态任务转入等待态的系统函数是(  )。
  • OSSemPost()
  • OSTaskCreate()
  • OSTaskDel()
  • OSTimeDly()
等待信号量函数OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
发送信号量函数OSSemPost (OS_EVENT *pevent)
信号量挂起函数OSSemPost()如果我们想对一个公共资源进行互斥访问,例如:如果我们想让两个任务Task1和Task2都可以调用Fun()函数,但不能同时调用,最好定义Semp = OSSemCreate(1),同理在各自的任务中都需要调用OSSemPend(Semp,0,&err)请求此信号量,如果可用,则调用Fun(),然后再调用OSSemPost(Semp)释放该信号量。这里就实现了一个资源的互斥访问。(注:初始化OSSemCreate(1),那么一个任务中有OSSemPend,那么可以执行,执行之后cnt==0,其他任务的OSSemPend无法获得sem,只能等待,除非任务一有OSSemPost,使其cnt++,这样其他任务的Pend可以执行。)

任务创建函数OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)
创建 task任务,设置优先级prio,参数表第一个是指向该任务运行代码的指针,第二个是指向数据初始化的指针,第三个是任务堆栈的栈顶,第四个是任务优先级

任务删除函数OSTaskDel
在uc/os中任务的删除是任务创建的逆过程,主要是取消就续表、就绪组的标志,删除就绪链
在uc/os中删除一个任务,一般情况下是自己删除自己。如果任务A直接调用OSTaskDel (INT8U prio)函数来直接删除任务B,任务B占用的资源会得不到释放,系统到最后会没有内存可用。所以当任务A想要删除任务B的时候,会调用OSTaskDelReq (INT8U prio)函数来请求任务B删除自己,比如B的优先级是10,即调用OSTaskDelReq (10)。

任务延时函数OSTimeDly用于阻塞任务一定时间,将任务转入等待。
这个时间以参数的形式给出,如果这个参数的值是N,那么在N个时间片(时钟滴答)之后,任务才能回到就绪态获得继续运行的机会。
——操作系统在每个时钟中断都要对每个OSTCBDly大于0的任务块的OSTCBDly进行减1操作和进行调度,那么当任务的延迟时间到了的时候(OSTCBDly为0)就可以恢复到就绪态。
发表于 2020-07-29 16:23:17 回复(0)