天天看點

小熊派4

1.任務管理

1.1任務管理簡介

基本概念

1、從系統的角度看,任務是競争系統資源的最小運作單元。任務可以使用或等待CPU、使用記憶體空間等系統資源,并獨立于其它任務運作。

2、LiteOS的任務子產品可以給使用者提供多個任務,實作了任務之間的切換和通信,幫助使用者管理業務程式流程。這樣使用者可以将更多的精力投入到業務功能的實作中。

3、LiteOS中的任務是搶占式排程機制,高優先級的任務可打斷低優先級任務,低優先級任務必須在高優先級任務阻塞或結束後才能得到排程,同時支援時間片輪轉排程方式。

4、LiteOS的任務預設有32個優先級(0-31),最高優先級為0,最低優先級為31。

1.2任務相關概念

任務狀态

任務狀态通常分為以下四種:

就緒(Ready):該任務在就緒清單中,隻等待CPU。

運作(Running):該任務正在執行。

阻塞(Blocked):該任務不在就緒清單中。包含任務被挂起、任務被延時、任務正在等待信号量、讀寫隊列或者等待讀寫事件等。

退出态(Dead):該任務運作結束,等待系統回收資源。

任務ID:在任務建立時通過參數傳回給使用者,作為任務的一個非常重要的辨別。

任務優先級:優先級表示任務執行的優先順序。

任務入口函數:每個新任務得到排程後将執行的函數。

任務控制塊TCB:每一個任務都含有一個任務控制塊(TCB)。TCB包含了任務上下文棧指針(stack pointer)、任務狀态、任務優先級、任務ID、任務名、任務棧大小等資訊。TCB可以反映出每個任務運作情況。

任務棧:每一個任務都擁有一個獨立的棧空間,我們稱為任務棧。

任務上下文:任務在運作過程中使用到的一些資源,如寄存器等,我們稱為任務上下文。LiteOS在任務挂起的時候會将本任務的任務上下文資訊,儲存在自己的任務棧裡面,以便任務恢複後,從棧空間中恢複挂起時的上下文資訊,進而繼續執行被挂起時被打斷的代碼。

任務切換:任務切換包含擷取就緒清單中最高優先級任務、切出任務上下文儲存、切入任務上下文恢複等動作。

1.3任務的排程機制

就緒态→運作态:任務建立後進入就緒态,發生任務切換時,就緒清單中最高優先級的任務被執行,進而進入運作态,但此刻該任務依舊在就緒清單中。

運作态→阻塞态:任務運作因挂起、讀信号量等待等,在就緒清單中被删除進入阻塞。

阻塞态→就緒态(阻塞态→運作态)∶阻塞的任務被恢複後(任務恢複、延時時間逾時、讀信号量逾時或讀到信号量等),此時被恢複的任務會被加入就緒清單,進而由阻塞态變成就緒态;此時如果被恢複任務的優先級高于正在運作任務的優先級,則會發生任務切換,将該任務由就緒态變成運作态。

就緒态→阻塞态:任務也有可能在就緒态時被阻塞(挂起)。​

​建立的時候有個參數,設定了的話,建立後就是阻塞态​

​運作态→就緒态:有更高優先級任務建立或者恢複後,發生任務切換而進入就緒清單。

運作态→退出态:任務運作結束,核心自動将此任務删除,此時由運作态變為退出态。

阻塞态→退出态:阻塞的任務調用删除接口,任務狀态由阻塞态變為退出态。

小熊派4

1.4實作任務的管理

cmsis_os2的API任務接口簡介:

接口名 功能描述
osThreadNew 建立任務
osThreadTerminate 删除某個任務(一般是對非自任務操作)
osThreadSuspend 任務挂起
osThreadResume 任務恢複

建立任務:osThreadNew(osThreadFunc_t func,void * argument,const osThreadAttr_t * attr)

删除某個任務:osThreadTerminate(osThreadld_t thread_id);

任務挂起:osThreadSuspend(osThreadld_t thread_id)

任務恢複:osThreadResume (osThreadld_t thread_id)

建立任務接口詳解:osThreadNew(osThreadFunc_t func,void * argument,const osThreadAttr_t * attr)

名稱 描述
func 任務函數
argument 作為啟動參數傳遞給任務函數的指針
attr 任務入口函數的參數清單
傳回值 任務ID

案例實操

打開Visual Studio

Code軟體。點選檔案,打開檔案夾,點選映射檔案—>home—>bearpi—>code—>打開,在“項目名\applications\BearPi\BearPi-HM_Nano\sample”檔案下找到案例A1_kernal_thread檔案夾下的thread_example.c

實操過程及擴充見:​​https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6​​ P10 、P11

2.軟體定時器

2.1軟體定時器基本概念

軟體定時器,是基于系統Tick時鐘中斷且由軟體來模拟的定時器,當經過設定的Tick時鐘計數值後會觸發使用者定義的回調函數。定時精度與系統Tick時鐘的周期有關。

硬體定時器受硬體的限制,數量上不足以滿足使用者的實際需求是以為了滿足使用者需求,提供更多的定時器,LiteOS作業系統提供軟體定時器功能。

軟體定時器擴充了定時器的數量,允許建立更多的定時業務。

軟體定時器功能上支援:

  • 靜态裁剪:能通過宏關閉軟體定時器功能。
  • 軟體定時器建立。
  • 軟體定時器啟動。
  • 軟體定時器停止。
  • 軟體定時器删除。
  • 軟體定時器剩餘Tick數擷取。

2.2軟體定時器運作機制

軟體定時器使用了系統的一個隊列和一個任務資源,軟體定時器的觸發遵循隊列規則,先進先出。定時時間短的定時器總是比定時時間長的靠近隊列頭,滿足優先被觸發的準則。

軟體定時器以Tick為基本計時機關,當使用者建立并啟動一個軟體定時器時,LiteOS會根據目前系統Tick時間及使用者設定的定時間隔确定該定時器的到期Tick時間,并将該定時器控制結構挂入計時全局連結清單。

當Tick中斷到來時,在Tick中斷處理函數中掃描軟體定時器的計時全局連結清單,看是否有定時器逾時,若有則将逾時的定時器記錄下來。

Tick中斷處理函數結束後,軟體定時器任務(優先級為最高)被喚醒,在該任務中調用之前記錄下來的定時器的逾時回調函數。

2.3實作軟體定時器建立

cmsis_os2的API軟體定時器接口簡介:

接口名 功能描述
osTimerNew 建立定時器
osTimerStart 啟動定時器
osTimerStop 停止定時器

繼續閱讀