精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

操作系統(tǒng)的哼哈二將---SVC和PENDSV

嵌入式BugMaker ? 來(lái)源:嵌入式BugMaker ? 2023-03-06 09:47 ? 次閱讀

ARM芯片中對(duì)于需要使用到操作系統(tǒng)的情況,SVC和PendSV是兩個(gè)很重要的中斷。但是在實(shí)際使用的過(guò)程中,不免會(huì)產(chǎn)生幾個(gè)疑問(wèn)。一個(gè)是這兩個(gè)中斷都是屬于由用戶來(lái)主動(dòng)觸發(fā)的中斷,他們有什么區(qū)別?還有一個(gè)就是為什么會(huì)是使用SVC來(lái)提供系統(tǒng)服務(wù)訪問(wèn)入口,而PendSV則是做上下文切換?帶著這些疑問(wèn),開(kāi)始本篇的講解

SVC(Supervisor Call請(qǐng)求管理調(diào)用)

調(diào)用SVC指令就會(huì)觸發(fā)SVC中斷,它的作用乍一看和普通調(diào)用函數(shù)有點(diǎn)像,不同的是它跳轉(zhuǎn)的不是函數(shù)而是SVC中斷handler,因此大家可以把它看成是一個(gè)交由用戶控制的中斷源。

它的編寫(xiě)方法如下圖所示,資料來(lái)自與《Armv7-M Architecture Reference Manual》

d0bc290e-bb5e-11ed-bfe3-dac502259ad0.png

SVC指令構(gòu)成圖

如下實(shí)例代碼是編號(hào)為0的函數(shù)來(lái)觸發(fā)Supervisor call

__asm void CallSupervisor( void )
{
  svc 0   
}

那么問(wèn)題來(lái)了,不同的編號(hào)觸發(fā)的是同一個(gè)SVCall Handler中斷處理函數(shù),那么我們要怎么知道是哪個(gè)編號(hào)觸發(fā)的呢?這個(gè)知識(shí)點(diǎn)就涉及到CortexM內(nèi)核的異常壓棧機(jī)制,具體可以參考公眾號(hào)《如何知道程序是運(yùn)行到哪里觸發(fā)的中斷》;

如下圖范例可以看出,這里調(diào)用了一個(gè)編碼為10的SVC指令,SVC指令地址為0x8001fa0,地址上的內(nèi)容是0xdf0a。結(jié)合SVC指令構(gòu)成圖可知其二進(jìn)制指令構(gòu)成0xdf+編號(hào),所以這里看到二進(jìn)制的數(shù)據(jù)為0xdf0a,是個(gè)編號(hào)10的SVC指令。

d1175658-bb5e-11ed-bfe3-dac502259ad0.jpg

根據(jù)異常壓棧內(nèi)容可知返回地址為0x8001af2,所以可得SVC指令編號(hào) = 異常壓棧后的返回地址-2。之所以減2是因?yàn)閠humb指令為大小為2 bytes,剛好就是SVC指令的大?。?xdf0a)??梢钥闯鰣?zhí)行完SVC指令立刻就會(huì)執(zhí)行中斷動(dòng)作

d17a87aa-bb5e-11ed-bfe3-dac502259ad0.jpg

PendSV(Pendable Service Call可掛起的系統(tǒng)調(diào)用)

PendSV其實(shí)和SVC有點(diǎn)像,所以很容易被混淆。其是通過(guò)使能中斷控制狀態(tài)寄存器中的PENDSVSET位,來(lái)實(shí)現(xiàn)觸發(fā)。一般情況下PendSV的中斷優(yōu)先級(jí)都配置比較低,所以可以理解調(diào)用PENDSV后,這個(gè)中斷觸發(fā)允許被掛起,等沒(méi)有優(yōu)先級(jí)更高的中斷需要運(yùn)行的時(shí)候,才會(huì)觸發(fā)PendSV中斷,就是一個(gè)允許延時(shí)一會(huì)再執(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;
}

哼哈二將的職責(zé)

在操作系統(tǒng)中,通常使用SVC指令來(lái)請(qǐng)求系統(tǒng)調(diào)用,而PendSV來(lái)進(jìn)行線程切換時(shí)上下文保存動(dòng)作。剛開(kāi)始學(xué)習(xí)操作系統(tǒng)的時(shí)候,有點(diǎn)困惑為什么要這樣做功能劃分,這兩個(gè)中斷都讓我有點(diǎn)傻傻分不清楚。后來(lái)覺(jué)得其實(shí)這應(yīng)該也不算是硬性規(guī)定,就是約定俗成這么干,理論上用哪個(gè)去申請(qǐng)系統(tǒng)調(diào)用和切換上下文都是可以的。這也不是隨意猜測(cè)的,如下可以看幾個(gè)例子,在FreeRTOS中第一個(gè)任務(wù)的調(diào)用就是用的SVC,后面就一直是使用PENDSV做上下文切換;而在UCOSRT-Thread中則是從第一個(gè)任務(wù)開(kāi)始就都是使用的PENDSV。

