购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.5 存储器映射

Cortex-M3只有一个单一固定的存储器映射。这一点极大地方便了软件在各种Cortex-M3间的移植。举个简单的例子,各款Cortex-M3芯片的NVIC和MPU都在相同的位置布设寄存器,使得它们变得通用。尽管如此,它依然允许芯片制造商灵活地分配存储器空间,以制造出各具特色的Cortex-M3产品。Cortex-M3支持4GB的可寻址内存空间,并提供简单和固定的内存映射。这些存储空间为代码(代码空间)、SRAM(内存空间),外部内存/设备和内部/外部外设提供了预定义的专用地址。另外,还有一个特殊区域专门供芯片厂家寻址用。

2.5.1 存储器组织

Cortex-M3存储器组织如图2.6所示,其地址空间是4GB,程序可以在代码区、内部SRAM区及外部RAM区中执行。但是因为指令总线与数据总线是分开的,最理想的是把程序放到代码区,从而使取指和数据访问各自使用自己的总线,并行不悖。0.5GB的代码区域,指令取指在ICode总线上执行,数据访问在DCode总线上执行。0.5GB的SRAM区域,指令取指和数据访问都在系统总线上执行。外设指令取指和数据访问都在系统总线上执行。

内部SRAM区的大小是512MB,用于芯片制造商连接片上的SRAM。在这个区的下部,有一个1MB的位段区(Bit band region),该位段区还有一个对应的32MB的位段别名区(Bit band alias),容纳了8MB个“位变量”。位段区对应的是最低的1MB地址范围,而位段别名区里的每个字对应位段区的一个比特。

地址空间的另一个512MB范围由片上的外设使用。这个区中也有一条32MB的位带别名,以便于快捷地访问外设寄存器。还有两个1GB的范围,分别用于连接外部RAM和外部设备,它们之中没有位带。两者的区别在于外部RAM区允许执行指令,而外部设备区则不允许。

图2.6 Cortex-M3存储器组织

存储空间的一些位置用于调试组件等私有外设,这个地址段被称为“私有外设区”。私有外设区的组件包括:

◆ 闪存地址重载及断点单元(FPB);

◆ 数据观察点单元(DWT);

◆ 指令跟踪宏单元(ITM);

◆ 嵌入式跟踪宏单元(ETM);

◆ 跟踪端口接口单元(TPIU);

◆ ROM表。

私有外设区有0.5GB,这里面包括了系统级组件、内部私有外设总线、外部私有外设总线,以及由提供者定义的系统外设。私有外设总线有两条:

◆ AHB私有外设总线,只用于CM3内部的AHB外设,它们是NVIC、FPB、DWT和ITM。NVIC所处的区域叫做“系统控制空间(SCS)”,在SCS里的还有SysTick、MPU及代码调试控制所用的寄存器。

◆ APB私有外设总线,既用于CM3内部的APB设备,也用于外部设备(这里的“外部”是对内核而言)。CM3允许器件制造商再添加一些片上APB外设到APB私有总线上,它们通过ABP接口来访问。

未用的提供商指定区也通过系统总线来访问,但是不允许在其中执行指令。

2.5.2 位段

处理器存储器映射包括两个位段区域,它们分别为SRAM和外设存储区域中的最低的1MB,将存储器别名区的一个字映射为位段区的一个位。借助位段技术,Cortex-M3处理器可以直接对数据的单个位进行访问。

Cortex-M3存储器映射有2个32MB别名区,它们被映射为两个1MB的位段区。

◆ 对32MB SRAM别名区的访问映射为对1MB SRAM位段区的访问。

◆ 对32MB外设别名区的访问映射为对1MB外设位段区的访问。

内存映射包含两个位于SRAM的1MB位段区和映射到32MB别名区域的外设空间。在别名区域中,某个地址上的加载/存储操作将直接转化为对该地址别名的位的操作。对别名区域中的某个地址进行写操作,如果置位最低有效位,则位段位写入1,如果使其最低有效位清零,则位段位写入0。读别名后的地址将直接返回适当的位段位中的值。除此之外,该操作为原子位操作,其他总线活动不能将其中断。映射公式显示如何将别名区中的字与位段区中的对应位或目标位关联。映射公式如下:

Bit_word_offset=(Byte_offset×32) + (Bit_number×4)

Bit_word_addr=Bit_band_base+Bit_word_offset

式中,Bit_word_offset为Bit-band存储区中的目标位的位置,Bit_word_addr为别名存储区中映射为目标位的字的地址,Bit_band_base是别名区的开始地址,Bit_offset为位段区中包含目标位的字节的编号,Bit_number为目标位的位置(0~7)。

图2.7显示了SRAM别名区和SRAM位段区之间的位段映射的例子,其中SRAM别名区的开始地址是0x22000000。

地址0x23FFFFE0的别名字映射为0x200FFFFF的位段字节的位0:

0x23FFFFE0=0x22000000+(0xFFFFF×32)+0×4

地址0x23FFFFFC的别名字映射为0x200FFFFF的位段字节的位7:

0x23FFFFEC=0x22000000+(0xFFFFF×32)+7×4

地址0x22000000的别名字映射为0x20000000的位段字节的位0:

0x22000000=0x22000000+(0×32)+0×4

地址0x220001C的别名字映射为0x20000000的位段字节的位7:

0x2200001C=0x22000000+(0×32)+7×4

图2.7 位段映射举例

位段区能够使用常规的读和写及写入该区操作进行访问。向别名区写入一个字与在位段区的目标位执行读—修改—写操作具有相同的作用。写入别名区的字的位0决定了写入位段区的目标位的值。将位0为1的值写入别名区表示向位段位写入1,将位0为0的值写入别名区表示向位段位写入0。别名字的位[31:1]在位段位上不起作用。写入0x01与写入0xFF的效果相同,写入0x00与写入0x0E的效果相同。读别名区的一个字返回0x01或0x00。0x01表示位段区中的目标位置位。0x00表示目标位清零,位[31:1]将为0。 2FE1TfntpC2I+9yosGBlmT1ilqK04vRQbQlXjskdBf4pdgG+CF0RCtshG7aF/3AK

点击中间区域
呼出菜单
上一章
目录
下一章
×