rtems;:信号量管理操作
13.3: 操作
%A
%A 创造一个信号量
%A
%A 获得信号量ID标识
%A
%A 获得一个信号量
%A
%A 释放一个信号量
%A
%A 删除一个信号量
%A 13.3.1: 创造一个信号量
%A
%A rtems_semaphore_create函数创建一个由用户命名的信号量,并且对其进行初始化。如果一个二进位的信号量被初始化为0那么信号量的创建者就会被认为同时也是信号量的占用者。创建信号量的同时也需要说明需要信号量的任务按照什么方式排序(FIFO 或任务优先级排序)。此外,应该使用优先级继承还是优先级高度协议。如果使用优先级高度协议,就必须制定优先级高度。RTEMS 将会从信号量控制块(SMCB)链表中分配一个空闲控制块块,用于对信号量进行管理。信号量的ID将会返回给调用者。
%A 13.3.2: 获得信号量ID标识
%A
%A 当一个信号量被产生的时候, RTEMS 产生一个独特的信号量 ID标识,信号量删除的时候,该ID也会无效。信号量的ID标识可使用二种方法获得。首先,rtems_semaphore_create函数调用时,ID将在参数列表中以指针的形式回传。其次,信号量 ID标识可可以使用 rtems_semaphore_ident 函数获取。信号量ID标识用于其他任务对该信号量进行操作。
%A 13.3.3: 获得一个信号量
%A
%A rtems_semaphore_obtain 函数是用来获得指定的信号量。 rtems_semaphore_obtain 函数可以被简单的描述为:
%A
%A if
%A
%A 信号量的计数大于零
%A
%A then
%A
%A 减少信号量的计数
%A
%A else
%A
%A 等候信号量释放
%A
%A return SUCCESSFUL
%A
%A 当不能够立刻获得信号量的时候,RTEMS将会将会采取下面的行为:
%A
%A • 缺省状态任务将会死等直到信号量被释放
%A
%A • 如果信号来使用RTEMS_NO_WAIT创建,那么将立即返回错误码
%A
%A • 如果有返回时间限制,那么在返回前,会等待一定时间
%A
%A 如果任务要等候获得信号量,那么它将被放在信号量等待队列中(按照FIFO或任务优先级排序)。使用优先级继承时,如果高优先级的任务阻塞等候一个二进位的信号量,那么该任务的优先级将会被正在执行的任务继承。如果信号量已经被删除,那么所有等待的任务将会得到一个错误返回。
%A
%A 当使用优先级高度协议时,如果一个任务成功地获得信号量,那么他将会比较该信号量的优先级高度和自己的优先级,如果自己的优先级低,那么他会提高自己的优先级。
%A 13.3.4: 释放一个信号量
%A
%A rtems_semaphore_release 函数是用来释放指定的信号量。 rtems_semaphore_release 函数流程如下:
%A
%A if
%A
%A 没有任务正在等候该信号量
%A
%A then
%A
%A 增量信号量的计数
%A
%A else
%A
%A 将信号量分配等待任务
%A
%A return SUCCESSFUL
%A
%A 信号量使用了优先级继承或者优先级高度算法,那么任务释放信号量后需要将自己的优先级恢复。
%A 13.3.5: 删除一个信号量
%A
%A rtems_semaphore_delete 函数将信号量从系统中删除,并且释放它的控制块。一个信号量能被任何一个知到其ID的任务删除。一旦信号量删除,所有等待的任务都将回到就绪态,并且 rtems_semaphore_obtain的返回值表明信号量已经被删除。删除后信号量的ID就无效了。
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。