哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

3天內不再提示

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

嵌入式BugMaker ? 來源:嵌入式BugMaker ? 2023-03-06 09:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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》

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

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指令。

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

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

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

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

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

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

    關注

    135

    文章

    9587

    瀏覽量

    393515
  • 寄存器
    +關注

    關注

    31

    文章

    5619

    瀏覽量

    130391
  • 內核
    +關注

    關注

    4

    文章

    1474

    瀏覽量

    43089
  • 操作系統(tǒng)

    關注

    37

    文章

    7432

    瀏覽量

    129600
  • SVC
    SVC
    +關注

    關注

    0

    文章

    33

    瀏覽量

    12724

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    SVCPendSV異常有什么用途?

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

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

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

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

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

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

    進程棧指針,兩個棧指針的結構可以使得應用棧和OS內核棧相互獨立。 l SVC異常和SVC指令,通過異常機制,應用程序可以使用SVC訪問OS服務。 l PendSV異常,其可以被OS、設
    的頭像 發(fā)表于 12-02 15:21 ?3883次閱讀
    單片機支持<b class='flag-5'>操作系統(tǒng)</b>的特性概述
    周口市| 吴桥县| 威海市| 景德镇市| 阳新县| 竹溪县| 绥棱县| 曲麻莱县| 临夏市| 庄浪县| 普兰县| 肇庆市| 南安市| 鹿泉市| 武宣县| 象山县| 贺兰县| 松滋市| 丰台区| 民权县| 太仆寺旗| 边坝县| 嘉禾县| 枣强县| 竹溪县| 宕昌县| 赣州市| 洛隆县| 灌南县| 鹤山市| 昭苏县| 榆树市| 阿拉尔市| 桐庐县| 桑植县| 牟定县| 东港市| 虞城县| 巴塘县| 乌鲁木齐市| 华阴市|