簡體   English   中英

RTOS 中的 PendSV 和 SVCall

[英]PendSV and SVCall in RTOS

PendSV 和 SVCall 都是從軟件中調用的——SVCall 通過調用 svc 指令,PendSV 通過設置 Cortex-M 的特定寄存器。 PendSV 用於上下文切換,SVCall 用於訪問操作系統內核功能和設備驅動程序。

  1. 是什么決定了 PendSV 用於上下文切換? 為什么 SVCall 不這樣做? 據我所知,可以將 SVCall 的優先級配置為低值。
  2. 盡管有處理程序,但在線程模式下我們無法訪問超出 SVCall 的設備驅動程序是什么? 它也適用於 FreeRTOS 嗎? 我從未使用過 SVC 來與硬件交互。
  3. PendSV 代表 Pendable Service,SVCall 代表 Supervisor Call,為什么要這樣命名? 起源是什么?

我想知道的不僅僅是“PendSV 用於上下文切換,SVCall 用於啟用調度程序”。 我找不到更多信息。

干杯

PendSV 用於掛起服務調用。 它可以從中斷掛起並將在中斷退出時發生。 如果您從中斷執行 SVC 調用,您將遇到硬故障。

SVC 調用是即時的,PendSV 將其掛起直到它可以執行。

使用非特權代碼時,僅需要 SVC 調用才能與 HW 交互。 例如,在使用 MPU 時,用戶代碼通常應該是無特權的。 為了訪問任何特權,則需要通過 SVC 調用來完成。

我認為設計的用法是不同的。

ARM Cortex-M 有兩種模式,線程模式和處理程序模式。 使用內存保護模塊 (MPU) 內存地址通常會在線程模式下被限制。 因此,運行代碼的線程需要一種進入中斷模式的方法。 這是使用 SVC 指令完成的,該指令將處理器置於處理程序模式,同時 MPU 關閉。

Cortex-M 已對中斷進行優先排序以允許真正的實時行為。 這允許中斷處理程序在中斷和運行時關鍵代碼上立即運行。 大多數情況下,很多處理可以稍后進行(因此應該進行)。 這就是 PendSV 中斷的用途。 它可以以較低的優先級運行,並在處理完任何其他掛起的中斷后運行。 這被稱為中斷控制器的“下半部分”。 調度是這些優先級較低的任務之一。 調度 PendSV 不是非特權線程將被允許做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM