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 就可以一次访问到该字的内容 以此类推