Cortex-M3 内核架构粗总结

    使用两天时间,粗略看了《Crtex-M3权威指南》(宋岩译),内容有点多,看的头皮发麻,虽然译者注释尽量想要有趣,但是由于比较硬核,所以看起来依然比较痛苦。深夜合上书在此做一下简单总结,可能写的很乱,主要帮助回忆。
	首先是整体概览,总的来讲,我认为对于内核理解来讲最重要的就是**存储器映射**、**寄存器组**、**总线架构**,然后就是更加细致方面的内容,包括操作模式与特权级别、中断控制器、异常、存储器保护单元、thumb-2 指令集(融合之前的ARM指令和thumb指令)以及调试支持。下面就按照此顺序展开。

寄存器组(32位)

CM3的寄存器组由16个32位寄存器R0-R15组成,其中R0-R12是通用寄存器,用于数据操作;R13是堆栈指针,CM3提供了两个堆栈指针供选择,但是同一时刻只有一个可以看到(banked),他们分别是主堆栈指针MSP和线程堆栈指针PSP,(对于这两个堆栈指针的使用情况这里简单说明下,两个堆栈是并行的,可以看作没有关系,当处于用户应用程序代码下可以用MSP,也可以用PSP,默认状态下是使用MSP,但是在handler程序只能使用MSP,所以当程序在这两种模式下跳转时,有时会出现需要改变堆栈指针的情况);R14为连接寄存器(LR),它用来在呼叫子程序时存储返回地址;R15为程序计数寄存器(PC),它指向当前程序地址(当前取指地址,不是执行的指令地址,更不是解码地址)。
除了以上的16个寄存器外,还有一些特殊寄存器,包括程序状态寄存器s(xPSR,三合一)、中断屏蔽寄存器s(PRIMASK, FAULTMASK, BASEPRI)、控制寄存器(CONTROL)。

存储器映射

CM3存储器映射4G空间,并且对这些内存进行了初步的粗线条划分,他们从低地址到高地址划分为:

  • Code, 512M
  • SRAM, 512M, 支持位带操作
  • Peripheral, 512M, 支持位带操作
  • External RAM, 1G
  • External Device, 1G
  • System Level, 512M
  1. 代码区存储程序代码,其实代码可以放在代码区、内部RAM区和外部RAM区,但由于CM3是哈佛架构,数据总线和指令总线分开并行,相互之间不影响,所以最好时把程序放在代码区。
  2. 静态RAM区存数据,当然也可以存程序,它支持位带操作,这个后面详细介绍。
  3. 外设区用于片上外设的使用,他也支持位带操作,但是他不允许执行指令。
  4. 最后的system level用于内核私用,它包括系统级组件、内部私有外设总线、外部私有外设总线、以及芯片设计者自定义的外设。

我们说,cpu内核所有的东西都有具体的地址,分布在这些区内。存储区是由访问属性的,MPU可以管理访问属性,但是MPU有时根本就没配置或者被除能了,内核是有缺省访问许可的,
下面说说位带操作。传统访问寄存器某一位时,我们需要根据地址把它读出来,然后进行位操作(同时考虑屏蔽其他位),然后再写入原来位置,即读-改-写。位带操作位我们实现位读写的简洁方式,我们位每一个位起一个别名,放在一个32位的字内,相当于时为位量,这些别名都放在位带别名区,当我们需要对某一位操作时,直接对别名操作,这样我们访问位就像访问变量一样。
同时关于内存还有地址对齐、互斥访问等问题,不详细展开。

总线架构

CM3采用的是哈佛架构,即指令与数据分开存储。进一步的,它采用三级流水线,分别是:取指解码执行。这种方式使得在我取当前指令的同时,进行上一条指令的解码以及上上条指令的执行,效率提升。
处理器内部的结构可以用图来清晰表示,它除了内核之外,还有很多十分重要的组件模块,这些组件是帮助完成系统控制和调试支持的。
- CM3-core
- NVIC
- SysTick定时器
- MPU存储保护单元
- BusMatrix总线矩阵
- 其他组件(用于调试)
其中,NVIC与core紧密耦合,他是内核内嵌的中断控制器,包含的内容有很多,包括异常、中断、滴答定时器、以及许多控制寄存器。MPU是可选配置,可由芯片厂商设计芯片时决定。
总线矩阵是总线系统的核心组件,它来完成总线互连网络,让数据在不同总线之间并行传递,我的理解就是总线数据的调度作用。
各个模块之间是通过总线连接。
- I-Code总线
- D-Code总线
- 系统总线
- 内部私有外设总线
- 调试访问端口总线
- 其他接口
总线都是32位总线,另外注意他们访问的地址,指令和数据总线访问代码区地址,从SRAM区到私有外设总线区之间的地址以及顶部的闺房区都由系统总线访问,剩下的内部/外部私有外设总线区分别由各自的总线访问。

