信号量机制(Semaphore)
信号量用于任务同步与资源管理,通过计数机制控制并发访问, 实现阻塞、唤醒与调度协作。
机制定义
Semaphore = 资源计数 + 阻塞队列 + 唤醒机制 + 调度联动
在 HRTOS 中,信号量是最基础的同步工具,用于解决任务间资源竞争问题。
核心行为
申请资源
计数>0则获取成功,否则阻塞。
任务阻塞
无资源时进入等待队列。
释放资源
计数增加并唤醒等待任务。
任务恢复
被唤醒任务重新进入调度。
执行流程
1. 初始化信号量
设置初始资源数量。
2. 任务申请
尝试获取资源。
3. 阻塞等待
资源不足进入等待队列。
4. 释放资源
资源释放触发唤醒。
系统关系模型
Task → Semaphore → Scheduler → Task
演示代码
#include "hrtos.h"
#define SEM_ID 0
sbit LED_PRODUCER = P1^0;
sbit LED_CONSUMER = P1^1;
sbit LED_SEM = P1^2; // semaphore state indicator
/* 生产者任务 */
void task_A(void)
{
while(1)
{
os_delay(2);
os_sem_post(SEM_ID);
LED_PRODUCER = ~LED_PRODUCER; // 生产节奏闪烁
LED_SEM = 1; // 表示资源“被释放/可用”
}
}
/* 消费者任务 */
void task_B(void)
{
while(1)
{
/* 等待资源 */
if(os_sem_wait(SEM_ID))
{
/* 获取资源成功 */
LED_CONSUMER = ~LED_CONSUMER; // 消费节奏
LED_SEM = 0; // 表示资源被消耗
/* 模拟处理 */
os_delay(1);
}
os_delay(1);
}
}
/* 系统入口 */
void hrtos_main(void)
{
LED_PRODUCER = 0;
LED_CONSUMER = 0;
LED_SEM = 0;
os_sem_init(SEM_ID, 0);
os_task_create((unsigned int)task_A, 1, 3, 5);
os_task_create((unsigned int)task_B, 2, 2, 5);
}
系统意义
信号量是 RTOS 并发控制的基础机制之一, 用于保证任务间同步执行与资源安全访问, 对系统稳定性与实时性具有关键作用。