# Task中二進制信號量怎么用
## 1. 二進制信號量概述
二進制信號量(Binary Semaphore)是嵌入式實時操作系統(RTOS)中最基礎的同步機制之一,特別適用于任務間的簡單同步和互斥訪問。與計數信號量不同,二進制信號量只有兩種狀態:
- **0(不可用)**
- **1(可用)**
其核心特點是:
- 輕量級,占用資源少
- 解決任務間"生產者-消費者"問題
- 實現臨界資源互斥訪問
## 2. 二進制信號量的典型應用場景
### 2.1 任務同步
```c
// 示例:任務A完成后通知任務B
void TaskA(void *p) {
while(1) {
// 執行操作...
xSemaphoreGive(binSem); // 釋放信號量
}
}
void TaskB(void *p) {
while(1) {
xSemaphoreTake(binSem, portMAX_DELAY); // 等待信號量
// 收到信號后執行操作...
}
}
// 保護共享資源
void AccessResource(void) {
xSemaphoreTake(mutexSem, portMAX_DELAY);
// 臨界區操作
xSemaphoreGive(mutexSem);
}
#include "FreeRTOS.h"
#include "semphr.h"
SemaphoreHandle_t xBinarySemaphore;
void vCreateSemaphore(void) {
/* 創建二進制信號量 */
xBinarySemaphore = xSemaphoreCreateBinary();
/* 創建后初始狀態為0,通常需要手動釋放 */
xSemaphoreGive(xBinarySemaphore);
}
API函數 | 參數說明 | 返回值 |
---|---|---|
xSemaphoreTake() |
xSemaphore: 信號量句柄 xTicksToWait: 阻塞時間 |
pdTRUE: 獲取成功 pdFALSE: 超時 |
xSemaphoreGive() |
xSemaphore: 信號量句柄 | pdTRUE: 釋放成功 pdFALSE: 失敗 |
xSemaphoreGiveFromISR() |
xSemaphore: 信號量句柄 pxHigherPriorityTaskWoken: 是否需要上下文切換 |
同上 |
// 硬件中斷中釋放信號量
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(btnSem, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
// 任務中等待按鍵
void KeyProcessTask(void *p) {
while(1) {
if(xSemaphoreTake(btnSem, pdMS_TO_TICKS(100)) {
// 處理按鍵事件
}
}
}
SemaphoreHandle_t uartSem;
void UART_Send(const char *data) {
xSemaphoreTake(uartSem, portMAX_DELAY);
HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), 100);
xSemaphoreGive(uartSem);
}
現象:多次Give但只生效一次
解決方案:
- 檢查是否在Give前信號量已為1狀態
- 改用計數信號量(xSemaphoreCreateCounting)
優化建議:
graph TD
A[高優先級任務] -->|等待| B[信號量]
C[低優先級任務] -->|持有| B
D[中優先級任務] --> 可能搶占C
機制 | 適用場景 | 特點 |
---|---|---|
二進制信號量 | 簡單同步 | 只有0/1兩種狀態 |
互斥量 | 資源保護 | 支持優先級繼承 |
事件組 | 多條件觸發 | 可同時等待多個事件 |
sem
前綴,如semUart
、semButton
#define SEM_WT_TIME pdMS_TO_TICKS(100)
if(xSemaphoreTake(sem, SEM_WT_TIME) == pdTRUE) {
// 成功獲取
}
if(xSemaphoreGive(sem) != pdPASS) {
// 錯誤處理代碼
}
StaticSemaphore_t xSemaphoreBuffer;
xBinarySemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer);
二進制信號量作為RTOS的基礎同步原語,其正確使用對系統穩定性至關重要。建議開發者: 1. 充分理解信號量的狀態變化機制 2. 通過實際項目積累調試經驗 3. 必要時使用FreeRTOS的Trace功能分析信號量使用情況 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。