Cortex-M3
初探CM3
ARM Cortex-M3处理器,Cortex系列的处女作。
招牌功夫:
- 性能强劲
- 功耗低
- 实时性好,能够极速地响应中断,而且响应中断所需的周期数是确定的
- 代码密度得到很大改善
- 使用更方便
- 低成本的整体解决方案
- 遍地开花的优秀开发工具
基于从ARMv6开始的新设计理念,ARM进一步扩展了它的CPU设计,ARMv7架构闪亮登场,内核架构首次从单一款式变成3种款式。
- 款式A:设计用于高性能的“开放应用平台”
- 款式R:用于高端的嵌入式系统,尤其是那些带有实时要求的——又要快又要准时
- 款式M:用于深度嵌入的,单片机风格的系统中
到了架构7时代,ARM改革了一度使用的,冗长的、需要“解码”的数字命名法,转到另一种看起来比较整齐的命名法。比如,ARMv7的三个款式都已Cortex作为主名。这不仅更加澄清并且精装了所使用的ARM架构,也避免了新手对架构号和系列号的混淆。例如。ARM7TDMI并不是一款v7的产品,而是辉煌起点——v4T架构的产品。
指令系统的开发
由于历史原因(从ARM7TDMI开始),ARM处理器一直支持两种形式上相对独立的指令集。
-
32位的ARM指令集,对应处理器的状态:ARM状态
-
16位的Thumb指令集。对应处理器的状态:Thumb状态
程序执行过程中,处理器可以动态地在两种执行状态之中切换。
Cortex-M3将自己的处理能力以身相许般地全托给Thumb-2指令集,这见证了Cortex-M3的用情专一。
这也意味着Cortex-M3不是向后兼容的。因此为ARM7写的ARM汇编语言不能直接移植到CM3上。
说了这么多,我们可以看看CM3处理器的舞台。
- 汽车电子,CM3处理器支持多达240个外部中断。
- 数据通信
- 工业控制
- 消费类产品
Cortex-M3是一个32位处理器内核。
采用哈佛结构,有独立的指令总线和数据总线。
但是,指令总线和数据总线共享同一个存储器空间(一个统一的存储器系统)
CM3中,小端模式和大端模式都是支持的。
寄存器组
CM3拥有R0-R15的寄存器组。R13作为堆栈指针SP。SP有两个,但是同一时刻只能看到一个。
-
R0-R12
- 32位通用寄存器,用于数据操作
- 绝大多数16位Thumb指令只能访问R0-R7
- 32位Thumb-2指令可以访问所有寄存器
-
Banked R13
- 两个堆栈指针,任意时刻只能使用其中一个
- 主堆栈指针(MSP):用于操作系统内核以及异常处理例程
- 进程堆栈指针(NSP):由用户的应用程序代码使用
- 堆栈指针的最低两位永远是0,这意味着堆栈总是4字节对齐的。
-
R14
- 连接寄存器
- 呼叫一个子程序时,由R14存储返回地址
-
R15
- 程序计数寄存器
- 指向当前的程序地址,如果修改它的值,就能改变程序的执行流(很多高级技巧就在这)
-
特殊功能寄存器
CM3在内核水平上搭载了若干特殊功能寄存器
包括
- 程序状态字寄存器组(PSRs) :记录ALU标志,执行状态,以及当前正在服务的中断号
- 中断屏蔽寄存器组(PRIMASK,FAULTMASK,BASEPRI)
- 控制寄存器(CONTROL)
操作模式和特权级别
操作模式:
- handle mode
- thread mode
特权分级:
- 特权级
- 用户级
从用户级到特权级的唯一途径就是异常
总线接口
CM3内部由若干总线接口,以使CM3能同时取址和访内。
- 指令存储区总线(两条)
- I-code
- D-code
- 系统总线
- 用于访问内存和外设
- 私有外设总线
- 负责一部分私有外设的访问
指令集
Cortex-M3只使用Thumb-2指令集的一个子集,允许32位指令和16位指令水乳交融,代码密度与处理性能两手抓
中断和异常
CM3的所有中断机制都有NVIC实现。。除了支持240条中断之外,NVIC还支持16-4-1=11个内部异常源,可以实现fault管理机制。