信号量:实用服务和数据结构
查看 RTOS Revealed 系列
本文继续介绍信号量。
信号量实用服务
Nucleus RTOS 有四个 API 调用,它们提供与信号量相关的实用功能:重置信号量、返回有关信号量的信息、返回应用程序中的信号量数量以及返回指向应用程序中所有信号量的指针。其中前三个在 Nucleus SE 中实现。
重置信号量
此 API 调用将信号量恢复到其初始未使用状态。与可用于其他内核对象的 API 函数相比,此 API 函数是不寻常的,因为虽然它是一个重置,但它并不简单地将其计数器初始化为启动值;调用中提供了新的初始计数。任何在信号量上暂停的任务都将恢复并收到 NUSE_SEMAPHORE_WAS_RESET 的返回代码 (在 Nucleus SE 中,或 NU_SEMAPHORE_RESET 与核实时操作系统)。
用于重置信号量的 Nucleus RTOS API 调用
服务调用原型:
状态 NU_Reset_Semaphore(NU_SEMAPHORE *semaphore,
UNSIGNED initial_count);
参数:
信号量 – 指向用户提供的信号量控制块的指针
initial_count – 要设置信号量计数器的值
退货:
NU_SUCCESS – 通话成功
NU_INVALID_SEMAPHORE – 信号量指针无效
用于重置信号量的 Nucleus SE API 调用
此 API 调用支持 Nucleus RTOS API 的关键功能。
服务调用原型:
STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE 信号量,
U8 initial_count);
参数:
信号量 – 要重置的信号量的索引(ID)
initial_count – 要设置信号量计数器的值
退货:
NUSE_SUCCESS – 通话成功
NUSE_INVALID_SEMAPHORE – 信号量索引无效
Nucleus SE 实现信号量重置
NUSE_Semaphore_Reset() 的主要工作 API 函数 - 在参数检查之后 - 只是在 NUSE_Semaphore_Counter[] 中设置适当的条目 到提供的初始值。
启用阻塞后,需要进一步的代码来解除阻塞任务:
while (NUSE_Semaphore_Blocking_Count[semaphore] !=0){ U8 index; /* 检查是否有任务被阻塞 */ /* 在这个信号量上 */ for (index=0; index在信号量上挂起的每个任务都标记为“就绪”,挂起返回代码为 NUSE_SEMAPHORE_WAS_RESET .此过程完成后,如果优先级调度程序正在使用中,则会调用 NUSE_Reschedule() ,因为一个或多个优先级更高的任务可能已准备就绪,需要允许运行。
信号量信息
此服务调用获取有关信号量的信息选择。 Nucleus SE 实现与 Nucleus RTOS 的不同之处在于它返回的信息较少,因为不支持对象命名和挂起顺序,并且可能无法启用任务挂起。
Nucleus RTOS API 调用信号量信息
服务调用原型:
STATUS NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);参数:
信号量 – 指针指向正在请求信息的信号量的控制块
姓名 – 指向信号量名称的 8 个字符的目标区域的指针;这包括空终止符的空间
current_count – 一个指向变量的指针,它将接收信号量计数器的当前值
暂停类型 – 指向保存任务挂起类型的变量的指针;有效的任务挂起类型为 NU_FIFO 和 NU_PRIORITY
tasks_waiting – 一个指向变量的指针,该变量将接收在此信号量上挂起的任务数
first_task – 指向 NU_TASK 类型变量的指针 它将接收一个指向第一个挂起任务的控制块的指针
退货:
NU_SUCCESS – 通话成功
NU_INVALID_SEMAPHORE – 信号量指针无效
Nucleus SE API 调用信号量信息
此 API 调用支持 Nucleus RTOS API 的关键功能。
服务调用原型:
STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE 信号量,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);参数:
信号量 – 正在请求信息的信号量的索引
current_count – 一个指向变量的指针,它将接收信号量计数器的当前值
tasks_waiting – 一个指向变量的指针,该变量将接收在此信号量上挂起的任务数(如果任务挂起被禁用,则不返回任何内容)
first_task – 指向 NUSE_TASK 类型变量的指针 它将接收第一个挂起任务的索引(如果禁用了任务挂起,则不返回任何内容)
退货:
NUSE_SUCCESS – 通话成功
NUSE_INVALID_SEMAPHORE – 信号量索引无效
NUSE_INVALID_POINTER – 一个或多个指针参数无效
Nucleus SE 实现信号量信息
这个 API 调用的实现非常简单:
NUSE_CS_Enter(); *current_count =NUSE_Semaphore_Counter[semaphore];#if NUSE_BLOCKING_ENABLE *tasks_waiting =NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] !=0) { U8 index; for (index=0; index该函数返回信号量状态。然后,如果启用阻塞API调用,则返回等待任务的数量和第一个的索引(否则这两个参数设置为0)。
获取信号量的数量
此服务调用返回应用程序中配置的信号量数。虽然在 Nucleus RTOS 中,这会随时间变化,返回值将代表当前信号量的数量,但在 Nucleus SE 中,返回值在构建时设置,不能更改。
Nucleus RTOS API 调用信号量计数
服务调用原型:
未签名的 NU_Established_Semaphores(VOID);
参数:
无
退货:
应用中创建的信号量数量
Nucleus SE API 调用信号量计数
此 API 调用支持 Nucleus RTOS API 的关键功能。
服务调用原型:
U8 NUSE_Semaphore_Count(void);
参数:
无
退货:
应用中配置的信号量数量
Nucleus SE 实现信号量计数
这个 API 调用的实现几乎非常简单:#define 的值 符号 NUSE_SEMAPHORE_NUMBER 被退回。
继续第二页:“数据结构”>>
嵌入式