下圖為FreeRTOS調(diào)度器首次運(yùn)行時(shí)是使用SVC指令

d1aca7f8-bb5e-11ed-bfe3-dac502259ad0.png

下圖示UCOS調(diào)度器首次運(yùn)行時(shí)是使用PENDSV

d1ceafd8-bb5e-11ed-bfe3-dac502259ad0.png

下圖示RT_Thread調(diào)度器首次運(yùn)行時(shí)是使用PENDSV

d1ffc992-bb5e-11ed-bfe3-dac502259ad0.png

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

d2526904-bb5e-11ed-bfe3-dac502259ad0.png

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365071
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5254

    瀏覽量

    119214
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1337

    瀏覽量

    40085
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6547

    瀏覽量

    122756
  • SVC
    SVC
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    12043

原文標(biāo)題:操作系統(tǒng)的哼哈二將---SVC和PENDSV

文章出處:【微信號(hào):嵌入式BugMaker,微信公眾號(hào):嵌入式BugMaker】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【RTX操作系統(tǒng)教程】第5章 RTX操作系統(tǒng)庫(kù)方式移植(超級(jí)簡(jiǎn)單)

    第5章RTX操作系統(tǒng)庫(kù)方式移植(超級(jí)簡(jiǎn)單) 本章教程為大家介紹RTX操作系統(tǒng)庫(kù)方式移植,庫(kù)方式的移植超級(jí)簡(jiǎn)單,應(yīng)該是所有RTOS里面最簡(jiǎn)單的了,僅需簡(jiǎn)單的兩步就可以完成。 本章教程含
    發(fā)表于 01-19 14:59

    【安富萊】【RTX操作系統(tǒng)教程】第6章 RTX操作系統(tǒng)源碼方式移植

    `第6章RTX操作系統(tǒng)源碼方式移植本章教程為大家介紹RTX操作系統(tǒng)源碼方式移植,移植工作比較簡(jiǎn)單,只需要用戶添加需要的源碼文件即可,不需要做任何的底層工作,也不需要用戶做任何修改。 本章教程含
    發(fā)表于 01-20 14:55

    【安富萊】【RTX操作系統(tǒng)教程】第19章 SVC中斷方式調(diào)用用戶函數(shù)

    【安富萊】【RTX操作系統(tǒng)教程】第19章SVC中斷方式調(diào)用用戶函數(shù)第19章 SVC中斷方式調(diào)用用戶函數(shù) 本章節(jié)為大家講解如何采用SVC中斷方式調(diào)用用戶函數(shù)。當(dāng)用戶
    發(fā)表于 02-03 17:10

    轉(zhuǎn):第5章 FreeRTOS操作系統(tǒng)移植(MDK版)

    本章教程將為大家介紹基于MDK的FreeRTOS操作系統(tǒng)移植。移植工作比較簡(jiǎn)單,只需要用戶添加需要的源碼文件,不需要做任何的底層工作,再添加三個(gè)宏定義即可。本章教程含Cortex-M3內(nèi)核
    發(fā)表于 08-21 15:34

    轉(zhuǎn):第6章 FreeRTOS操作系統(tǒng)移植(IAR版)

    本章教程為大家介紹基于IAR的FreeRTOS操作系統(tǒng)移植,移植工作比較簡(jiǎn)單,只需要用戶添加需要的源碼文件,不需要做任何的底層工作,再添加三個(gè)宏定義即可。 本章教程包含Cortex-M3內(nèi)核
    發(fā)表于 08-22 09:58

    第5章 RTX操作系統(tǒng)庫(kù)方式移植(超級(jí)簡(jiǎn)單)

    轉(zhuǎn)rtx操作系統(tǒng)本章教程為大家介紹RTX操作系統(tǒng)庫(kù)方式移植,庫(kù)方式的移植超級(jí)簡(jiǎn)單,應(yīng)該是所有RTOS里面最簡(jiǎn)單的了,僅需簡(jiǎn)單的兩步就可以完成。本章教程含Cortex-M3內(nèi)核的STM32F103
    發(fā)表于 10-02 10:01

    第6章 RTX操作系統(tǒng)源碼方式移植

    轉(zhuǎn)rtx操作系統(tǒng)本章教程為大家介紹RTX操作系統(tǒng)源碼方式移植,移植工作比較簡(jiǎn)單,只需要用戶添加需要的源碼文件即可,不需要做任何的底層工作,也不需要用戶做任何修改。本章教程含Cortex-M3內(nèi)核
    發(fā)表于 10-02 11:54

    第19章 SVC中斷方式調(diào)用用戶函數(shù)

    轉(zhuǎn)rtx操作系統(tǒng)本章節(jié)為大家講解如何采用SVC中斷方式調(diào)用用戶函數(shù)。當(dāng)用戶RTX任務(wù)設(shè)置為工作在非特權(quán)級(jí)模式時(shí),任務(wù)中是不允許訪問(wèn)特權(quán)級(jí)寄存器的,這個(gè)時(shí)候使用SVC中斷,此問(wèn)題就迎刃
    發(fā)表于 10-08 08:15

    【設(shè)計(jì)技巧】從單片機(jī)到操作系統(tǒng)(6)-FreeRTOS任務(wù)切換機(jī)制詳解

    操作系統(tǒng)函數(shù),后者完成用戶程序請(qǐng)求的服務(wù)。 另一個(gè)相關(guān)的異常是 PendSV(可懸起的系統(tǒng)調(diào)用),它和 SVC 協(xié)同使用。一方面,SVC
    發(fā)表于 07-31 08:30

    【原創(chuàng)分享】單片機(jī)支持操作系統(tǒng)的特性

    1、支持操作系統(tǒng)的特性概述:就拿M0核的單片機(jī)來(lái)說(shuō),就有一部分特性是針對(duì)嵌入式操作系統(tǒng)的(OS),包括:l SysTick定時(shí)器,24位向下計(jì)數(shù),且周期產(chǎn)生SysTick異常。l 棧指針,即進(jìn)程棧
    發(fā)表于 11-16 10:32

    SVC工作模式優(yōu)點(diǎn)

    一、SVCSVC(系統(tǒng)服務(wù)調(diào)用,亦簡(jiǎn)稱系統(tǒng)調(diào)用)用于產(chǎn)生系統(tǒng)函數(shù)的調(diào)用請(qǐng)求。例如,操作系統(tǒng)不讓用戶程序直接訪問(wèn)硬件,而是通過(guò)提供一些系統(tǒng)服務(wù)
    發(fā)表于 12-13 07:58

    SVCPendSV異常有什么用途?

    延時(shí)定時(shí)器等。SVCPendSV主要是由操作系統(tǒng)來(lái)使用,在FreeRTOS、μC/OS等RTOS中都會(huì)使用PendSV異常來(lái)實(shí)現(xiàn)任務(wù)上下文的切換。不過(guò)除了需要做OS的移植工作,對(duì)OS
    發(fā)表于 05-12 10:58

    操作系統(tǒng)講解(操作系統(tǒng)課件)

    操作系統(tǒng)講解(操作系統(tǒng)課件) 第五章 文件管理.doc第六章 設(shè)備管理(部分).doc第章 進(jìn)程管理.doc第3章 并發(fā)控制——互斥與同步.doc操作系統(tǒng)---進(jìn)程間通信.ppt
    發(fā)表于 05-16 18:06 ?0次下載

    支持操作系統(tǒng)的特性概述

    進(jìn)程棧指針,兩個(gè)棧指針的結(jié)構(gòu)可以使得應(yīng)用棧和OS內(nèi)核棧相互獨(dú)立。 l SVC異常和SVC指令,通過(guò)異常機(jī)制,應(yīng)用程序可以使用SVC訪問(wèn)OS服務(wù)。 l PendSV異常,其可以被OS、設(shè)
    的頭像 發(fā)表于 11-12 11:03 ?1244次閱讀

    單片機(jī)支持操作系統(tǒng)的特性概述

    進(jìn)程棧指針,兩個(gè)棧指針的結(jié)構(gòu)可以使得應(yīng)用棧和OS內(nèi)核棧相互獨(dú)立。 l SVC異常和SVC指令,通過(guò)異常機(jī)制,應(yīng)用程序可以使用SVC訪問(wèn)OS服務(wù)。 l PendSV異常,其可以被OS、設(shè)
    的頭像 發(fā)表于 12-02 15:21 ?2843次閱讀
    單片機(jī)支持<b class='flag-5'>操作系統(tǒng)</b>的特性概述