处理器内核是没有存储器的,它是完成理论上的管理架构,更多的是硬件集成电路实现,包括映射方式、传输方式、执行流程、一些固定模块供能等,然后通过总线与外部设备和存储器连接,将理论上的架构落实,也就是说它连上存储器后,我们才有了数据的载体,这些操作才能真正落实,相当于CM3为我们修好了路(IP核),它可以到哪,怎么绕山过江、路线设计等这些固定基础设施都已经设计建造好了,我们把车放上去之后,这条路才算真正投入运行。芯片公司就是放车(外设、存储器等设备)的,它放什么车,放多少车决定我们运行的效率。程序员是开车的司机,我们要考虑的是怎么把车开好(实现功能需求)、开稳(鲁棒)、开快(效率)。

上面把最为主要的三部分基础,下面介绍剩下的内容,这些内容也很重要,但是前提是要把上面三部分搞清楚了,才行,否则地址跳来跳去的都不知道说的是哪。

操作模式与特权级别

CM3的操作模式分为:handler模式thread模式
特权级别分为:特权级用户级

操作模式的划分是为了区分用户操作代码(主应用程序代码)和异常服务代码(handler代码)的,也就是说异常响应handler程序要运行在handler模式下,而应用程序运行在thread模式下。从另一个角度来讲,特权级别是为了区分内存访问权限的,因为普通用户代码不能随便访问内存,有些重要存储地址是被禁止访问的,那么很明显,handler代码必然是都拥有特权级访问权限的,而用户应用程序有时只具有应用级权限,有些具有特权级权限。我们可以转换引用程序的权限,从特权级转为应用级很简单,修改CONTROL寄存器的值就行,而要从用户级转为特权级,则要走“法律程序”,也就是先呼叫异常(一般时SVC),在异常服务例程中(也就是handler代码中)执行进行判断和修改CONTROL的值,从而转到特权级。

中断控制器

NVIC全称是 嵌套向量中断控制器 ,他的功能可太重要了,它和core紧密耦合,很多内核的过程控制都需要通过NVIC里面的寄存器来配置等等,包括中断控制、动态优先级调整、SysTick等。
- 支持向量中断
- 向量嵌套(根据优先级抢断)
- 动态优先级调整
- 缩短中断延时(咬尾、晚到等机制)
- 其他寄存器等
其实还是要区分异常和中断的概念的话,我认为改这样理解:首先异常包含中断的,因为任何打乱当前指令执行顺序的行为都叫异常。异常包括系统异常(也可以理解为系统中断)和外部中断(狭义的中断IRQ),系统异常有复位、NMI、硬fault、SVC、PendSV、SysTick以及很多的其他各种原因产生的fault还有调试等,一共16个,除此之外是240个外部中断,但是每个异常都要有自己的handler程序。其实我们实际使用当中不必咬文嚼字,所以我也不费劲区分,都叫异常或者都叫中断,简化记忆,因为有更重要的东西需要考虑,那就是优先级。

向量表一般是存在0x0000_0000开始的,第一个是MSP初始值,第二个是存复位地址,之后按照固定的顺序排列,其中除了某些固定的异常优先级不可改以外(复位-3,NMI-2,硬fault-1),其他的优先级都是可编程改变的,而且前面说的外部中断240是最大值,实际使用到了多少根据芯片设计而定。

异常

这部分这里主要说说优先级。我们知道异常一共有256个,每个都要有优先级,NVIC的每个中断的优先级通过一个8位寄存器,优先级使用抢占优先级和亚优先级共同决定的结构,寄存器内的分布位 [ 抢占优先级 | 亚优先级],并且是高位对其的,这样是为了避免定义优先级时超过位数上限发生反转。

然后介绍三个寄存器:PRIMASK、FUALTMASK、BASEPRI,这三个分别用来掩蔽异常的。

存储器保护单元

这个只了解,MPU是用来配置存储器的访问属性的,访问属性分四种:可否缓冲(bufferable)、可否缓存(cacheable)、可否执行(executable)、可否共享(sharable)。

其他

其他包括

  • thumb-2 指令集(融合之前的ARM指令和thumb指令)
  • 调试支持
  • C与汇编接口

等等,这些一方面是汇编指令相关的,我不建议深入看,用时查即可;另一方面调试支持部分,对芯片设计者和IDE设计者是比较重要的,对于应用程序和系统程序而言,暂时不看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值