茂名市网站建设_网站建设公司_数据统计_seo优化
2025/12/24 8:39:37 网站建设 项目流程

MSP 和 PSP 的使用环境

即使不使用 RTOS,一定会用到 MSP,但通常不会用到 PSP

在不带操作系统的“裸机(Bare-metal)”环境下,MSP 和 PSP 的使用情况如下:


1. MSP 是必须使用的 (Always Used)

无论写多么简单的代码,只要是用 C 语言写的,MSP 就一直在工作。

  • 启动阶段:正如前面所说,硬件上电第一步就是加载 MSP。
  • main 函数:在裸机程序中,你的 main 函数、所有的局部变量、函数嵌套调用,默认全部都在使用 MSP
  • 中断处理:所有的中断服务程序(ISR)始终使用 MSP
  • 默认状态:Cortex-M 复位后,默认处于“特权级线程模式”,且默认指向 MSP。如果你不去特意修改控制寄存器(CONTROL register),CPU 永远不会自动切换到 PSP。

结论:在裸机开发中,MSP 是你唯一的堆栈指针


2. PSP 是通常不用的 (Usually Idle)

在裸机环境下,PSP 处于闲置状态。

  • 为什么不用? 因为裸机程序通常只有一个执行流(main 函数里的 while(1) 循环)。既然只有一个执行流,就没有必要把“系统栈”和“进程栈”分开,直接用 MSP 搞定一切更简单。
  • 什么时候会用? 除非你是一个高级开发者,想在裸机上实现一些类似“多任务”的黑科技(比如手写一个极简的协程库或者状态机切换),你才会手动通过汇编指令去设置并在 CONTROL 寄存器里开启 PSP。

3. RTOS 为什么要强行把它们分开?

为了对比,我们看看有了 RTOS 之后的变化:

特性 裸机 (Bare-metal) 有 RTOS (FreeRTOS/LiteOS)
main 函数使用 MSP MSP (启动阶段) -> 切换后不再使用
用户任务使用 (无任务概念) PSP (每个任务有独立的 PSP)
中断服务使用 MSP MSP (全系统共用一个 MSP)
堆栈隔离 无隔离,全家共用 MSP 任务用 PSP,内核用 MSP,实现安全隔离

RTOS 的逻辑是:

  1. MSP 专门留给中断。因为中断是无法预测什么时候发生的,给它一个独立的 MSP,可以保证不管任务栈(PSP)怎么折腾,中断永远有地方跑。
  2. 每个任务分配一个 PSP。任务切换时,RTOS 只需要把 R13 指向下一个任务的 PSP 即可。

小结

  • MSP:它是 MCU 的“底色”。没有它,C 语言跑不起来,中断进不去。裸机开发 100% 在用它。
  • PSP:它是给“多任务”设计的。它像是一个额外的工具,专门用来把“用户程序”和“系统程序(中断/内核)”的堆栈空间隔离开。裸机开发通常 0% 使用它。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询