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 _事件組的使用_同步點

  • xEventGroupSync()表示自己做好了

12-1 任務通知理論講解

  • 任務通知不需要單獨建立,不需要一個公共結構體來實現獨寫操作
  • 任務結構體中就包含了內部物件,可以直接接收別的任務發過來的“通知”
  • 其他方式是多對多,任務通知是多對一
  • 其他任務放資料時不需要等待,要麼成功要麼失敗,不會進入阻塞狀態
  • 目標任務可以等待,無資料時;有資料即刻返回
  • 他的結構體滅有兩個連結串列,只有一個通知狀態,這個狀態是給自己使用
  • 透過任務通知可以實現其他的模式,例如佇列,事件,事件組等

12-2 _任務通知使用_輕量級訊號量

  • 可以選擇Take完就清空,也可以一次次Take全部

12-3 _任務通知使用_輕量級佇列

  • 不需要建立佇列
  • 把val房間TCB中,可以選擇覆蓋或者不覆蓋
  • 任務1往佇列中放十個資料,任務2就可以取十次資料
  • 任務通知就直接任務1通知任務2使用控制代碼

12-4 任務通知使用輕量級事件組

  • 不能指定等待的具體事件

相關文章