一、barrier指令DSB,DMB,ISB,fence——内存屏障,指令屏障

最近工作中遇到一个问题,大致描述一下:

        我们SOC用的arm cortex m7内核,在设计时设计人员图方便,将SPI controller的寄存器(即原本应该是APB空间)放在了0x60000000的某一块空间(此空间arm的memory定义区间为external memory),然后同时把SPI flash的存储空间也映射在了0x60000000的这一块区间内。后者将spi flash memory映射在此区间内其实时合理的。但是将spi controller的寄存器也放在这块空间,验证人员只验证了对寄存器的访问,是可以的,此时并没有发现什么问题。

        说明一下,spi controller用的synopsis的design ware IP:SSI。

        SSI要求在设置一些配置寄存器前必须先disable SSI模块,所以软件先对该寄存器设置,即对使能寄存器下disable=0,然后开始对一些配置寄存器对配置设定,比如位宽,clock divider等。注意有个前提,SOC powerup之后,使能寄存器默认是enable的。!所以还必须提前disable动作。

        debug软件时发现,在disable后的第一个配置寄存器的设定总是写不进去!

        后来通过验证simulation发现,在CPU出来的bus上,disable寄存器的设定竟然在第一个配置寄存器设定的后面,可是软件明明时先设定的disable。所以导致第一个配置寄存器的配置软件这边始终看不到生效!!!!

        至于原因,我们猜测时arm cortex-m7 cpu认为0x60000000区域是external memory区域,再加上cm7支援乱序发射双发射等等因素,导致cpu往spi

<think>嗯,用户想了解ARM架构中的ISB指令同步屏障的作用和用法。首先,我需要回忆ARM体系结构中的内存屏障指令。记得ARM有多种屏障指令,比如DMBDSBISB,它们各自有不同的用途。 ISB的全称是Instruction Synchronization Barrier指令同步屏障。它的主要作用是确保在屏障之后的指令能够重新从指令缓存或内存中读取,而不是使用之前预取的指令。这点和DMB(数据内存屏障)和DSB(数据同步屏障)不同,后两者主要处理数据访问顺序的问题,而ISB处理的是指令流本身的同步。 使用场景方面,可能是在修改系统控制寄存器或者上下文切换之后需要刷新流水线,确保后续指令能正确执行。例如,当改变CPU的配置,比如切换异常级别或修改MMU设置后,必须使用ISB来确保后续指令能看到这些更改后的状态。 另外,用户提供的参考引用中有提到DMB的应用场景,比如在inner里处理读写屏障。但ISB更多涉及指令流的同步,可能需要结合具体例子来说明。例如,在编写自修改代码或者进行某些安全操作时,修改了代码之后立即执行ISB,这样CPU会重新取指令,避免执行旧的指令。 需要注意的是,ISB会影响性能,因为它会清空流水线,所以应该只在必要时使用。在操作系统内核或底层驱动开发中,这种情况比较常见,比如上下文切换、修改页表、更新系统寄存器等操作后。 可能用户的问题还涉及到如何正确使用ISB指令,是否需要带参数。根据ARM文档,ISB可以带参数,比如ISB SY,指定同步的范围。SY表示全系统范围,确保所有后续指令都重新获取。 总结起来,ISB的作用是同步指令流,确保之前的上下文更改对所有后续指令生效,常见于系统配置更改后,保证指令执行的正确性。</think>### ISB指令同步屏障详解 #### 1. 基本定义 **ISB**(Instruction Synchronization Barrier)是ARM架构中的指令同步屏障,属于处理器级别的同步原语。其核心作用是通过清空处理器流水线,确保后续指令基于最新的**系统状态**重新从指令缓存或内存中加载执行[^2]。 #### 2. 作用机制 - **流水线清空**:强制处理器丢弃预取队列中的指令 - **上下文同步**:确保之前的所有**系统寄存器修改**(如CP15、MMU配置)对后续指令可见 - **指令重加载**:屏障后的指令会重新从指令缓存/内存中获取 #### 3. 典型使用场景 | 场景类型 | 具体案例 | 必要性说明 | |---------|----------|------------| | 系统配置变更 | MMU页表更新后<br>异常级别切换时 | 避免旧配置导致指令解码错误 | | 安全边界操作 | TrustZone环境切换 | 隔离不同安全域的指令流 | | 调试操作 | 设置硬件断点后 | 确保调试配置立即生效 | | 自修改代码 | JIT编译器生成新指令后 | 使新代码能够正确执行 | #### 4. 语法格式 ```assembly ISB {<option>} ``` 常用选项: `ISB SY`(全系统范围同步,默认选项) `ISB NSH`(非共享域同步) #### 5. 对比其他屏障指令 | 指令 | 作用范围 | 典型延迟周期 | |------|----------|--------------| | DMB | 数据内存访问顺序 | 3-5周期 | | DSB | 数据访问完成确认 | 5-10周期 | | ISB | 指令流同步 | 10+周期 | #### 6. 编程示例 ```c // 修改系统控制寄存器后必须使用ISB void enable_mmu(void) { __asm__ volatile( "mcr p15, 0, %0, c1, c0, 0" // 写入SCTLR寄存器 "isb" // 同步指令流 : : "r" (sctlr_val) ); } ``` #### 7. 注意事项 - 过度使用会导致**性能下降**(清空流水线损失约10-20个时钟周期) - 必须与`DSB`配合使用:先确保数据访问完成(DSB),再同步指令流(ISB) - 在**异常处理边界**自动插入隐式ISB
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

89er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值