ARM 架构中的 CONTROL 寄存器

ARM 架构中的 CONTROL 寄存器

本文来自于我关于 Arm Cortex-M 编程模型的系列文章。欢迎阅读、点评与交流~
1、Arm Cortex-M 处理器的编程模型
2、ARM 架构中的R13栈指针(SP)
3、ARM 架构中的R14链接寄存器(LR)
4、ARM 架构中的 R15 程序计数器(PC)
5、ARM 架构程序状态寄存器(PSR)详解:从基础概念到现代实现
6、ARM 架构中的 PRIMASK、FAULTMAST、BASEPRI 寄存器
7、ARM 架构中的 CONTROL 寄存器

在 ARM 架构(特别是 Cortex-M 系列)中,CONTROL 寄存器是一个关键的特殊功能寄存器,用于控制系统栈、特权级别和执行模式。它通常用于嵌入式实时操作系统(RTOS)或需要特权分离的应用程序。


1. CONTROL 寄存器的主要功能

CONTROL 寄存器主要控制以下三个方面:

(1) 栈指针选择

  • bit[1] = SPSEL (Stack Pointer Select)
    • 0 :使用 MSP(主栈指针, Main Stack Pointer),默认上电后的栈指针,常用于内核和异常处理。
    • 1 :使用 PSP(进程栈指针,Process Stack Pointer),常用于用户任务栈,以实现任务栈与内核栈的隔离。

(2) 特权级别

  • bit[0] = nPRIV (Thread mode privilege level, nPRIV全称通常是 Not PRIVileged
    • 0 :在 Thread 模式下具有 特权级(Privileged)。
    • 1 :在 Thread 模式下处于 用户级(Unprivileged),此时无法访问某些系统寄存器(如 MSR/MRS 访问部分特殊寄存器)。

注意:Handler 模式(异常/中断)始终是特权级,不受此位影响。

(3) FPU 上下文控制(Cortex-M4/M7 等带 FPU 的芯片)

  • bit[2] = FPCA (Floating-Point Context Active)
    • 1:表示当前执行上下文使用过 FPU 寄存器,异常返回时需自动保存/恢复 FPU 寄存器。
    • 0:表示未使用 FPU,无需保存 FPU 寄存器以加快中断响应。

(4) SFPA(Secure Floating-Point Active,ARMv8-M 安全扩展)

  • 与 TrustZone 安全扩展相关。

2. 典型使用场景

场景一:RTOS 任务切换

在 RTOS 中,内核运行在特权级并使用 MSP,每个用户任务可以运行在用户级并使用 PSP,以实现内存保护。

c 复制代码
// 切换到用户级并使用 PSP
void switch_to_user_mode(void) {
    __set_CONTROL(0x03); // SPSEL=1, nPRIV=1
    __ISB(); // 确保指令同步
    // 此后运行在用户级,使用 PSP
}

场景二:特权级与栈分离

  • 特权级 + MSP:操作系统内核、异常处理。
  • 用户级 + PSP:应用程序任务,受限访问。

3. CONTROL 寄存器的位域

CONTROL 寄存器的具体位域定义可以参考下表(来自《ARM Cortex-M3与Cortex-M4权威指南》):

4. 访问 CONTROL 寄存器

在 Cortex-M 中,可通过 MSR/MRS 指令访问:

assembly 复制代码
MRS R0, CONTROL    ; 读取 CONTROL 到 R0
MSR CONTROL, R0    ; 将 R0 写入 CONTROL

C 语言中可使用 CMSIS 提供的函数:

c 复制代码
#include <arm_cmse.h>
uint32_t control = __get_CONTROL();
__set_CONTROL(new_control);

5. 注意事项

  • 修改 CONTROL 寄存器后,通常需要立即执行 ISB 指令,以确保后续指令使用正确的栈和特权级。
  • 在 Handler 模式下,不能直接通过 CONTROL 寄存器切换到 PSP,但可以在退出异常前修改 CONTROL,使返回 Thread 模式后使用 PSP。
  • 从用户级(非特权)切换回特权级只能通过异常(如 SVC 指令)进入 Handler 模式,在 Handler 中修改 CONTROL。

6. 与 APSR、PRIMASK 等其他寄存器的区别

  • APSR:存放程序状态标志(N、Z、C、V)。
  • PRIMASK:中断屏蔽寄存器。
  • CONTROL:不屏蔽中断,只控制栈和特权级别。

7. 示例:RTOS 上下文切换

在 PendSV 异常中,保存当前任务的 PSP 上下文,恢复下一个任务的 PSP,并可能修改 CONTROL 以在返回后使用 PSP 和用户级。


如果你正在开发 RTOS 或安全相关的固件,理解 CONTROL 寄存器的行为是至关重要的。需要根据芯片的具体架构(如 Cortex-M3/M4/M7、ARMv8-M 等)查阅对应的技术参考手册以获取完整细节。

相关推荐
Jason_zhao_MR2 小时前
RK3576 MIPI Camera ISP调试:主观调优与工程实战(下)
stm32·嵌入式硬件·安全·系统架构·嵌入式
天上路人6 小时前
A-59F所有应用模式说明
人工智能·硬件架构·音视频·语音识别·实时音视频
LN花开富贵7 小时前
Ubuntu aarch64 架构安装 NoMachine 远程控制 避坑与实战
linux·运维·笔记·学习·ubuntu·嵌入式
底层开发智库7 小时前
无需硬件开发板,从零构建并运行ARM aemfvp-a-rme软件栈
arm开发·arm
2023自学中7 小时前
imx6ull开发板,Linux-c编程,识别 键盘、鼠标、触摸屏坐标
linux·嵌入式·开发板·应用编程
婷婷_1729 小时前
【PCIe 验证每日学习・Day36】PCIe 存储器寻址空间与 BAR 底层原理
网络·学习·程序人生·芯片·pcie
至为芯11 小时前
IP2369至为芯支持C口双向快充的45W多串锂电池充电管理SOC芯片
集成电路·芯片·电子元器件
深圳市贝乐实业股份有限公司11 小时前
智能音箱的“隐形功臣”:APS1604M-SQRX
芯片·psram·存储芯片·aps1604m-sqrx
IAR Systems11 小时前
瑞萨RH850与IAR:助力下一代“软件定义汽车”开发
汽车·嵌入式·iar
lularible14 小时前
从沙子到车辙(2.1):思想实验——在原始森林里造芯片
开源·嵌入式·汽车电子