Cortex M3
第三讲 Cortex-M3基础
Cortex M3
Cortex-M3基础Cortex‐M3是一个32位处理器内核。内部的数据是32位的,寄存器是32位的,存储器接口也是32位的。 CM3采用了哈佛结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行。这样一来数据访问不再占用指令总线,从而提升了性能。
Cortex M3
内容提要
寄存器组异常和中断操作模式和特权极别存储器映射总线接口指令集复位
Cortex M3
3.1寄存器组
Cortex‐M3处理器拥有R0‐R15的寄存器组。
Cortex M3
R0-R12:通用寄存器
R0‐R12都是32位通用寄存器,用于数据操作。但是注意:绝大多数Thumb指令只能访问R0‐R7。
Cortex M3
R13:堆栈指针
Cortex‐M3拥有两个堆栈指针,任一时刻只能使用其中的一个。 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理。
进程堆栈指针(PSP):由用户的应用程序代码使用。
Cortex M3
R14:连接寄存器
当调用一个子程序时,为了减少访问内存的次数,由R14存储返回地址,把返回地址直接存储在寄存器中,这与其他大多数其它处理器都不一样。只有1级子程序调用的代码无需访问内存,从而提高了子程序调用的效率。如果多于1级,则需要把前一级的R14值压到堆栈里。在ARM编程时,应尽量只使用寄存器保存中间结果,迫不得以时才访问内存。
Cortex M3
R15:程序计数寄存器(PC)
指向当前的程序地址。如果修改它的值,就能改变程序的执行。
Cortex M3
寄存器
Cortex M3
特殊功能寄存器Cortex‐M3还在内核上搭载了若干特殊功能寄存器,包括: 程序状态字寄存器组PSRs;
中断屏蔽寄存器组PRIMASK, FAULTMASK, BASEPRI;控制寄存器CONTROL。
Cortex M3
程序状态寄存器(PSRs或xPSR)
程序状态寄存器在其内部又被分为三个子状态寄存器: 应用程序 PSR(APSR) 中断号 PSR(IPSR) 执行 PSR(EPSR)这3个寄存器即可以单独访问,也可以组合访问(2个组合,3个组合都可以),当使用三合一的方式访问时,应使用名字“xPSR”或者“PSRs”。
Cortex M3
Cortex M3
中断屏蔽寄存器组PRIMASK:屏蔽所有的中断——当然了,不可屏蔽NMI。 FAULTMASK:屏蔽所有的fault——NMI依然不受影响 BASEPRI:屏蔽所有优先级不高于某个具体数值的中断。
Cortex M3
控制寄存器(CONTROL)
控制寄存器用于还用于定义特权级别和堆栈指针的选择。
Cortex M3
特殊功能寄存器操作指令只能被专用的MSR和MRS指令访问。MRS<gp_reg>,<special_reg>功能:读特殊功能寄存器的值到通用寄存器。 MSR<special_reg>,<gp_reg>功能:写通用寄存器的值到特殊功能寄存器。
Cortex M3
3.2异常与中
断
在ARM编程领域中,凡是打断程序顺序执行的事件,都被称为异常(exception)。除了外部中断外,当有指令执行了“非法操作”,或者访问被禁的内存区间,因各种错误产生的fault,以及不可屏蔽中断发生时,都会打断程序的执行,这些情况统称为异常。在不严格的情况下,异常与中断也可以混用。程序代码也可以主动请求进入异常状态的(常用于系统调用)。
Cortex M3
Cortex M3
CM3的所有中断机制都由NVIC实现。除了支持240个外中断之外,NVIC还支持16‐4‐1=11个内部异常源。
虽然CM3是支持240个外中断的,但具体使用了多少个是由芯片生产商决定。
Cortex M3
NMI
CM3还有一个NMI(不可屏蔽中断)输入脚。当它被置为有效时,NMI服务程序会无条件地执行,NMI究竟被拿去做什么,还要视处理器的设计而定。在多数情况下,NMI会被连接到一个看门狗定时器,有时也会是电压监视功能块,以便在电压掉至危险级别后警告处理器。NMI可以在任何时间被激活。
Cortex M3
向量表
当一个发生的异常被CM3内核接受,对应的异常handler (处理程序)就会执行。为了决定handler(程序)的入口地址,CM3使用了“向量表机制”。这里使用一张向量表。向量表其实是一个WORD(32位整数)数组,每个下标对应一种异常,该下标元素的值则是该异常handler的入口地址。在复位后,该寄存器的值为0。因此,在地址0处必须包含一张向量表,用于初始时的异常分配。
Cortex M3