Cortex-M3是一个32位的处理器内核。
这代表其中的内部的数据路径是 32 位的,寄存器是 32 位的,存储器接口也是 32 位的。
上图是一个Cortex-M3的内部简化试图,去中的处理器内核系统集成了CPU(取指单元、指令解码器、算数逻辑单元和寄存器组),中断控制器(NVIC),存储器接口和跟踪接口。
寄存器组
其中寄存器组主要用于地址的临时存放或状态的保存等,其构成如下图所示:
R0~R12是通用寄存器,用于数据的存储。
注意:绝大多数 16 位 Thumb 指令只能访问 R0-R7,而 32 位 Thumb-2 指令可以访问所有寄存器
R13是存放堆栈指针的寄存器,Cortex-M3拥有两个堆栈指针:
- 主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程
- 进程堆栈指针(PSP):由用户的应用程序代码使用
R14是连接寄存器(LR),用于存放程序跳转后返回的指令地址
R15是程序计数寄存器(PC),用于指向当前的程序地址
以上的寄存器组也是Cortex-M系列的标配,此外Cortex-M3还有一些特殊功能寄存器。
操作模式
引入不同的操作模式是为了区别普通程序的代码和异常服务例程的代码
CM3将普通应用程序运行时的内核工作模式称为线程模式(Thread mode),该模式下主要运行的是用户自己定义的普通应用程序。当程序复位时,会默认从主应用程序开始执行,此时CM3以线程模式工作。
当内核需要处理一些异常或中断事件时,CM3将切换到处理者模式(Handler mode)。
特权级别
特权级别是为了为存储器的访问提供一种保护机制,使得普通的用户代码不会访问到重要的存储单元。
CM3将特权分级为特权级和用户级。
在线程模式下运行的程序既可以使用特权级,也可以使用用户级;但是运行在Handler模式下的异常服务程序就必须在特权级下执行。
但是特权级和用户级之前的切换并不是自由的。事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处 理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态。
存储器的映射
Cortex-M3支持4GB的存储空间
处于最高地址的系统级存储区,是 CM3 用于藏“私房钱”的——包括中断控制器、MPU 以及各 种调试组件
总线接口
Cortex-M3 内部有若干个总线接口,以使 CM3 能同时取址和访内(访问内存),它们是:
- 指令存储区总线(两条):负责对代码存储区的访问,分别是I-Code(用于取值)和D-Code(用于向量查表等操作)
- 系统总线:用于访问内存和外设,覆盖区域包括SRAM,片上外设,片外RAM,片外拓展设备以及系统级存储区的部分。
- 私有外设总线:针对专门的外设的访问,比如调试组件的访问。
中断和异常
CM3采用的时ARMv7-M架构,该架构开创了一个全新的异常模型。
CM3 的所有中断机制都由 NVIC 实现。
除了支持 240 条外部中断之外,NVIC 还支持 16-4-1=11 个 内部异常源,可以实现 fault 管理机制。结果,CM3 就有了 256 个预定义的异常类型