Cortex-M4 编程模型(Programmer Model)与 核心寄存器

8 篇文章 1 订阅
4 篇文章 0 订阅

编程模型:

  • 内核模型

该部分主要包括Cortex-M4的CPU工作模式和程序特权级别

Cortex-M4的CPU工作模式分为“线程模式(Thread Mode)和“处理模式(Handler Mode)

  • 当Cortex-M4被复位时,它默认工作在“Thread Mode”下,在该模式下用户可以通过设置CONTROL寄存器来将接下来要运行的程序设置为“特权级”程序或是“非特权级”程序。
  • 而当Cortex-M4在处理异常和中断时,它将工作在“Handler Mode”下,在该模式下运行的程序均为“特权级”程序。

Cortex-M4上运行的程序特权级别被分为“特权级(Privileged)”和“非特权级(Unprivileged”:

  • “非特权级”程序只能受约束地使用MSR/MRS等指令(也就无法访问系统的CONTROL寄存器),CPS指令更是无权使用;也无法访问系统计时器、NVIC和系统控制块(System Control Block)等硬件元;而对内存和外设的访问也会受到限制;若想转变为特权级程序,那么用SVC(Supervisor Call)指令触发软中断是唯一的途径。
  • “特权级”程序则可以无约束地使用任何指令。可以直接访问CONTROL寄存器来改变当前程序的特权级别。

 

  • 堆栈模型

Cortex-M4使用向下生长的栈。

配备了“主栈(Main Stack)”和“进程栈(Process Stack)”2个栈,并具有各自独立的栈指针。

当CPU处于“Handler Mode”时,使用“主栈”运行;而当CPU处于“Thread Mode”时,可使用“主栈”或“进程栈”运行,具体使用哪一个由CONTROL寄存器的配置来决定。

                       

  • 异常与中断

Cortex-M4处理器与NVIC控制器对所有异常和中断进行基于优先级处理。在处理异常或中断时,CPU均工作在“Handler Mode”。

 

  • 数据类型

             (默认工作于小端模式)

 

  • CMSIS软件接口标准

Cortex微控制器应用程序接口标准(Cortex Micro-controller Software Interface Standard),定义(规范化、统一化)了Cortex系列CPU核心外设核心寄存器的标准称谓及其访问“方法”(既函数),以及“异常”向量的标准称谓。从而向开发者提供了屏蔽了寄存器地址级硬件信息RTOS内核开发接口核心外设功能开发接口


核心寄存器:

                         

R0 ~ R12(均为32bits)

通用寄存器,其中R0~R7为低地址通用寄存器,R8~R12为高地址通用寄存器;

SP(R13)(32bits)

栈指针寄存器(Stack Pointer),实际上存在两个R13寄存器,分为主栈指针MSP(Main Stack Pointer)寄存器过程栈指针PSP(Process Stack Pointer)寄存器。任意时刻下CPU只能使用一个SP,当CPU处于线程模式(Thread Mode)时,运行非特权级程序(Unprivileged Software)只能使用PSP访问过程栈(Process Stack)(PS通常不止一个),而运行特权级程序(Privilege Software)可以使用MSP访问主栈(Main Stack)(通常只有一个);当CPU处于处理模式(Handler Mode)时,运行异常(Exception)服务程序,默认使用MSP访问MS。

> 异常(Exception)包括了硬件故障(Fault)和内外/软硬中断(Interrupt)。

LR(R14)(32bits)

连接寄存器(Link Register),用于存储函数调用或异常处理程序返回的数据。

PC(Program Counter)(R15)(32bits)

程序计数器,指向指令的指针,Reset后CPU将复位向量(Reset Vector)(位于地址0x00000004)的值存入PC并将最低位的值赋给EPSR寄存器的T位(可见,若设置不当,有可能导致CPU进入ARM State)。

PSR(Program Status Register)(共26有效bits,分布在一个完整字中)

程序状态寄存器,在一个字(Word = 32bits)内同时存放(不共享bits)了3个PSR,分别为:APSR、IPSR和EPSR。

APSR(Application Program Status Register),占用位[31:27]+[19:16],共8bits,记录了一系列与当前指令的操作结果相关的标志Flag(如:小于或负标志位N[31],零标志位Z[30],大于等于标志位GE[19:16]等);

IPSR(Interrupt Program Status Register), 占用位[8:0],共9bits,记录了当前发生的异常的类型编号,最多可表达2047个异常类型,但目前实际只有84种。

EPSR(Execution Program Status Register),占用位[26:24]+[15:10],共9bits,记录了CPU的Thumb State状态(若T[24]位为1,则CPU处于Thumb State),以及If-Then指令块中各个条件的判断结果,或可中断指令(Interruptible-Continuable Instruction, ICI)的下一个寄存器操作数(Register Operand)

> ICI指令通常为寄存器数据块读写指令(如LDM STM、VLDM、VSTM、VPUSH、PUSH、VPOP、POP等),需要多个指令周期来完成,若被异常中断则可将下一个要读/写的寄存器编号暂存于IPSR的ICI/IT位域内,作为ICI的现场保护机制。

 

Exception Mask Registers为异常屏蔽寄存器,共有3个,下段顺序列出,各占用一个完整的字(32bits),为用户提供屏蔽非致命的不重要的异常的功能,从而满足某些具有高实时性要求的应用:

PRIOMASK(Priority Mask Register)

优先级屏蔽寄存器,有效位为PRIMASK[0],该位置1时,除不可屏蔽中断(Non-Maskable Interrupt, NMI)以外的所有可以配置优先级的异常(通常为中断)都将被屏蔽(CPU不响应)。

FALUTMASK(Fault Mask Register)

故障屏蔽寄存器,有效位为FAULTMASK[0],该位置1时,除不可屏蔽中断(Non-Maskable Interrupt, NMI)以外的所有异常(包括故障异常)都将被屏蔽。

> 当CPU退出处理模式(Handler Mode)(可能是由任意类型的异常触发的)时,CPU将自动将FAULTMASK为清0,从新使能其对故障异常的响应。

BASEPRIO(Base Priority Mask Register)

基优先级屏蔽寄存器,有效位为BASEPRI[7:4],共4bits,记录了某个异常优先级(对优先级的表达与NVIC_IPRx寄存器中用到的表达相同),所有优先级低于或等于该优先级的异常将被屏蔽。

CONTROL(Control Register)

控制寄存器,有效位为[2:0],共3bits,分别控制了CPU所使用的栈(PS或MS)、当前程序的特权级别(有特权或无特权),以及浮点单元(Floating-Point Unit, FPU)的状态。

> 当CPU处于Thread Mode时可运行特权级程序(Privileged Software)非特权级程序(Unprivileged Software),而在Handler Mode下只运行特权级程序

 

> 非特权级程序访问核心寄存器的指令(MRS、MSR、CPS)受到一定的限制,访问内存和外设也受限,且无法访问系统计时器(System Timer)NVIC(Nested Vector Interrupt Controller)以及系统控制块(System Control Block)等硬件资源,不过可以通过SVC指令调用特权级程序;而特权级程序可使用所有指令,并访问所有的硬件资源。

 

> 特权级用户程序可通过将EPSR寄存器的T位设置为1来将CPU设置为Thumb State。若该位为0,则CPU工作在ARM State,此时若接收到Thumb指令,CPU将陷入自锁态(Lockup),只能通过Reset Exception来解除。

 

> Cortex-M4处理器采用ARMv7-M架构,仅支持Thumb-2指令集(从Cortex-M3系列开始,就勇敢地抛弃了ARM指令集),因此CPU只能工作在Thumb State下,在异常处理程序中亦如此。

 

> Thumb-2指令集是一套完善的精简指令集,同时存在16bits指令和32bits指令,完全兼容Thumb指令集,并具有丰富的拓展子集。这使得Thumb-2兼顾了Thumb指令集高存储密度、低功耗的优点和ARM指令集功能完善、高效的优点,是时下较为流行的指令集之一。它免除了繁杂的CPU状态切换操作,CPU得以完全工作在Thumb State之下。

 

【官方建议】

RTOS中的线程(或称“任务”)最好运行在Cortex-M4的Thread Mode下,这也是CPU在执行复位程序后默认返回的模式,此时CPU根据PSP寄存器来访问PS;而OS的内核(Kernel)异常处理程序(Exception Handler)则最好运行在CPU的Handler Mode下,可直接访问所有硬件资源,此时CPU根据MSP访问MS。

 

> OS内的每一个任务(线程)都有一个自己专属的过程栈,这些过程栈的指针都存放在对应任务的任务控制块(Task Control Block, TCB)的Task_SP成员上。当某个任务被调度(从就绪态转变为运行态)时,CPU将其TCB内Task_SP成员的值赋给CPU的核心寄存器SP(R13)的PSP,从而实现任务上下文切换(或现场恢复)。

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值