ARM Cortex-M3权威指南-总线架构图和存储系统(3)

系统图

 

  • NVIC 嵌套向量中断控制器
  • SYSTICK Timer 一个简易的周期定时器,用于提供时基, 亦被操作系统所使用

系统滴答定时器是一个非常基本的倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了。 SysTick 定时器也是实现在NVIC 内部的。

  • MPU 存储器保护单元(可选)

MPU 是一个选配的单元,有些 CM3 芯片可能没有配备此组件。如果有,则它可以把存储器分成一些 regions,并分别予以保护。例如,它可以让某些 regions在用户级下变成只读,从而阻止了一些用户程序破坏关键数据

  • CM3BusMatrix 内部的 AHB 互连
  • AHB to APB 把 AHB 转换为 APB 的总线桥
  • SW-DP/SWJ-DP 串行线调试端口/串行线 JTAG 调试端口。通过串行线调试协议或者是传统的 JTAG 协议(专用于 SWJ-DP),都可以用于实现与调试接口的连接
  • AHB-AP AHB 访问端口,它把串行线/SWJ 接口的命令转换成 AHB 数据传送
  • ETM 嵌入式跟踪宏单元(可选组件),调试用。 用于处理指令跟踪
  • DWT 数据观察点及跟踪单元,调试用。这是一个处理数据观察点功能的模块
  • ITM 仪器化跟踪宏单元
  • TPIU 跟踪单元的接口单元。所有跟踪单元发出的调试信息都要先送给它,它再Cortex-M3
  • 转发给外部跟踪捕获硬件的。
  • FPB Flash 地址重载及断点单元

flash地址重载是指:当CPU访问某条指令时,若该地址在FPB中“挂了号”,则将把该地址重映射到另一个地址,后者亦在编程FPB时指出。 实际结果是从映射过的地址处取指(通常,映射前的地址是flash中的地址,映射后的地址是SRAM中的地址,所以才是”Flash”地址重载)。此外,匹配的地址还能用来触发断点事件。

  • ROM 表 一个小的查找表,其中存储了配置信息

存储系统功能概览

第一,它的存储器映射是预定义的,并且还规定好了哪个位置使用哪条总线
第二,CM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中。
第三,CM3 的存储器系统支持非对齐访问和互斥访问。这两个特性是直到了 v7M 时才出来的。
最后,CM3 的存储器系统支持 both 小端配置和大端配置

存储器映射

CM3 只有一个单一固定的存储器映射。这一点极大地方便了软件在各种 CM3 单片机间的移植。举个简单的例子,各款 CM3 单片机的 NVIC 和 MPU 都在相同的位置布设寄存器,使得它们变得与具体器件无关。尽管如此, CM3 定出的条条框框是粗线条的,它依然允许芯片制造商灵活细腻地分配存储器空间,以制造出各具特色的单片机产品。
存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私有外设区的组件包括:

  1.  闪存地址重载及断点单元(FPB)
  2. 数据观察点单元(DWT)
  3. 仪器化跟踪宏单元(ITM)
  4. 嵌入式跟踪宏单元(ETM)
  5. 跟踪端口接口单元(TPIU)
  6. ROM 表

CM3的地址空间是4GB, 程序可以在代码区,内部 SRAM 区以及外部 RAM 区中执行。但是因为指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用自 己的总线,并行不悖。

内部 SRAM 区的大小是 512MB,用于让芯片制造商连接片上的 SRAM,这个区通过系统总线来访问。在这个区的下部,有一个 1MB 的位带区,该位带区还有一个对应的 32MB 的“位带别名(alias)区”,容纳了 8M 个“位变量”,位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适用于取指。通过位带的功能,可以把多个布尔型数据打包在单一的字中,却依然可以从位带别名区中,像访问普通内存一样地使用它们。位带别名区中的访问操作是原子的,消灭了传统的“读-改-写”三步曲。地址空间的 512MB 范围由片上外设(的寄存器)使用。这个区中也有一条 32MB位带别名,以便于快捷地访问外设寄存器。例如,可以方便地访问各种控制位和状态位。要注意的是,外设内不允许执行指令。

1GB 的范围,分别用于连接外部 RAM 和外部设备,它们之中没有位带。两者的区别在于外部 RAM 区允许执行指令,而外部设备区则不允许。

0.5GB 的隐秘地带,属于 CM3 核心空间,包括了系统级组件,内部私有外设总线 s,外部私有外设总线 s,以及由提供者定义的系统外设。
私有外设总线有两条:
    AHB 私有外设总线,只用于 CM3 内部的 AHB 外设,它们是:NVIC, FPB, DWT 和 ITM。
    APB 私有外设总线,既用于 CM3 内部的 APB 设备,也用于外部设备(这里的“外部”是对内核而言)。 CM3 允许器件制造商再添加一些片上 APB 外设到 APB 私有总线上,它们通过 ABP 接口来访问。

CM3 中的 MPU 是选配的,由芯片制造商决定是否配上。
上述的存储器映射只是个粗线条的模板,半导体厂家会提供更展开的图示,来表明芯片中片上外设的具体分布, RAM 与 ROM 的容量和位置信息。

 

