1. 信号量
(1)uc/os-ii的信号量是由两个部分组成:一部分是16位的无符号整型信号量的计数值(0~65535);另一部分是等候该信号量的使命组成的等候使命表。(别的参阅事情操控块ECB)
(2)信号量可所以2值的变量(称为二值信号量),也可所以计数式的。依据信号量的值,内核盯梢那些等候信号量的使命。
(3)树立信号量的作业有必要在使命级代码中或许多使命发动之前完结。
(4)使命要得到信号量的问题。
想得到信号量的使命,有必要履行等候操作(pend)。假如信号量有用(非0),则信号量减1,使命得以持续运转。假如信号量无效,则等候信号量的使命就被列入等候信号量的使命表中。多少内核答应界说等候超时,当等候时间超过了设定值,该信号量仍是无效,则等候该信号量的使命进入安排妥当态,预备运转,并回来犯错代码(等候超时过错)。
(5)使命对信号量的开释问题。
使命履行发信号(post)操作来开释信号量。假如没有使命等候信号量,那么信号量的值仅是简略的加1(则信号量大于0,有用);假如有使命等候该信号量,那么就会有另一个使命进入安排妥当态,信号量的值就不加1。
之后,这个开释的信号量给那个等候中的使命,要看内核怎么调度的。收到信号量的使命或许如下:
◆等候使命中,优先级最高的;(uc/os-ii仅支撑这种方法)。
◆等候使命中所有等候该信号量的使命
2. 信号量的有用与无效问题
信号量有用:信号量的计算器非0(.OSEventCnt!=0)。信号量有用表明使命对 资源可用。
信号量无效:信号量的计算器为0。信号量无效表明使命对现在资源不可用,需 要等候其他另一个使命(或许中止服务子程序)宣布该信号量
3. 信号量的值(.OSEventCnt)巨细表明什么?
①二值信号量,表明使命能够独占共享资源。
②计数式信号量,用于某资源可一起为N个使命所用。
4. 信号量有关的三个重要函数剖析
◆OSSemCreate() 创立一个信号量 (注:由使命或发动代码操作)
创立作业有必要在使命级代码中或许多使命发动之前完结。功用只要是先获取一个事情操控块ECB,写入一些参数。其间调用了OS_EeventWaitListInt()函数,对事情操控块的等候使命列表进行初始化。完结初始化作业后,回来一个该信号量的句柄(Handle)。
◆OSSemPend() 等候一个信号量 (注:只能由使命操作)
本函数应用于使命企图取得共享资源的使用权、使命需求与其他使命或中止同步及使命需求等候特定事情产生的场合。
假如使命Task_A调用OSSemPend(),且信号量的值有用(非0),那么OSSemPend()递减信号量计数器(.OSEventCnt),并回来该值。换句话说,Task_A获取到共享资源的使用权了,之后就履行该资源。
假如假如使命Task_A调用OSSemPend(),信号量无效(为0),那么OSSemPend()调用OS_EventTaskWait()函数,把Task_A放入等候列表中。(等候到什么时候呢?要看OSSemPost()(或许等候超时状况),由它开释信号量并查看使命履行权,见下材料)
◆OSSemPost() 宣布(开释)一个信号量 (注:由使命或中止操作)
本函数其间调用OS_EventTaskRdy()函数,把优先级最高的使命Task_A(在这假如是Task_A,别的假定当时调用OSSemPost()的使命是Task_B)从等候使命列表中去除,并使它进入安排妥当态。然后调用OSSched()进行使命调度。假如Task_A是当时安排妥当态中优先级最高的使命,则内核履行Task_A;不然,OSSched()直接回来,Task_B持续履行。