You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派4B使用__sync_add_and_fetch触发sError中断,如何启用独占内存事务?

问题

在树莓派4B上,使用gcc的__sync_add_and_fetch对整数做原子递增操作时,生成了如下汇编代码:

172e4:       c85f7e60        ldxr    x0, [x19]
172e8:       91000400        add     x0, x0, #0x1
172ec:       c801fe60        stlxr   w1, x0, [x19]
172f0:       35ffffa1        cbnz    w1, 172e4 <kernel_start+0xc4>
172f4:       d5033bbf        dmb     ish

已启用MMU,内存配置为MAIR属性0xff的普通内存,页表映射设为内部和外部可共享。可以非独占方式读写该内存,但运行上述代码时,ldxr指令触发sError中断(类别0x2f),ISS为0x2,根据《Exception Syndrome Register, EL1》文档,这是外部访问时的SLVERR。

根据《Arm Cortex®-M7 Processor》文档,该情况的触发原因:

系统中无法处理独占事务的AXI从设备,在响应独占读时返回OKAY。这也会被视为外部错误,处理器会将其当作SLVERR响应处理。

请问是否需要执行特定操作来启用独占内存事务?

回答

  • 无需额外启用独占事务,但要确认内存区域的支持性
    树莓派4B的BCM2711内存控制器原生支持DDR区域的独占事务,但如果你的内存映射指向片上外设或非DDR区域,这类区域通常不支持独占访问,会触发SLVERR。先确认页表映射的物理地址属于DDR范围。
  • 修正页表共享属性
    你提到的"内部和外部可共享"可能对应了错误的SH字段值。独占事务需要页表描述符的SH位设为0b11(Outer Shareable),而非Inner Shareable。错误的共享属性会导致内存控制器无法正确处理独占读事务,返回SLVERR。
  • 验证MAIR内存类型
    MAIR 0xff对应Normal WB RA WA内存,这是支持独占事务的,但要确保内存类型不是Device Memory——Device类型内存完全不支持独占操作,若误配会直接触发错误。
  • 检查系统寄存器配置
    确认SCTLR_EL1的字节序设置与内存访问一致,同时ACTLR_EL1未禁用缓存或独占事务相关功能(树莓派4B默认初始化一般没问题,但自定义内核需核对)。
  • 硬件排查(最后选项)
    若软件配置全正确仍报错,再考虑硬件层面问题(如DDR故障),但此情况概率极低。

内容的提问来源于stack exchange,提问作者freewill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:19