ARM Cortex-M處理器中的MSP和PSP

在ARM Cortex-M系列處理器中,MSP(主堆棧指針)和PSP(進程堆棧指針)是兩種不同的堆棧指針,主要用于實現堆棧隔離和提升系統可靠性。以下是它們的核心區別和應用場景:


1. 基本定義

  • MSP(Main Stack Pointer)

    • 用途:默認堆棧指針,主要用于處理模式(Handler Mode)(如中斷、異常處理)。
    • 特點:系統啟動時自動初始化,所有異常處理(如中斷服務例程)必須使用MSP。
    • 權限:始終在特權模式下使用。
  • PSP(Process Stack Pointer)

    • 用途:可選堆棧指針,用于**線程模式(Thread Mode)**下的應用程序代碼(如用戶任務)。
    • 特點:需顯式配置,常見于多任務系統(如RTOS)中,每個任務擁有獨立的PSP以實現堆棧隔離。
    • 權限:可在特權或非特權模式下使用(取決于配置)。

2. 操作模式與堆棧選擇

Cortex-M處理器有兩種執行模式:

  • 處理模式(Handler Mode)

    • 始終使用MSP
    • 觸發場景:中斷、異常(如SysTick、硬件錯誤)。
  • 線程模式(Thread Mode)

    • 可配置使用MSP或PSP,由CONTROL寄存器的SPSEL位控制:
      • SPSEL=0 → 使用MSP(默認)。
      • SPSEL=1 → 使用PSP。
    • 權限
      • 特權線程模式:可自由切換MSP/PSP。
      • 非特權線程模式:無法修改CONTROL寄存器。

3. 典型應用場景

  • 單任務系統(無RTOS)

    • 通常僅使用MSP,簡單可靠。
    • 中斷直接使用MSP,用戶代碼在線程模式下默認也使用MSP。
  • 多任務系統(RTOS)

    • PSP核心作用:每個任務分配獨立堆棧,任務切換時更新PSP指向當前任務堆棧。
    • 優勢
      • 任務堆棧溢出不會破壞系統關鍵數據(如中斷上下文)。
      • 實現任務間內存隔離,提升穩定性。
    • 配置示例
      // RTOS任務切換時,更新PSP
      __set_PSP(new_task_stack_top);
      // 切換CONTROL寄存器使用PSP
      __set_CONTROL(0x03); // SPSEL=1, 切換到非特權模式(可選)
      

4. 關鍵寄存器與控制

  • CONTROL寄存器

    • SPSEL位(Bit 1):
      • 0 → 線程模式使用MSP。
      • 1 → 線程模式使用PSP。
    • nPRIV位(Bit 0):
      • 0 → 特權模式。
      • 1 → 非特權模式(限制某些操作)。
  • 代碼中操作堆棧指針

    // 讀取/設置MSP和PSP(需特權模式)
    uint32_t current_msp = __get_MSP();
    uint32_t current_psp = __get_PSP();
    __set_MSP(new_msp_value);
    __set_PSP(new_psp_value);
    

5. 總結對比

特性MSPPSP
默認使用場景處理模式(中斷、異常)線程模式(用戶任務)
初始化系統啟動自動初始化需手動配置
多任務隔離不適用(全局共享)支持(每個任務獨立堆棧)
權限要求始終特權模式可配置特權或非特權模式
典型應用裸機程序、中斷服務RTOS任務、復雜多任務系統

6. 實踐建議

  • 裸機開發:優先使用MSP,簡化設計。
  • RTOS開發:為每個任務分配PSP,避免堆棧沖突。
  • 安全性:在非特權模式下限制PSP修改,防止用戶代碼破壞系統。
  • 調試:通過調試器觀察MSP/PSP的值,確保任務切換時堆棧正確更新。

通過合理使用MSP和PSP,可以顯著提升嵌入式系統的穩定性和可維護性,尤其是在資源受限且要求高可靠性的場景中。


好的!我盡量用「大白話」和比喻來解釋,保證你一聽就懂!


想象你是一個打工人

假設你有 兩個記事本(堆棧):

  1. 「老板專用記事本」(MSP)

    • 用途:專門用來記老板突然扔給你的急事(比如中斷、系統崩潰)。
    • 特點:必須隨身攜帶,隨時能用,而且只能你自己用(特權模式)。
    • 舉個栗子
      你正在寫代碼(普通任務),突然老板喊你修BUG(中斷),你立刻放下手頭工作,掏出「老板專用記事本」記錄問題,修完再回去繼續寫代碼。
  2. 「日常任務記事本」(PSP)

    • 用途:記錄你平時的工作任務(比如用戶程序、普通函數)。
    • 特點:可以靈活分配,比如每個項目(任務)單獨用一個記事本,避免混亂。
    • 舉個栗子
      你同時做兩個項目(多任務),給每個項目分配一個「日常記事本」。切換項目時,只需要換一個記事本,互相不干擾。

