SVC和PendSV
1.SVC
SVC(Supervisor Call)指令用于產生一個SVC異常。它是用戶模式代碼中的主進程,用于創造對特權操作系統代碼的調用。SVC是用于呼叫操作系統所提供API的正道。用戶程序只需知道傳遞給操作系統的參數,而不必知道各API函數的地址。
SVC指令帶一個8位的立即數,可以視為是它的參數,被封裝在指令自身,如:
??SVC??? 3:呼叫3號系統服務
則3被封裝在這個SVC指令中。因此在SVC服務例程中,需要讀取本次觸發SVC異常的SVC指令,并提取出8位立即數所在的位段,從而判斷系統調用號,工作流程如圖7-7所示。
?
實現上圖功能的代碼如下所示:
svc_handler
?TST?????? LR,?? #0x4;??;測試EXC_RETURN的比特2
?ITE?????? EQ;????;如果為0
?MRSEQ?? R0,?? MSP;???;則使用的是主堆棧,故把MSP的值取出
?MRSNE?? R0,?? PSP;???;否則,使用的是進程堆棧,故把PSP的值取出
?LDR????? R1,?? {R0,#24};?;從棧中讀取PC值
?LDRB???? R0,? {R1,#-2};??;從SVC指令中讀取立即數放到R0
; 準備調用系統服務函數。這需要適當調整入棧的PC值及LR(EXC_RETURN)來進入OS內部
??BX??????? LR; ????;借異常返回的形式,進入OS內部,最終調用系統服務函數
一旦獲取了調用號,就可以用它來調用系統服務函數了。有理由相信,操作系統應該使用TBB/TBH查表跳轉指令來加速定位正確的服務函數。然而,如果讀者是設計OS的人員,則必須檢查這個參數的合法性,以免因數字超出跳轉表的范圍而跳飛。因為不能在SVC服務例程中嵌套使用SVC,所以如果有需要,就要直接調用SVC函數,如使用BL指令。
2.PendSV
PendSV是為系統級服務提供的中斷驅動。在一個操作系統環境中,當沒有其他異常正在執行時,可以使用PendSV來進行上下文的切換。
在進入PendSV處理函數時:
(1)xPSR、PC、LR、R12、R0~R3已經在處理棧中被保存。
(2)處理模式切換到線程模式。
(3)棧是主堆棧。
由于PendSV在系統中被設置為最低優先級,因此只有當沒有其他異常或者中斷在執行時才會被執行。
總結
以上是生活随笔為你收集整理的SVC和PendSV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BLE程序框架探索
- 下一篇: BLE-NRF51822教程8-动态广播