在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

操作系統的哼哈二將---SVC和PENDSV

嵌入式BugMaker ? 來源:嵌入式BugMaker ? 2023-03-06 09:47 ? 次閱讀

ARM芯片中對于需要使用到操作系統的情況,SVC和PendSV是兩個很重要的中斷。但是在實際使用的過程中,不免會產生幾個疑問。一個是這兩個中斷都是屬于由用戶來主動觸發的中斷,他們有什么區別?還有一個就是為什么會是使用SVC來提供系統服務訪問入口,而PendSV則是做上下文切換?帶著這些疑問,開始本篇的講解

SVC(Supervisor Call請求管理調用)

調用SVC指令就會觸發SVC中斷,它的作用乍一看和普通調用函數有點像,不同的是它跳轉的不是函數而是SVC中斷handler,因此大家可以把它看成是一個交由用戶控制的中斷源。

它的編寫方法如下圖所示,資料來自與《Armv7-M Architecture Reference Manual》

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

SVC指令構成圖

如下實例代碼是編號為0的函數來觸發Supervisor call

__asm void CallSupervisor( void )
{
  svc 0   
}

那么問題來了,不同的編號觸發的是同一個SVCall Handler中斷處理函數,那么我們要怎么知道是哪個編號觸發的呢?這個知識點就涉及到CortexM內核的異常壓棧機制,具體可以參考公眾號《如何知道程序是運行到哪里觸發的中斷》;

如下圖范例可以看出,這里調用了一個編碼為10的SVC指令,SVC指令地址為0x8001fa0,地址上的內容是0xdf0a。結合SVC指令構成圖可知其二進制指令構成0xdf+編號,所以這里看到二進制的數據為0xdf0a,是個編號10的SVC指令。

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

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

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

PendSV(Pendable Service Call可掛起的系統調用)

PendSV其實和SVC有點像,所以很容易被混淆。其是通過使能中斷控制狀態寄存器中的PENDSVSET位,來實現觸發。一般情況下PendSV的中斷優先級都配置比較低,所以可以理解調用PENDSV后,這個中斷觸發允許被掛起,等沒有優先級更高的中斷需要運行的時候,才會觸發PendSV中斷,就是一個允許延時一會再執行的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;
}

哼哈二將的職責

在操作系統中,通常使用SVC指令來請求系統調用,而PendSV來進行線程切換時上下文保存動作。剛開始學習操作系統的時候,有點困惑為什么要這樣做功能劃分,這兩個中斷都讓我有點傻傻分不清楚。后來覺得其實這應該也不算是硬性規定,就是約定俗成這么干,理論上用哪個去申請系統調用和切換上下文都是可以的。這也不是隨意猜測的,如下可以看幾個例子,在FreeRTOS中第一個任務的調用就是用的SVC,后面就一直是使用PENDSV做上下文切換;而在UCOSRT-Thread中則是從第一個任務開始就都是使用的PENDSV。

下圖為FreeRTOS調度器首次運行時是使用SVC指令

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

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

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

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

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

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

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

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ARM
    ARM
    +關注

    關注

    134

    文章

    9109

    瀏覽量

    368022
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120681
  • 內核
    +關注

    關注

    3

    文章

    1377

    瀏覽量

    40325
  • 操作系統
    +關注

    關注

    37

    文章

    6855

    瀏覽量

    123434
  • SVC
    SVC
    +關注

    關注

    0

    文章

    33

    瀏覽量

    12150

原文標題:操作系統的哼哈二將---SVC和PENDSV