關鍵區別

  1. 「老板的事 vs 你的事」

    • MSP:處理老板的急事(中斷、系統級操作),必須快速響應,優先級最高。
    • PSP:處理你自己的日常工作(普通任務),可以慢慢來。
  2. 「記事本能不能共享」

    • MSP:全公司只有一個(全局共享),誰處理急事都用它。
    • PSP:每個項目(任務)單獨一個,互相隔離,一個項目搞砸了(比如堆棧溢出),不會影響其他項目。
  3. 「誰有權限用」

    • MSP:只有你(系統內核、特權模式)能修改。
    • PSP:可以分權限,比如讓實習生(非特權模式)也能用,但限制他亂改。

舉個實際場景

假設你在寫一個智能手表的程序:

  1. MSP 的用途

    • 突然要處理「心率異常報警」(中斷),系統立刻停下手表界面刷新(普通任務),用 MSP 快速保存現場,處理報警。
  2. PSP 的用途

    • 平時同時運行「計步器」和「天氣顯示」兩個任務,每個任務用自己的 PSP 堆棧。
    • 如果計步器的代碼寫錯了(堆棧溢出),只會搞壞自己的 PSP,不會影響天氣顯示和 MSP(系統不會崩潰)。

一句話總結

  • MSP:系統「緊急專用通道」,處理中斷和異常,全局唯一,必須可靠。
  • PSP:你的「多任務分身術」,每個任務獨立堆棧,互不干擾。

再打個比方:

  • MSP 像醫院的急診室,隨時處理緊急情況,全院只有一間。
  • PSP 像普通門診,每個科室(任務)一間,病人(數據)分開排隊,不會擠爆急診室。

在嵌入式開發中,是否要關心 MSPPSP,取決于你的角色、開發場景和系統復雜度。用大白話分情況說明:


1. 如果你是寫業務代碼的「應用層開發人員」

  • 大多數情況下不需要關心,尤其是:

    • 用RTOS(如FreeRTOS、uCOS)
      RTOS已經幫你管理好了任務堆棧(用PSP),你只需要寫任務函數,分配堆棧大小,完全不用手動操作PSP/MSP。
      // 例子:在FreeRTOS中創建任務,你只需指定堆棧大小,不用碰PSP
      xTaskCreate(task_function, "Task1", 512, NULL, 1, NULL);
      
    • 裸機開發但代碼簡單
      如果只是單任務循環(比如順序執行初始化→采集數據→顯示→延時),系統默認用MSP,你甚至不知道PSP的存在。
  • 需要關心的例外情況

    • 調試堆棧溢出問題
      如果程序崩潰,可能需要查看MSP/PSP指向的堆棧區域是否被寫爆。
    • 寫底層庫或驅動
      如果你要寫和中斷、任務切換相關的底層代碼(比如自定義調度器),需要理解MSP/PSP的切換邏輯。

2. 如果你是「系統工程師」或「內核開發者」

  • 必須深刻理解MSP/PSP,因為:
    • 任務切換
      在RTOS中切換任務時,需要保存當前任務的PSP,并加載新任務的PSP。
      ; 偽代碼:任務切換的核心操作
      Save當前任務的寄存器到它的PSP堆棧;
      Load新任務的PSP值到CPU;
      從新任務的PSP堆棧恢復寄存器;
      
    • 中斷處理
      系統默認用MSP處理中斷,但某些高性能場景可能優化為用PSP(需謹慎)。
    • 安全隔離
      在需要權限隔離的系統(如非特權模式運行用戶代碼),需通過PSP限制任務對系統堆棧的訪問。

3. 一句話總結

  • 業務層開發人員
    不用直接操作MSP/PSP,就當它們不存在,除非你要解決某些“玄學”崩潰問題。
    (就像開燃油車不用懂內燃機原理,但漏油了得知道去修)

  • 系統層開發人員
    必須掌握MSP/PSP,這是實現多任務、中斷、內存隔離的核心機制。
    (就像賽車工程師必須懂發動機每個零件)


4. 舉個實際例子

