- 款式A:设计用于高性能的“开放应用平台”——越来越接近电脑了。(手机电脑处理器)
- 款式R:用于高端的嵌入式系统,尤其是那些带有实时要求的——又要快又要实时。(实习系统处理器,用于高档轿车、机械臂等其他要求较高工业设备中)
- 款式M:用于深度嵌入的,单片机风格的系统中——本书的主角。(低成本、低功耗,)
- 32位的ARM指令集,对应处理器状态为 ARM 状态。
- 16位的Thumb指令集,对应处理器为thumb状态。
注:功能上,thumb指令集为ARM指令集的一个子集。
支持16&32位指令
注:cortex-m3仅使用thumb-2指令。
R0 - R7(低组寄存器);R8 - R12(高组寄存器)
堆栈指针R13- 主堆栈指针(Main_Stack_Pointer, MSP):默认堆栈指针,用于内核,异常服务例程,以及所有需要特权(Privileged )访问的应用程序代码
- 进程堆栈指针(Process_Stack_Pointer, PSP):用于常规应用程序代码,不处于异常服务例程(exception handle)中
注1:MSP,亦写作 SP_main,这是复位后缺省使用堆栈指针,服务于操作系统内核和异常服
务例程;而 PSP,亦写作 SP_process,典型地用于普通的用户线程中。
注2:CM3操作模式介绍,CM3支持两种mode,两个level。
- Mode: Thread mode&Handle mode
- Level: Privileged level&user level
LR 连接寄存器:Link Register LR寄存器的作用主要由两个:
一是用来保存子程序的返回地址;当通过BL或BLX指令(程序跳转指令)调用子程序时,硬件自动将子程序返回地址保存在R14寄存器中。子程序返回时,把R14的值复制到程序计数器PC,即可实现子程序返回。
二是当异常发生时,R14中保存的值等于异常发生时程序计数器PC的值减4(因为cortex-m3采用3级指令流水线)。因此在异常模式下,可以根据R14的值返回到异常发生前的相应位置,继续执行。
注:因为 CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。
特殊功能寄存器组- 程序状态寄存器组( PSRs 或曰 xPSR)
- 中断屏蔽寄存器组( PRIMASK, FAULTMASK,以及 BASEPRI)
PRIMASK:置一后除了fault与NMI其余中断均被屏蔽
FAULTMASK:fault也被屏蔽
BASEPRI:被屏蔽优先级的阈值。 - 控制寄存器( CONTROL)
用于定义特权级与用户级以及选择目前使用的堆栈指针(MSP或者PSP)
注:它们只能被专用的 MSR 和 MRS 指令访问,而且它们也没有存储器地址。
- 可以理解为线程模式为处理器运行普通代码时的模式,Handler模式为异常时处理器的模式。
- Thread模式可以是用户级也可以是特权级,handler模式只能是特权级。
注:线程模式:Thread Mode
特权等级(Privileged )与用户等级(User)区别特权等级(Privileged )下处理器能够访问任何寄存器,用户等级下,对系统控制寄存器 SCS(System Control Space)和特殊寄存器(通过 MSR/MRS 访问的寄存器)的访问将被阻止(除了 APSR,);如果在用户级下,访问了上述寄存器,那么 会出现HardFault 。
特权级和用户级的区别在于,访问 Core 寄存器的限制!
正常情况下,系统复位后,处理器处于特权级+线程模式(因为系统复位后,一般都需要先配置系统寄存器,状态等);在配置完本机需要的系统寄存器后,可以选择往 CONTROL[0] 写1,进入用户线程模式,此刻系统寄存器不在接受改动,一旦进入了用户线程模式,用户级下的代码不能再试图修改 CONTROL[0] 来返回特权模式;但是用户线程模式下,可以通过触发一个异常 Handler,进入 Handler 模式,所有 Handler 模式一定都是特权级别,可以在这个模式下去更改 CONTROL[0],让 Handler 返回的时候再次进入特权的线程模式。
注: 把代码按特权级和用户极分开对待,有利于使架构更加安全和健壮!回到之前,堆栈分为PSP与MSP 不同的堆栈对应不同的模式。(运行在线程模式的用户代码使用 PSP,而异常服务例程则使用 MSP)



