STM32 簡單多任務排程的方法與程式例程

2021-10-10 17:42:26 字數 1239 閱讀 9715

多工處理是指使用者可以在同一時間內執行多個應用程式,每個應用程式被稱作乙個任務.linux、windows就是支援多工的作業系統,比起單任務系統它的功能增強了許多。當多工作業系統使用某種任務排程策略允許兩個或更多程序併發共享乙個處理器時,事實上處理器在某一時刻只會給一件任務提供服務。因為任務排程機制保證不同任務之間的切換速度十分迅速,因此給人多個任務同時執行的錯覺。多工系統中有3個功能單位:任務、程序和執行緒。

學習資料,技術交流xyd118118

在stm32的開發目前大多數還開處於「裸奔」的階段,處於開發成本的考慮,可能還未嵌入任何的rtos系統,由於沒有作業系統的支援,因而不能方便的對多工進行排程和管理,在main函式中你可能會寫成如下方式:

[color=rgb(51, 102, 153) !important]複製**

[color=rgb(51, 102, 153) !important]複製**

其中ftask為任務指標,指向具體的任務,unexttick為該任務下一次執行的時間,ulentick為任務的排程週期或叫排程頻率,即每隔多長時間執行一次。

按照這個結構,可以預先定義乙個結構體陣列,然後將要呼叫的任務和任務的排程時間按照如下方式羅列出來:

[color=rgb(51, 102, 153) !important]複製**

其中第乙個任務task_systick為計算系統時間的任務,用以獲取上電後執行的時間(task_systick任務相關**附在文章後面)。這裡預設任務下一次執行的時間為0,在main函式中,不斷的輪詢這個陣列,然後將當前任務的下一次呼叫時間和當前時間比較,如果發現輪到該任務執行,就執行該任務,執行完成後,將該任務的下一次執行時間設為當前時間加任務的排程時間,然後按照此方法去執行下乙個需要執行的任務,**如下:

[color=rgb(51, 102, 153) !important]複製**

這樣,就可以對多個任務做乙個簡單的排程,以後新增任務時只需要在mtasktab表中新增即可,需要強調的是,由於執行每個任務也需要耗費時間,就會導致乙個任務的實際排程週期可能會比設定的排程週期要長,這樣會存在時間不准的情況,當然這僅僅是適合於對輪詢週期不是很嚴格的任務,如果想要任務在嚴格的時間週期內執行或者需要更精確的時間處理,則必須採用定時器的方式了。

完整的main檔案**:

[color=rgb(51, 102, 153) !important]複製**

task_systick任務相關**:

[color=rgb(51, 102, 153) !important]複製**

基於stm32的簡單多工切換設計

系統資料 1 當前的pid 2 所有的程序總數pamount 多工系統的初始化 1 設定msp值 2 設定臨時的psp值 因為這段實際上只在啟動定時器之前有效 3 設定control 1 1 設定雙堆疊 馬上會自動切換到psp上 4 設定pid 0,設定pamount 0 5 設定為程序資訊表起始位...

STM32簡單任務排程的總結

概述 stm32的開發目前大多數還開處於 裸奔 的階段,處於開發成本的考慮,可能還未嵌入任何的rtos系統,由於沒有作業系統的支援,因而不能方便的對多工進行排程和管理。而有的任務不緊急,不需要過多的時間去迴圈執行,因此需要乙個簡單的任務排程來解決這個問題。stm32f103ze的ahb時鐘為72mh...

stm32多工程式的實現

實現功能 在stm32下完成乙個基於freertos的多工程式,執行3個週期性task。task1,每間隔500ms閃爍 變化 一次led task2,每間隔2000ms,向串列埠傳送一次指令資料 helloworld task3,每間隔5000ms,從aht20採集一次溫濕度資料 不考慮硬體情況,...