FreeRTOS學習隨記-3
明图發表於2024-12-09
09-2_訊號量的常規使用
- 二進位制訊號量實現互斥
- 計數型訊號量實現同步
- 但是要注意,讓ready狀態/讀取訊號量的任務的優先順序高於running態/寫訊號量的任務,或者讓寫訊號量的任務在寫完主動讓出
10-1_互斥量的理論講解
- 正常實現互斥要誰上鎖誰解鎖,所以引入互斥量
- 但是互斥量也沒實現上邊這一點
- 優先順序反轉和優先順序繼承,透過優先順序繼承解決優先順序反轉
10-2_互斥量的常規使用
- 優先順序反轉是指的透過二進位制應該Give訊號量讓高優先順序任務Take後執行,結果卻是另一個低優先順序的任務搶佔執行了,讓高優先順序task無法執行。
- 優先順序繼承是高優先順序人把自己的優先順序給低優先順序任務,低優先順序完成後再把優先順序還給高優先順序,讓中等優先順序的任務沒有機會搶佔。
10-3_互斥量的缺陷和遞迴鎖
- 互斥量必須實現誰持有誰釋放
- 但是一般的互斥量並不能實現上邊的需求,例如:
- xSemaphoreTake和xSemaphoreGive
- 所以引入遞迴鎖---只能由擁有者開鎖,誰鎖的門誰開鎖
11-1 事件組的理論講解
- 每個bit代表一個事件
- 等待事件組要麼是全部時間要麼是其中某一個
11-2 _事件組的使用_等待事件
- 事件組是不能傳遞資料的,傳遞資料需要其他的方式來
- 透過事件組來等待事件完成,然後佇列傳遞資料
11-3 _事件組的使用_同步點
12-1 任務通知理論講解
- 任務通知不需要單獨建立,不需要一個公共結構體來實現獨寫操作
- 任務結構體中就包含了內部物件,可以直接接收別的任務發過來的“通知”
- 其他方式是多對多,任務通知是多對一
- 其他任務放資料時不需要等待,要麼成功要麼失敗,不會進入阻塞狀態
- 目標任務可以等待,無資料時;有資料即刻返回
- 他的結構體滅有兩個連結串列,只有一個通知狀態,這個狀態是給自己使用
- 透過任務通知可以實現其他的模式,例如佇列,事件,事件組等
12-2 _任務通知使用_輕量級訊號量
- 可以選擇Take完就清空,也可以一次次Take全部
12-3 _任務通知使用_輕量級佇列
- 不需要建立佇列
- 把val房間TCB中,可以選擇覆蓋或者不覆蓋
- 任務1往佇列中放十個資料,任務2就可以取十次資料
- 任務通知就直接任務1通知任務2使用控制代碼
12-4 任務通知使用輕量級事件組