ARM芯片中對于需要使用到操作系統(tǒng)的情況,SVC和PendSV是兩個很重要的中斷。但是在實際使用的過程中,不免會產生幾個疑問。一個是這兩個中斷都是屬于由用戶來主動觸發(fā)的中斷,他們有什么區(qū)別?還有一個就是為什么會是使用SVC來提供系統(tǒng)服務訪問入口,而PendSV則是做上下文切換?帶著這些疑問,開始本篇的講解
SVC(Supervisor Call請求管理調用)
調用SVC指令就會觸發(fā)SVC中斷,它的作用乍一看和普通調用函數(shù)有點像,不同的是它跳轉的不是函數(shù)而是SVC中斷handler,因此大家可以把它看成是一個交由用戶控制的中斷源。
它的編寫方法如下圖所示,資料來自與《Armv7-M Architecture Reference Manual》

SVC指令構成圖
如下實例代碼是編號為0的函數(shù)來觸發(fā)Supervisor call
__asm void CallSupervisor( void )
{
svc 0
}
那么問題來了,不同的編號觸發(fā)的是同一個SVCall Handler中斷處理函數(shù),那么我們要怎么知道是哪個編號觸發(fā)的呢?這個知識點就涉及到CortexM內核的異常壓棧機制,具體可以參考公眾號《如何知道程序是運行到哪里觸發(fā)的中斷》;
如下圖范例可以看出,這里調用了一個編碼為10的SVC指令,SVC指令地址為0x8001fa0,地址上的內容是0xdf0a。結合SVC指令構成圖可知其二進制指令構成0xdf+編號,所以這里看到二進制的數(shù)據為0xdf0a,是個編號10的SVC指令。

根據異常壓棧內容可知返回地址為0x8001af2,所以可得SVC指令編號 = 異常壓棧后的返回地址-2。之所以減2是因為thumb指令為大小為2 bytes,剛好就是SVC指令的大?。?xdf0a)??梢钥闯鰣?zhí)行完SVC指令立刻就會執(zhí)行中斷動作

PendSV(Pendable Service Call可掛起的系統(tǒng)調用)
PendSV其實和SVC有點像,所以很容易被混淆。其是通過使能中斷控制狀態(tài)寄存器中的PENDSVSET位,來實現(xiàn)觸發(fā)。一般情況下PendSV的中斷優(yōu)先級都配置比較低,所以可以理解調用PENDSV后,這個中斷觸發(fā)允許被掛起,等沒有優(yōu)先級更高的中斷需要運行的時候,才會觸發(fā)PendSV中斷,就是一個允許延時一會再執(zhí)行的SVC。
/* Interrupt control state register:0xe000ed04
* Bit 28 PENDSVSET: PendSV Bit
*/
#define NVIC_INT_CTRL_REG( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
#define NVIC_PENDSVSET_BIT( 1UL << 28UL )
#define CallPendSV()
{
portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;
}
哼哈二將的職責
在操作系統(tǒng)中,通常使用SVC指令來請求系統(tǒng)調用,而PendSV來進行線程切換時上下文保存動作。剛開始學習操作系統(tǒng)的時候,有點困惑為什么要這樣做功能劃分,這兩個中斷都讓我有點傻傻分不清楚。后來覺得其實這應該也不算是硬性規(guī)定,就是約定俗成這么干,理論上用哪個去申請系統(tǒng)調用和切換上下文都是可以的。這也不是隨意猜測的,如下可以看幾個例子,在FreeRTOS中第一個任務的調用就是用的SVC,后面就一直是使用PENDSV做上下文切換;而在UCOS和RT-Thread中則是從第一個任務開始就都是使用的PENDSV。
下圖為FreeRTOS調度器首次運行時是使用SVC指令

下圖示UCOS調度器首次運行時是使用PENDSV

下圖示RT_Thread調度器首次運行時是使用PENDSV

那為什么CortexM要出這個SVC和PENDSV這兩個由用戶用來觸發(fā)中斷的指令,用來輔助操作系統(tǒng)呢?眾所周知,CortexM內核有多重模式的,主要分為特權模式和非特權模式。默認情況下我們是處于特權模式,所以各位工程師可以愉快的修改各種內核寄存器,配置、開關中斷??梢栽O想一下,如果用戶代碼可以肆意的開關中斷,那對于操作系統(tǒng)就存在失控的隱患。因此出于運行安全上的考慮,操作系統(tǒng)是希望用戶運行其代碼的時候是處于非特權模式,僅有操作系統(tǒng)來接管內核寄存器的控制。而中斷觸發(fā)后會將非特權模式切換為特權模式,現(xiàn)在就清楚了SVC和PENDSV指令的作用就是提供讓非特權模式下的用戶層代碼可以進入特權模式的接口,將權限交給操作系統(tǒng)進行內核以及寄存器的操作。完成操作后切換回非特權模式并返回用戶層代碼繼續(xù)運行。

-
ARM
+關注
關注
135文章
9587瀏覽量
393515 -
寄存器
+關注
關注
31文章
5619瀏覽量
130391 -
內核
+關注
關注
4文章
1474瀏覽量
43089 -
操作系統(tǒng)
+關注
關注
37文章
7432瀏覽量
129600 -
SVC
+關注
關注
0文章
33瀏覽量
12724
原文標題:操作系統(tǒng)的哼哈二將---SVC和PENDSV
文章出處:【微信號:嵌入式BugMaker,微信公眾號:嵌入式BugMaker】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
【RTX操作系統(tǒng)教程】第5章 RTX操作系統(tǒng)庫方式移植(超級簡單)
【安富萊】【RTX操作系統(tǒng)教程】第6章 RTX操作系統(tǒng)源碼方式移植
【安富萊】【RTX操作系統(tǒng)教程】第19章 SVC中斷方式調用用戶函數(shù)
轉:第5章 FreeRTOS操作系統(tǒng)移植(MDK版)
轉:第6章 FreeRTOS操作系統(tǒng)移植(IAR版)
第5章 RTX操作系統(tǒng)庫方式移植(超級簡單)
第6章 RTX操作系統(tǒng)源碼方式移植
第19章 SVC中斷方式調用用戶函數(shù)
【設計技巧】從單片機到操作系統(tǒng)(6)-FreeRTOS任務切換機制詳解
【原創(chuàng)分享】單片機支持操作系統(tǒng)的特性
SVC工作模式優(yōu)點
SVC和PendSV異常有什么用途?
操作系統(tǒng)講解(操作系統(tǒng)課件)
支持操作系統(tǒng)的特性概述
單片機支持操作系統(tǒng)的特性概述
操作系統(tǒng)的哼哈二將---SVC和PENDSV
評論