存储器系统的非对齐访问

2023-07-28

ARM汇编中的字对齐怎么理解

在ARM处理器直桐亏接支持的数据类型里,以能被4整除的地址开始连续的4个字节构成一个字,字的数据类型为4个连续的字节(32位);以偶数地址开始连续的2个字节构成一个半字,半字的数据类型为2个连续的字节(16位)。

在ARM中,有ARM和Thumb两种指令。

ARM指令:每执行一条指令,PC的值加4个字节(32bits).一次访问4字节内容,该唤燃字节的起始地址必须是4字节对齐的位置上,即地址的低两和轮虚位为bits[0b00],也就是说地址必须是4的倍数。

Thumb指令:每执行一条指令,PC的值加2个字节(16bits).).一次访问2字节内容,该字节的起始地址必须是2字节对齐的位置上,即地址的低两位为bits[0b0],也就是说地址必须是2的倍数。

遵循以上方式叫对齐(aligned)方式,不遵守这样方式称为非对齐(unaligned)的存储访问操 作。

当处理器处于ARM状态时,每条指令长为4字节,所以每执行一条指令PC的值加4个字节。
0x4000 0000 对应二进制的最后4位是 0000
0x4000 0004 对应二进制的最后4位是 0100
0x4000 0008 对应二进制的最后4位是 1000
0x4000 000C 对应二进制的最后4位是 1100
所以pc的值最后两位也就是bit[1:0]是不是都为 0 啊?

stm32f4的

FSM层兰鱼县今括督农希器C全称“静态存储器控制器”跑功,STM32可以通字架唱左针过市过FSMC与SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。

一、FSMC的特点:

1、 FSMC的一大特点是支持不同位宽的异步读写操作。

2、 FSMC的映射地址空间360问答中,不同的BANK是独立的,可用于扩展不同类型的存储器。当FSMC同时使用多个外部存储器时,FSMC会通过总线悬空延做映谓静侵资时时间参数,来防止访问守初表既爱快冲突发生。

3、 支持代码从FSMC扩展的外部存储器中直接运行。不需要首先调入内部SRAM。

二、FSMC律袁丰亲意你支的结构组成:

如图所示,FSMC主要分为四部分:

1、 FSMC一端连接着AHB高速总线,与Cortex-M3内核相连接。

2、 FSMC内部实际上航国管错推把沙区包括Nor Flash和N受单赶绿存附常and/PC Card两个控制器,支持两种不同的存储方式。

3、 外部设备接口。

4、 配置寄存器,用于选择FSMC的功能。

三、FSMC的映射空间

FSMC管理1GB的映射地址空间。可以划分为4个256M的BANK,每个BAN而证苗口委笑须续K又划分为4个6位来鸡色利飞担号真明4M的子BANK,如下表所示。

FAMC对每个存储块分配一个唯一的片选信号NE州盐贵投几环茶你即[4:1]。

四、FSMC的初始化

在使用SRAM之前,我们需要对SRAM使用的FSMC BANK进行参数配置,使之与SRAM芯片的要求相符合。

FS防装连帮领导量放MC所占用的引脚初始

在STM32技术手册中,针对FSMC引脚的GPIO模式配置,已经进行了说明,具体FSMC总线配置方法如下。下表指的是整个FSMC接口的引脚初始化配置原娘还握南革地这演说明,应该根据实际初始化相关的引脚。

完成FSMC引脚初始化后,办善要配置可编程存储器的参数,包括时序,是否支持非对齐访问和等待周期管理(只针对突发电督蛋离立连互的你销随模式访问PSRAM和NOR闪存

p.FSMC_AddressSetupTime = 0; //地址建立时间

p.FSMC_Addre亮服防洋既联双白写ssHoldTim倒开西阿境它e = 0; //地址保持时间

p.FSMC_DataSetupTime = 2; //数据建立时间

p.FSMC_BusTurnAroundDuration = 0; //总线恢复时间

p.FSMC_CLKDivision = 0; // 时钟分频因子

p.FSMC_DataLatency = 0; //数据产生时间

p.FSMC_AccessMode = FSMC_AccessMode_A; //FSMC NOR控制器时序

存储器类型、RAM数据宽度、AM地址范围、用的FSMC BANK、FSMC工作模式的初始化等。

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3; //使用了FSMC的BANK1的子板块3

FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//禁止地址数据线复用

FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM; //存储器类型为SRAM

FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //存储器数据宽度为16位

FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; //关闭突发模式访问

//等待信号优先级,只有在使能突发访问模式才有效

FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;

//关闭Wrapped burst access mode,只有在使能突发访问模式才有效

FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

//等待信号设置,只有在使能突发访问模式才有效

FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;

FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; //使能这个BANK的写操作

//使能/关闭等待信息设置,只在使能突发访问模式才有效

FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;

FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; //关闭Extend Mode

FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; //关闭Write Burst Mode

FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; //读操作时序参数

FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; //写操作时序参数

8086存储器系统的1MB空间为什么要分为奇偶两个部分,字访问时应注意什么

这样 奇存储器的选通信号BHE和偶存储器的选通信号A0 配合使用 使CPU可以访问一个存储体中
的一个字节或同时访问两个存储体中的一个字
8086的有些指令是访问字节的 有些指令是访问字的 当8086CPU要访问一个字而这个字起始于偶地址时 只要使A0=0 BHE=0 就可以一次访问到该字的内容 以此类推

文章推荐

相关推荐