F5 物聯網操做系統多任務調度原理
1.多任務調度基礎
1.1Cortex-M0中Systick重要性
- 系統滴答定時器就是爲操做系統誕生的,是調度器的核心
1.2Cortex-M0中斷管理
- 當異常或者中斷髮生的時候,處理器會把PC設置爲一個特定的地址(存在於flash裏面),這一個地址被稱爲異常向量,每一類異常源都對應一個特定的入口地址,這些地址按照優先級排列之後就組成了一張異常向量表
1.3Cortex-M0影子(進程棧)棧指針
- 在以往裸機編程裏面,當產生外部中斷的時候,CPU會保存當前狀態去執行中斷服務子程序,執行完畢以後會返回到原來任務繼續執行.但在操做系統裏面,存在多個任務,當中斷執行完畢以後究竟該繼續執行哪一個任務呢?故誕生影子棧指針
- 操做系統除了依賴Systick以外,還要高度依賴R13即堆棧指針寄存器SP,Cortex-M0在不一樣物理位置上存在2個棧指針,主棧指針MSP,進程棧指針PSP.在處理模式下,只能使用主堆棧,在線程模式下,能夠使用主堆棧也可以使用進程堆棧,主要由CONTROL寄存器配置,系統上電默認是MSP
- 在線程模式下面一旦產生一個systick那麼就會變成處理模式,在還沒進入處理模式以前將當前任務棧內容給進程棧PSP,以後進入處理模式,當重處理模式恢復到線程模式的時候,經過配置CONTROL寄存器配置使用進程堆棧PSP
- 不使用OS時: 如圖1,只用到MSP(中斷和非中斷都使用MSP)
- 使用OS時:如圖2,main函數和中斷使用MSP;各個Task(線程)使用PSP(即任務棧)
1.4Cortex-M0SVC和pendSV異常
- 在操做系統啓動以後運行任務A當產生Systick的時候會產生PendSV異常,以後切換到任務B
- 爲啥要PendSV異常呢?若是隻有Systick的話,操做系統將只會是基於時間片的調度,若是在某任務執行期間有一個緊急任務發生,那麼緊急任務將沒法當即執行,進而沒有實時性
- 引入PendSV異常,即提供一種處理方式,Systick與其餘任務都可觸發該異常,進而能夠完成任務切換
1.5Cortex-M0工做模式
- 線程模式(Thread Mode):芯片復位以後,進入線程模式,執行用戶程序
- 處理模式(Handler Mode):當處理器發生異常或者中斷,則進入處理模式進行處理,處理完畢以後返回線程模式
- Thumb狀態:正常運行時處理器狀態
- 調試狀態:調試程序時處理器的狀態
歡迎關注本站公眾號,獲取更多信息