存储器访问属性

CM3 在定义了存储器映射之外,还为存储器的访问规定了 4 种属性,分别是:

  • 可否缓冲(Bufferable)
  • 可否缓存(Cacheable)
  • 可否执行(Executable)
  • 可否共享(Sharable)

CM3 片内没有配备缓存,也没有缓存控制器,但是允许在外部添加缓存。通常,如果提供了外部内存,芯片制造商还要附加一个内存控制器,它可以根据可否缓存的设置,来管理对片内和片外 RAM 的访问操作。如果配了 MPU,则可以通过它配置不同的存储区,并且覆盖缺省的访问属性。

  • 代码区(0x0000_0000‐ 0x1FFF_FFFF)。该区是可以执行指令的,缓存属性为 WT(“写通”,Write Through),即不可以缓存。此区亦可写数据。在此区上的数据操作是通过数据总线接口的(读数据使用 D‐Code,写数据使用 System),且在此区上的写操作是缓冲的。
  • SRAM 区(0x2000_0000 – 0x3FFF_FFFF)。此区用于片内 SRAM,写操作是缓冲的,并且可以选择 WB‐WA(Write Back, Write Allocated)缓存属性。此区亦可以执行指令,以允许把代码拷贝到内存中执行——常用于固件升级等维护工作。
  • 片上外设区(0x4000_0000 – 0x5FFF_FFFF)。该区用于片上外设,因此是不可缓存的,也不可以在此区执行指令(这也称为 eXecute Never, XN)。
  • 外部 RAM 区的前半段(0x6000_0000 ‐ 0x7FFF_FFFF)。该区用于片外 RAM,可缓存(缓FF_FFFF)。并且可以执行指令。
  • 外部 RAM 区的后半段(0x8000_0000 – 0x9FFF_FFFF)。除了不可缓存(WT)外,同前半段。
  • 外部外设区的前半段(0xA000_0000 – 0xBFFF_FFFF)。用于片外外设的寄存器,也用于多核系统中的共享内存(需要严格按顺序操作,即不可缓冲)。该区也是个不可执行区。外部外设区的后半段(0xC000_0000 – 0xDFFF_FFFF)。目前与前半段的功能完全一致。
  • 系统区(0xE000_0000 – 0xFFFF_FFFF)。此区是私有外设和供应商指定功能区。此区不可执行代码。系统区涉及到很多关键部位,因此访问都是严格序列化的(不可缓存,不可缓冲)。而供应商指定功能区则是可以缓存和缓冲的。

 存储器缺省访问权限

CM3 有一个缺省的存储访问权限,它能防止用户代码访问系统控制存储空间,保护NVIC、MPU等关键部件。缺省访问许可在下列条件时生效:1)没有配备 MPU 2)配备了 MPU,但MPU未使能。

 位带操作

位带操作,可以使用普通的加载/存储指令来对单一的比特进行读写。在CM3中中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。这两个区中的地址除了可以像普通的 RAM 一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个 32 位的字。当你通过位带别名区访问这些字时,就可以达到访问原始比特的目的。

 

 

 位带操作的优势

通过GPIO控制LED点亮或者熄灭;对共享资源的互锁访问。

端模式

在 CM3 中, 是在复位时确定使用哪种端模式的,且运行时不得更改。指令预取永远使用小端模式,在配置控制存储空间的访问也永远使用小端模式(NVIC),另外外部私有总线地址也只使用小端模式。

存储保护单元MPU

在Cortex-M3处理器中可以选配一个存储器保护单元(MPU),它可以实施对存储器(主要是内存和外设寄存器)的保护,从而使软件更加健壮和可靠。如果打算启用MPU,则在使用前,必须根据需要对其编程。如果没有启用MPU,则等同于系统中没有配MPU。 MPU有如下的能力可以提高系统的可靠性:

  1. 阻止用户应用程序破坏操作系统使用的数据
  2. 阻止一个任务访问其它任务的数据区,从而把任务隔开
  3. 可以把关键数据区设置为只读,从根本上消除了被破坏的可能。
  4. 检测意外的存储访问,如,堆栈溢出,数组越界
  5. 此外,还可以通过MPU设置存储器regions的其它访问属性,比如,是否缓区,是否缓冲等。

MPU在执行其功能时,是以所谓的“region”为单位的。一个region其实就是一段连续的地址,只是它们的位置和范围都要满足一些限制(对齐方式,最小容量等)。 CM3的MPU共支持8个regions,个数有限。允许启用一个“背景region”(即没有MPU时的全部地址空间),不过它是只能由特权级享用。在启用MPU后,就不得再访问定义之外的地址区间,也不得访问未经授权的region。否则,将以“访问违例”处理,触发MemManage fault。MPU定义的regions可以相互交迭。如果某块内存落在多个region中,则访问属性和权限将由编号最大的region来决定。比如,若1号region与4号region交迭,则交迭的部分受4号region控制。背景region与其他region重合的部分,就要受各region的限制。

posted @ 2021-08-27 11:44  zephyr~  阅读(2423)  评论(0编辑  收藏  举报