一.簡介
處理器架構實現了多個特性,保證os設計的方便和高效,例如:
二.影子棧指標
cortex-m處理器有兩個棧指標:
對於具有嵌入式os或rtos的系統,每個應用任務都有自己的棧空間,如圖所示,os的上下文切換**在每次上下文切換時都會更新psp。
一般來說 ,要使用程序棧,需要將os置於處理模式,直接程式設計psp後利用異常返回流程「跳轉」到應用任務。
例如,當os從執行緒模式啟動時,可以利用svc異常進入處理模式,如圖,然後可以建立程序棧中的棧幀,且觸發使用psp的異常返回。當載入棧幀時,應用任務就會啟動。
在os設計中,需要在不同任務間切換,這一般被稱作上下文切換,其通常在pendsv異常處理中執行,該異常可由systick異常觸發。
上下文切換操作中需要:
如下圖所示:
需要注意的是,上下文切換在pendsv中執行,其異常優先順序一般會被設定為最低。這樣會避免在中斷處理過程中產生上下文切換!
三.svc異常
svc(請求管理呼叫)的異常型別為11,且優先順序可程式設計。
在許多系統中,svc機制可用於實現應用任務訪問系統資源api,如下圖
對於高可靠性的系統,應用任務可以執行在非特權訪問等級,而且有些硬體資源可被設定為只支援特權訪問(利用mpu),應用任務只能通過os的服務訪問這些受保護的硬體資源。按照這種方式,由於應用任務無法獲得硬體的訪問許可權,嵌入式系統會更加健壯和安全。
由於應用任務無須了解os服務函式的確切位址,因此有了svc,應用任務可以單獨開發。應用任務只需知道svc服務編號以及os服務所需的引數,實際的硬體級的程式設計由裝置驅動處理。
在執行svc處理時,可以在讀取壓棧的程式計數器(pc)數值後從該位址讀出指令並遮蔽掉不需要的位,以確定svc指令中的立即數。不過,執行svc的程式可以使用主棧也可以使用程序棧。因此,在提取壓棧的pc數值前,需要確定壓棧過程使用的是哪個棧,此時可以檢視進入異常處理時鏈結暫存器(lr)的數值,如下圖
對於c程式設計環境,需要將svc處理分為兩個部分:
第一部分示例如下:
svc_handler為cmsis-core中的標準函式名,在得到棧幀的起始位址後,它會被傳遞給svc處理中的c程式部分svc_handler_c。第二部分如下:
傳遞棧幀位址的好處在於,c處理可以提取出棧幀中的任何資訊,包括壓棧暫存器在內,並可通過暫存器將引數傳遞給svc服務以及獲得svc服務的返回值。
傳遞引數且返回數值的乙個svc服務例項如下:
由於異常優先順序模型的限制,無法在svc處理內部使用svc(因為優先順序和當前優先順序相同),非要這麼做會導致使用錯誤異常,由於同樣的原因,也無法在nmi處理或hardfault處理中使用svc。
四.pendsv異常
pendsv(可掛起的系統呼叫)異常編號為14且具有可程式設計的優先順序。它的掛起狀態可在更高優先順序異常處理內設定,且會在高優先順序處理完成後執行。
利用該特性,若將pendsv設定為最低的異常優先順序,可以讓pendsv異常處理在所有其他中斷處理任務完成後執行。這對於上下文切換非常有用。
os核心的執行可以由以下條件觸發:
若中斷請求(irq)在systick異常前發生,則systick異常可能會搶占irq處理。在這種情況下,os核心不應該執行上下文切換。否則,irq處理就會被延遲,如圖:
為了解決這個問題,pendsv異常將上下文切換請求延遲待所有其他irq處理都已經完成以後,此時需要將pendsv設定為最低優先順序。如os需要執行上下文切換,它會設定pendsv的掛起狀態,並在pendsv異常內進行上下文切換。
pendsv還可用於提高中斷的響應速度,可以將中斷服務處理劃分為兩個部分:
五.實際的上下文切換
上下文切換操作有pendsv異常處理執行,由於異常流程已經儲存了r0~r3,r12,lr,pc和xpsr。pendsv只需將r4~r11儲存到程序棧,如圖:
MindSpore特性支援類
mindspore特性支援類 q 請問mindspore支援梯度截斷嗎?a 支援,可以參考梯度截斷的定義和使用。q 如何在訓練神經網路過程中對計算損失的超引數進行改變?a 暫時還未有這樣的功能。目前只能通過訓練 重新定義優化器 訓練,這樣的過程尋找較優的超引數。q 第一次看到有專門的資料處理框架,能...
作業系統(os)的基本特性
1.併發性 併發與並行 並行 abc事件在同一時刻發生 併發 abc事件在同一時間間隔內發生 巨集觀上是同時執行的,微觀上還是各個程式分時交替執行 程序比如乙個系統中有乙個應用程式,這個應用程式由計算程式和i o程式兩部分。如果沒有引入程序,兩者只能順序執行,比如執行完了這個io,再去執行那個計算程...
mysql不支援 MySQL不支援的特性
mysql 1 不支援物化檢視。2 不支援位圖索引。3 不支援並行查詢。4 不支援雜湊關聯,mysql的所有關聯都是巢狀迴圈關聯。不過,可以通過建立乙個雜湊索引來曲線實現。5 不允許對同一表同時進行查詢和更新。報錯 update tb1 as outer tb1 set cnt select cou...