ARM内核的PSP与MSP
堆栈(Stack)
单片机程序运行时如果发生中断或者函数调用时需要保存当前运行程序的返回地址、局部变量、寄存器的临时值等信息,所用的存储位置被称之为“堆栈”。堆栈需要使用可以快诉访问的的内存,因而单机程序在编译链接过程会分配固定的RAM空间存储空间供堆栈使用。
堆栈指针SP(Stack Pointer)
堆栈指针是一个特殊的寄存器,它始终指向堆栈的顶部地址,即下一个可用存储位置。单片机程序启动时会将链接过程分配的堆栈存储空间的最高地址赋值给SP。(堆栈空间使用时从高地址向低地址方向,使用“先入后出”机制)。
Cortex-M3内核中存在两个Stack Pointer堆栈指针概念:MSP(Main Stack Pointer)和PSP(Process Stack Pointer)。两个指针指向不同的物理地址区域,功能上都属于SP。SP在不同的场景下映射至MSP或者PSP, 不能同时映射至MSP和PSP。
MSP
MSP 即主堆栈指针,MCU 复位后SP 默认映射至MSP。在无操作系统的应用场景,仅使用MSP。
PSP
PSP即线程堆栈指针,在操作系统应用的时候需要使用PSP。CONTROL bit[1]设置为1时 SP切换至PSP, 在进入Handler 模式是通过将CONTROL bit[1]设置为0可将SP 切换至MSP。
操作模式
Arm Cotex M支持两种工作模式(处理器模式/线程模式)和两种特权级(特权级/用户级)。处理器运行在异常或者中断程序时,处理器处于处理器模式。处理器运行在用户程序时,处理区处于线程模式。应用程序可以在特权级和用户级两种访问权限级别状态下运行。异常/中断程序只可以在特权级访问权限级别状态下运行。
特权级 | 用户级 | |
---|---|---|
异常(中断)程序 | 处理器模式 | –(错误用法) |
应用程序 | 线程模式 | 线程模式 |
特权级提供一种机制用来访问存储器的关键区域,同时还提供了一个基本的安全模式,使普通用户程序无法意外甚至恶意地执行涉及要害的操作。通过将CONTROL bit[0]设置为1用户在访问特权级别时可以是程序转换到用户访问级别。但是用户程序不能通过设置CONTROL bit[0]位为0直接变回特权级。必须要通过异常处理程序来设置CONTROL bit[0]位为0似的处理器切换为特权访问级别。
特权级状态先可以访问所有的资源。
用户级为普通应用程序提供一种受限制的工作模式。用户级状态下资源的访问会受限制。