文章出處:【微信號:嵌入式BugMaker,微信公眾號:嵌入式BugMaker】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    【RTX操作系統教程】第5章 RTX操作系統庫方式移植(超級簡單)

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

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

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

    【安富萊】【RTX操作系統教程】第19章 SVC中斷方式調用用戶函數

    【安富萊】【RTX操作系統教程】第19章SVC中斷方式調用用戶函數第19章 SVC中斷方式調用用戶函數 本章節為大家講解如何采用SVC中斷方式調用用戶函數。當用戶
    發表于 02-03 17:10

    轉:第5章 FreeRTOS操作系統移植(MDK版)

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

    轉:第6章 FreeRTOS操作系統移植(IAR版)

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

    第5章 RTX操作系統庫方式移植(超級簡單)

    轉rtx操作系統本章教程為大家介紹RTX操作系統庫方式移植,庫方式的移植超級簡單,應該是所有RTOS里面最簡單的了,僅需簡單的兩步就可以完成。本章教程含Cortex-M3內核的STM32F103
    發表于 10-02 10:01

    第6章 RTX操作系統源碼方式移植

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

    第19章 SVC中斷方式調用用戶函數

    轉rtx操作系統本章節為大家講解如何采用SVC中斷方式調用用戶函數。當用戶RTX任務設置為工作在非特權級模式時,任務中是不允許訪問特權級寄存器的,這個時候使用SVC中斷,此問題就迎刃
    發表于 10-08 08:15

    【設計技巧】從單片機到操作系統(6)-FreeRTOS任務切換機制詳解

    操作系統函數,后者完成用戶程序請求的服務。 另一個相關的異常是 PendSV(可懸起的系統調用),它和 SVC 協同使用。一方面,SVC
    發表于 07-31 08:30

    【原創分享】單片機支持操作系統的特性

    1、支持操作系統的特性概述:就拿M0核的單片機來說,就有一部分特性是針對嵌入式操作系統的(OS),包括:l SysTick定時器,24位向下計數,且周期產生SysTick異常。l 棧指針,即進程棧
    發表于 11-16 10:32

    SVC工作模式優點

    一、SVCSVC(系統服務調用,亦簡稱系統調用)用于產生系統函數的調用請求。例如,操作系統不讓用戶程序直接訪問硬件,而是通過提供一些系統服務
    發表于 12-13 07:58

    SVCPendSV異常有什么用途?

    延時定時器等。SVCPendSV主要是由操作系統來使用,在FreeRTOS、μC/OS等RTOS中都會使用PendSV異常來實現任務上下文的切換。不過除了需要做OS的移植工作,對OS
    發表于 05-12 10:58

    操作系統講解(操作系統課件)

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

    支持操作系統的特性概述

    進程棧指針,兩個棧指針的結構可以使得應用棧和OS內核棧相互獨立。 l SVC異常和SVC指令,通過異常機制,應用程序可以使用SVC訪問OS服務。 l PendSV異常,其可以被OS、設
    的頭像 發表于 11-12 11:03 ?1410次閱讀

    單片機支持操作系統的特性概述

    進程棧指針,兩個棧指針的結構可以使得應用棧和OS內核棧相互獨立。 l SVC異常和SVC指令,通過異常機制,應用程序可以使用SVC訪問OS服務。 l PendSV異常,其可以被OS、設
    的頭像 發表于 12-02 15:21 ?3024次閱讀
    單片機支持<b class='flag-5'>操作系統</b>的特性概述
    主站蜘蛛池模板: 国产91小视频在线观看| 在线免费观看你懂的| 亚洲色图图片| 91久久人澡人人添人人爽| 天天射天天爽| 国产看色免费| 久久在精品线影院精品国产| 性视频软件| 美女张开腿露出尿口让男人桶| 2019天天操夜夜操| 久久国产精品岛国搬运工| 午夜插| 久久性| 看一级特黄a大片日本片| 久草婷婷| 久久伊人色| 高清人人天天夜夜曰狠狠狠狠| www.亚洲.com| a理论片| 国产青草| 午夜在线观看视频在线播放版| bt种子搜索在线| 天天干天天干天天色| 婷婷综合五月天| 九九热精品在线观看| 性欧美高清极品xx| xxxx日| 亚洲成a人一区二区三区| 黄视频网站入口| h在线国产| 狠狠色噜噜狠狠狠狠97老肥女| 4438x成人网最大色成网站| 欧美18性欧美黑吊| 国产黄网站| 亚洲一区二区中文| h网站在线观看| 一级特级女人18毛片免费视频| 在线天堂bt中文www在线| 四虎影院在线免费观看视频| 色之综合网| 欧美午夜性|