电子系统(你懂的) 下载本文

共享资源,如果正在使用共享资源的任务优先级较低,当某时刻较高优先级的任务就绪将中断当前任务的执行,如果高优先级的任务也需要使用同一个共享资源,则因请求不到共享资源而处于持续请求状态;原来占用共享资源的任务因优先级低而处于等待CPU状态,这种情况下系统调度器不能实现上述两个任务的调度,而处于死锁状态。 (3)什么是优先级反转?

答:当信号量S用于保护共享资源时,如果某个任务请求到了信号量S,即这个任务将得到共享资源的使用权,此时将该任务的优先级临时提高到所有用户任务的优先级之上,或者提高到高于所有要访问该共享资源的任务优先级之上,总之,只有当该任务使用完共享资源并释放信号量之后,其他要访问该共享资源的任务才能得到调度执行。如果占用共享资源的任务优先级较低,则其优先级被临时提高,相对而言,其他访问该共享资源的任务优先级降低了,故称之为优先级反转。

(4)简述互斥信号量和信号量的区别是什么?

答:信号量的主要用途在于使一个任务同步另一个任务的执行。普通的信号量用于保护共享资源时易造成死锁,此时应使用互斥信号量。

把具有使任务发生优先级反转功能的信号量称为互斥信号量,互斥信号量专用于保护共享资源;互斥信号量本质上是一个二值信号量,与信号量的区别在于请求到互斥信号量的任务优先级会发生优先级反转。 (5)简述信号量和消息邮箱的区别?

答:信号量相当于一个全局计数器,只能同步两个任务,不能由一个任务向另一个任务传递更多的信息;而消息邮箱不但能同步任务,而且可以由一个任务通过消息邮箱向另一个任务传递数据信息,即所谓的“消息”;由于消息邮箱为全局的指针变量,较信号量更占内存,更重要的是,消息邮箱的访问速度比信号量慢。 (6)利用状态图说明μC/OS-II中任务有几种状态,各种状态之间如何切换? OSTimeDly等待态 OSTimeDlyHMSMOSTaskDelOSSemPend OSMutexPendOSTimeTick, OSTimeDlyResumeOSMboxPend OSSemPost, OSSemPendAbortOSQPendOSMutexPost, OSMboxPost OSFlagPendOSMboxPostOpt, OSMboxPendAbortOSEventPendMultiOSQPost, OSQPostFront OSTaskSuspendOSQPostOpt, OSQPendAbort OSFlagePost, OSTaskResumeOSTaskCreate 中断OSTaskCreateExt任务调度 休眠态或任务 未创建OSTaskDelOSTaskDel就绪态执行态中断态被高优先级就绪任务抢占CPUOSIntExit

(7)什么是调度器?

答:调度器就是任务间切换的一种规则,是由嵌入式实时操作系统完成的,在μC/OS-II中,当多个任务同时就绪时,优先级最高的任务得到CPU使用权而执行;当某一任务执行完成后,系统将再次查询就绪态的任务中优先级最高的任务,并将CPU使用权分配给它;当某一任务被中断而中断服务程序执行完毕后,该任务将与所有就绪态的任务一起被调度,即中断退出后,会查询就绪态的优先级最高的任务执行,如果被中断的任务具有最高优先级,则返回到那个任务执行,否则,将切换到其他最高优先级的任务执行。

(8)什么是空闲任务? 答:空闲任务是系统任务,当所有用户任务均处于等待态时,CPU就空闲下来,这时系统会提供一个所谓的空闲任务进入执行态。空闲任务的优先级最低,且永远处于就绪态中,如果就绪态中有用户任务出现,其优先级必然比空闲任务高,从而抢到CPU使用权而得到执行;当就绪态中没有用户任务时,空闲任务成为唯一的就绪任务,此时它得到CPU使用权。 (9)什么是统计任务? 答: 统计任务为μC/OS-II系统任务,统计任务每0.1秒执行一次,用于计算CPU的利用率。

(10)举例说明信号量的使用方法?

答:首先,定义事件指针,例如“OS_EVENT *LedSem;”,这里LedSem为一个事件指针。其次,调用OSSemCreate函数创建信号量,例如“LedSem=OSSemCreate(0);”,此时LedSem被装入一个信号量,初始计数值为0。

然后,在一个任务中周期性地释放该信号量,例如“OSSemPost(LedSem);”。

最后,在另一个任务中请求该信号量,例如“OSSemPend(LedSem,0,&err);”。

(11)举例说明消息邮箱的使用方法?

答:首先,定义事件指针,例如:“OS_EVENT *LedMbox;”,这里LedMbox为一事件指针。

其次,使用消息邮箱前,必需调用OSMboxCreate函数创建消息邮箱,例如:“LedMbox = OSMboxCreate(NULL);”,表示创建一个空的消息邮箱,也可以在创建消息邮箱时给消息赋初值。

然后,在一个任务中定义一个一维数组,例如:“INT8U myMessage[80];”,将要传递出去的消息存入myMessage数组中,例如:“strcpy((char *)myMessage, “Led 1 Light!”);”,接着调用函数OSMboxPost周期地释放该消息,例如:“OSMboxPost(LedMbox, (void *)&myMessage[0]);”。

最后,在另一个任务中定义局部一维指针变量存放接收到的消息,例如“void *pmsg;”,调用函数OSMboxPend请求消息邮箱中的消息,例如:“pmsg = OSMboxPend(LedMbox, OS_TICKS_PER_SEC, &err);”,这样消息“Led 1 Light!”从别的任务传递到该任务中来。

(12)举例说明互斥信号量的使用方法?

首先,定义事件控制块指针,例如:“OS_EVENT *LedMutex;”。

其次,指定一个优先级号mx_prio作为优先级继承优先级PIP,该PIP的数值应小于所有请求共享资源的任务的优先级号。

然后,调用OSMutexCreate函数创建互斥信号量,例如“LedMutex=OSMutexCreate (mx_prio, &err);”。

最后,如果一任务要使用共享资源,应先调用OSMutexPend函数请求互斥信号量,请求到互斥信号量后,使用共享资源,使用完后再调用OSMutexPost函数释放互斥信号量。

例如:“OSMutexPend(LedMutex, 0, &err); rnd = myRand3(); // 使用共享资源 OSMutexPost(LedMutex); ”