STM32的線程模式(Thread Mode)和內核模式(Handler Mode)以及其對應的權級和堆棧指針
線程模式:
正常代碼執行時的模式(如 main 函數、FreeRTOS任務)
可以是特權級(使用MSP)也可以是非特權級(使用PSP)
異常模式:
正在執行中斷服務程序
永遠是特權級,使用MSP
模式 | 棧指針 | 特權級 | 應用場景 |
---|---|---|---|
線程模式 | MSP | 特權級 | 系統啟動初期 |
線程模式 | PSP | 非特權級 | RTOS用戶任務 |
內核模式 | MSP | 特權級 | 中斷服務程序、系統調用處理 |
在RAM上的分布情況
地址 ↓ 增大 (低 → 高) 物理地址范圍
┌──────────────────────────────┐
│ RAM 結束 │ 0x2002_0000
├──────────────────────────────┤
│ MSP 棧區 │← 異常模式、中斷使用
│ (Main Stack Pointer) │
│ ↓ 向下增長 │
├──────────────────────────────┤
│ PSP - 任務A 棧 │← 任務A執行時使用
│ (Process Stack Pointer) │
│ ↓ 向下增長 │
├──────────────────────────────┤
│ PSP - 任務B 棧 │← 任務B執行時使用
│ ↓ 向下增長 │
├──────────────────────────────┤
│ PSP - 任務C 棧 │← 任務C執行時使用
│ ↓ 向下增長 │
├──────────────────────────────┤
│ 全局變量區 │
│ BSS / DATA段等 │
├──────────────────────────────┤
│ 堆(heap)區 │↑ 向上增長
├──────────────────────────────┤
│ RAM 起始地址 │ 0x2000_0000
└──────────────────────────────┘
RTOS任務如何從MSP切換到PSP?SVC_Handler 起到什么作用?
待寫