基於Cortex M3的簡易排程系統(記錄問題)

2022-07-26 18:15:12 字數 1337 閱讀 4228

本文大量參考了《cm3核心指南》,記錄一下在實現簡易系統過程中遇到困擾我比較久的問題

主堆疊指標(msp),或寫作 sp_main。這是預設的堆疊指標,它由 os 核心、異常服務

例程以及所有需要特權訪問的應用程式**來使用。

程序堆疊指標(psp),或寫作 sp_process。用於常規的應用程式**(不處於異常服

用例程中時)。 

cm3有兩個堆疊指標

而我們作業系統用到的是msp,使用者任務**用到的是psp,而堆疊指標的切換一直困擾了我很久。

其實他的實現是由lr指標中的乙個特殊值來實現的,這個特殊值一般在進入異常時核心自動計算完成,通過把lr[31:4]的位全置為1做為exc_return的標誌,而在中斷中對[3:0]位修改則可完成msp和psp的切換

下乙個問題是,進入了pendsv後,會排程哪個任務,為何會自動進入那個任務。

這個問題和任務的堆疊初始化有關

首先有乙個知識是cm3在進入乙個異常時會自動把下圖中的暫存器入棧(我們使用的psp,r4-r11要手動入棧)。

我們在返回時切換到了psp堆疊指標,那麼我們只要把psp指標指向我們要執行的任務的堆疊就行了,cm3會自動出棧,pc指標就指向了我們設定的task即任務函式的第一條指令。

最後就是pendsv觸發了

27位置1則觸發pendsv中斷,即下圖操作

要週期性的排程則用systick週期呼叫觸發就可以了

不過要先把pendsv的優先順序設定得比systick低。

Cortex M3異常筆記

異常型別 cortex m3編號為1 15對應系統異常,大於等於16的全部是核心級額外部中斷,除個別異常 復位,nmi,硬fault 的優先順序被定死之外,其他異常優先順序都是可以程式設計的。如果乙個發生的異常不能即刻響應,就稱它被 懸起 pending 少數異常時不能被懸起的。乙個異常被懸起的原因...

Cortex M3復位序列

在離開復位狀態後,cm3 做的第一件事就是讀取下列兩個32 位整數的值 從位址 0x0000,0000 處取出msp 的初始值。從位址 0x0000,0004 處取出pc 的初始值 這個值是復位向量,lsb 必須是1。然後從這個值所對應的位址處取指。請注意,這與傳統的arm 架構不同 其實也和絕大多...

Cortex M3的整體風景

一 流水線 1 cortex cm3處理器使用乙個3級流水線,流水線的3級分別是 取指,解碼和執行 2 當執行的指令大多數是16位時,處理器會每隔乙個週期做一次取指。當執行到跳轉指令時需要清洗流水線,處理器會不得不跳轉目的地重新取指。為了改善這種情 況,cortex cm3支援一定數量的v7m指令可...