本文是筆者在學習?正點原子官方?的《【正點原子】手把手教你學FreeRTOS實時系統》系列視頻時整理的筆記。
視頻講解清晰透徹,非常感謝UP主的無私奉獻!原課程鏈接如下:
👉 B站視頻鏈接:??????【正點原子】手把手教你學FreeRTOS實時系統_嗶哩嗶哩_bilibili
目錄
1、目的
2、核心代碼
3、結果
1、目的
2、核心代碼
①包含信號量的頭文件
②創建二值信號量
③任務1和任務2的功能編寫
信號量的代碼編寫與隊列的很類似。
//任務一:釋放二值信號量
void task1( void * pvParameters )
{u8 key;BaseType_t err;while(1){key = KEY_Scan(0);if(key == KEY0_PRES){err = xSemaphoreGive(semphore_handle);if(err == pdPASS){printf("信號量釋放成功!\r\n");}else{printf("信號量釋放失敗!\r\n");}}vTaskDelay(10);}
}//任務二:獲取二值信號量
void task2( void * pvParameters )
{BaseType_t err;while(1){err = xSemaphoreTake(semphore_handle,portMAX_DELAY);//獲取信號量并死等if(err == pdPASS){printf("獲取信號量成功!!\r\n");}else{printf("獲取信號量失敗!!\r\n");}}
}
3、結果
串口輸出結果如下:
為什么串口中輸出打印“獲取信號量成功”比“信號量釋放成功”排在前面呢?
因為任務二的優先級比任務一的高,任務二中如果一直獲取不到信號量就會一直死等,跳轉到任務一,一但KEY0按鍵按下,就會立刻釋放信號量,釋放完之后還沒來得及打印就會被任務二搶占,因此是等到任務二的輸出打印后任務一才開始輸出打印,但是實際上是還是先釋放后獲取信號量的。