互斥锁(Mutex)
互斥锁用于保护共享资源,确保同一时刻只有一个任务进入临界区, 避免并发访问导致的数据冲突与不一致问题。
机制定义
Mutex = 加锁 → 独占访问 → 解锁 → 任务调度恢复
触发场景
共享变量访问
多任务同时读写共享数据结构
外设访问控制
UART / SPI / I2C 资源竞争
临界区保护
防止中断/切换导致数据破坏
任务同步
控制执行顺序与资源占用
执行流程
1. 初始化 Mutex
创建互斥锁对象
2. 尝试加锁
进入竞争或阻塞
3. 进入临界区
独占访问共享资源
4. 释放锁
归还资源控制权
5. 恢复调度
继续任务切换
演示代码
#include "hrtos.h"
#define MUTEX_ID 0
sbit LED_T1 = P1^0;
sbit LED_T2 = P1^1;
sbit LED_CS = P1^2;
void task1(void)
{
while(1)
{
if(os_mutex_lock(MUTEX_ID))
{
LED_T1 = 1;
LED_CS = 1;
os_delay(3);
LED_T1 = 0;
LED_CS = 0;
os_mutex_unlock(MUTEX_ID);
}
else
{
LED_T1 = ~LED_T1;
}
os_delay(4);
}
}
void task2(void)
{
while(1)
{
if(os_mutex_lock(MUTEX_ID))
{
LED_T2 = 1;
LED_CS = 1;
os_delay(3);
LED_T2 = 0;
LED_CS = 0;
os_mutex_unlock(MUTEX_ID);
}
else
{
LED_T2 = ~LED_T2;
}
os_delay(4);
}
}
void hrtos_main(void)
{
os_mutex_init(MUTEX_ID);
os_task_create((unsigned int)task1, 1, 3, 5);
os_task_create((unsigned int)task2, 2, 2, 5);
}
API 参考
初始化
os_mutex_init()
加锁
os_mutex_lock()
解锁
os_mutex_unlock()
Mutex vs Semaphore
Mutex
具有所有权的互斥访问机制
Semaphore
资源计数型同步机制
系统意义
Mutex 是 RTOS 核心同步机制,用于保证共享资源一致性, 避免竞态条件,提高系统可靠性。