場景:你正在用STM32和FreeRTOS寫一個智能家居控制器
  • 業務代碼(你寫的部分)

    void TemperatureTask(void *pvParameters) {while(1) {float temp = read_sensor();  // 讀傳感器send_to_display(temp);       // 發送到顯示屏vTaskDelay(1000);            // 等1秒}
    }
    
    • 完全不用碰MSP/PSP,只需關注業務邏輯和任務堆棧大小(比如configMINIMAL_STACK_SIZE)。
  • 系統層(RTOS內部)

    // RTOS內核在切換任務時的隱藏操作:
    void vTaskSwitchContext() {// 保存舊任務的PSP到它的任務控制塊(TCB)old_task->psp = __get_PSP();// 從新任務的TCB加載PSP__set_PSP(new_task->psp);
    }
    
    • 這里必須操作PSP,但你作為業務開發者看不到這些代碼。

5. 什么情況下你會被迫了解MSP/PSP?

  • 調試時發現神秘崩潰
    比如日志顯示HardFault_Handler,檢查發現某個任務的PSP指向了非法地址。
  • 優化特殊場景性能
    比如在高頻中斷中,為了減少堆棧切換開銷,刻意讓中斷共享PSP(需極度小心!)。
  • 自己造輪子寫RTOS
    恭喜你,從此MSP/PSP會刻進你的DNA里。

6. 最終建議

  • 新手:
    先當MSP/PSP不存在,專注于業務邏輯。等遇到崩潰問題或學習RTOS原理時,再回頭理解它們。

  • 進階:
    通過調試器觀察MSP/PSP的值(如下所示),加深對堆棧和任務切換的理解:
    外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    (圖中:在Keil調試器中查看寄存器的MSP和PSP值)

  • 記住:
    MSP/PSP是CPU的“幕后工作人員”,99%的時間它們默默工作,只有1%的時間(出問題時)需要你喊它們出來對質。 😉

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71841.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71841.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71841.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

交換機與路由器連接方式

交換機和路由器連接的三種主要方式如下: 一、直連連接 這是最簡單直接的連接方式。通過一根網線將交換機的一個端口與路由器的一個LAN端口相連。這種連接方式適用于小型網絡,其中交換機負責局域網內部的數據交換,而路由器則負責將內部網絡連接…

Python代碼片段-Excel導入到MongoDB

有一次遇到一個需求,需要把Excel的數據導入到MongoDB中,表面上感覺就是導入數據很簡單,但實際操作后,發現是比較麻煩的一個事情,一般圖形化的工具對于MongoDB而言,導入選項都是json的,根本沒有E…

axios幾種請求類型的格式

Axios 是一個基于 Promise 的 HTTP 客戶端,廣泛用于瀏覽器和 Node.js 中發送 HTTP 請求。它支持多種請求格式,包括 GET、POST、PUT、DELETE 等。也叫RESTful 目錄 一、axios幾種請求類型的格式 1、get請求 2、post請求 3、put請求 4、delete請求 二…

手寫系列——MoE網絡

參考: MOE原理解釋及從零實現一個MOE(專家混合模型)_moe代碼-CSDN博客 MoE環游記:1、從幾何意義出發 - 科學空間|Scientific Spaces 深度學習之圖像分類(二十八)-- Sparse-MLP(MoE)網絡詳解_sparse moe…

Linux的基礎指令和環境部署,項目部署實戰(下)

目錄 上一篇:Linxu的基礎指令和環境部署,項目部署實戰(上)-CSDN博客 1. 搭建Java部署環境 1.1 apt apt常用命令 列出所有的軟件包 更新軟件包數據庫 安裝軟件包 移除軟件包 1.2 JDK 1.2.1. 更新 1.2.2. 安裝openjdk&am…

【藍橋杯】第十五屆省賽大學真題組真題解析

【藍橋杯】第十五屆省賽大學真題組真題解析 一、智能停車系統 1、知識點 (1)flex-wrap 控制子元素的換行方式 屬性值有: no-wrap不換行wrap伸縮容器不夠則自動往下換行wrap-reverse伸縮容器不夠則自動往上換行 (2&#xff0…

flink operator v1.10對接華為云對象存儲OBS

1 概述 flink operator及其flink集群,默認不直接支持華為云OBS,需要在這些java程序的插件目錄放一個jar包,以及修改flink配置后,才能支持集成華為云OBS。 相關鏈接參考: https://support.huaweicloud.com/bestpracti…

免費PDF工具

Smallpdf.com - A Free Solution to all your PDF Problems Smallpdf - the platform that makes it super easy to convert and edit all your PDF files. Solving all your PDF problems in one place - and yes, free. https://smallpdf.com/#rappSmallpdf.com-解決您所有PD…

去中心化技術P2P框架

中心化網絡與去中心化網絡 1. 中心化網絡 在傳統的中心化網絡中,所有客戶端都通過一個中心服務器進行通信。這種網絡拓撲結構通常是一個星型結構,其中服務器作為中心節點,每個客戶端只能與服務器通信。如果客戶端之間需要通信,必須…

muduo源碼閱讀:linux timefd定時器

?timerfd timerfd 是Linux一個定時器接口,它基于文件描述符工作,并通過該文件描述符的可讀事件進行超時通知。可以方便地與select、poll和epoll等I/O多路復用機制集成,從而在沒有處理事件時阻塞程序執行,實現高效的零輪詢編程模…

Pinia 3.0 正式發布:全面擁抱 Vue 3 生態,升級指南與實戰教程

一、重大版本更新解析 2024年2月11日,Vue 官方推薦的狀態管理庫 Pinia 迎來 3.0 正式版發布,本次更新標志著其全面轉向 Vue 3 技術生態。以下是開發者需要重點關注的升級要點: 1.1 核心變更說明 特性3.0 版本要求兼容性說明Vue 支持Vue 3.…

【圖像處理 --- Sobel 邊緣檢測的詳解】

Sobel 邊緣檢測的詳解 目錄 Sobel 邊緣檢測的詳解1. 梯度計算2. 梯度大小3. 梯度方向4. 非極大值抑制5. 雙閾值處理6. 在 MATLAB 中實現 Sobel 邊緣檢測7.運行結果展示8.關鍵參數解釋9.實驗與驗證 Sobel 邊緣檢測是一種經典的圖像處理算法,用于檢測圖像中的邊緣。它…

LeetCode 熱題100 15. 三數之和

LeetCode 熱題100 | 15. 三數之和 大家好,今天我們來解決一道經典的算法題——三數之和。這道題在 LeetCode 上被標記為中等難度,要求我們從一個整數數組中找到所有不重復的三元組,使得三元組的和為 0。下面我將詳細講解解題思路&#xff0c…

基因組組裝中的術語1——from HGP

Initial sequencing and analysis of the human genome | Nature 1,分層鳥槍法測序hierarchical shotgun sequencing

安全開發-環境選擇

文章目錄 個人心得虛擬機選擇ubuntu 22.04python環境選擇conda下載使用: 個人心得 在做開發時配置一個專門的環境可以使我們在開發中的效率顯著提升,可以避免掉很多環境沖突的報錯。尤其是python各種版本沖突,還有做滲透工具不要選擇windows…

數字體驗驅動用戶參與增效路徑

內容概要 在數字化轉型深化的當下,數字內容體驗已成為企業與用戶建立深度連接的核心切入點。通過個性化推薦引擎與智能數據分析系統的協同運作,企業能夠實時捕捉用戶行為軌跡,構建精準的用戶行為深度洞察模型。這一模型不僅支撐內容分發的動…

Python 字符串(str)全方位剖析:從基礎入門、方法詳解到跨語言對比與知識拓展

Python 字符串(str)全方位剖析:從基礎入門、方法詳解到跨語言對比與知識拓展 本文將深入探討 Python 中字符串(str)的相關知識,涵蓋字符串的定義、創建、基本操作、格式化等內容。同時,會將 Py…

使用C++實現簡單的TCP服務器和客戶端

使用C實現簡單的TCP服務器和客戶端 介紹準備工作1. TCP服務器實現代碼結構解釋 2. TCP客戶端實現代碼結構解釋 3. 測試1.編譯:2.運行 結語 介紹 本文將通過一個簡單的例子,介紹如何使用C實現一個基本的TCP服務器和客戶端。這個例子展示了如何創建服務器…

Java Web開發實戰與項目——Spring Boot與Spring Cloud微服務項目實戰

企業級應用中,微服務架構已經成為一種常見的開發模式。Spring Boot與Spring Cloud提供了豐富的工具和組件,幫助開發者快速構建、管理和擴展微服務應用。本文將通過一個實際的微服務項目,展示如何使用Spring Boot與Spring Cloud構建微服務架構…

VMware建立linux虛擬機

本文適用于初學者,幫助初學者學習如何創建虛擬機,了解在創建過程中各個選項的含義。 環境如下: CentOS版本: CentOS 7.9(2009) 軟件: VMware Workstation 17 Pro 17.5.0 build-22583795 1.配…