1. 信号量与互斥量:嵌入式开发的同步基石
在嵌入式系统中,多个任务共享硬件资源是常态。想象一下,两个任务同时操作串口发送数据会发生什么?数据混叠、通信失败——这就是典型的资源竞争场景。FreeRTOS通过信号量和互斥量提供了优雅的解决方案,它们就像交通信号灯,协调着任务对共享资源的访问秩序。
信号量的本质是一个计数器。计数型信号量(Counting Semaphore)允许计数值从0到设定最大值,适合管理有限资源池,比如缓冲区块数量。二进制信号量(Binary Semaphore)则是计数型信号量的特例,计数值只有0和1两种状态,常用于任务同步。创建信号量时,xSemaphoreCreateCounting(10, 0)的第一个参数设定最大值,第二个是初始值。
互斥量(Mutex)是特殊的二进制信号量,核心区别在于它实现了优先级继承机制。当高优先级任务因低优先级任务持有锁而阻塞时,低优先级任务会临时继承高优先级,避免"优先级反转"问题。这种机制就像救护车优先通过路口——普通车辆(低优先级任务)获得临时通行权(优先级提升)以快速让出道路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 计数型信号量的实战应用
2.1 生产者-消费者模型实现
在数据采集系统中,ADC任务(生产者)和数据处理任务(消费者)的典型场景中,计数型信号量能完美匹配。以下是具体实现步骤:
c复制// 创建最大计数值为5的信号量
SemaphoreHandle_t xDataSemaphore = xSemaphoreCreateCounting(5, 0);
void vADCTask(void *pvParameters) {
while(1) {
uint16_t adcValue = ReadADC();
PushToBuffer(adcValue); // 数据存入缓冲区
xSemaphoreGive(xDataSemaphore); // 计数值+1
vTaskDelay(pdMS_TO_TICKS(10));
}
}
void vProcessTask(void *pvParameters) {
while(1) {
if(xSemaphoreTake(xDataSema
