我对Cortex-A5未对齐访问异常有一些疑问
基本系统信息打击
在开发DMA驱动程序代码时,我编写了以下C代码。
UINT32 DMA_InstMOV(UINT8 *buf, tENC_RD rd, UINT32 val)
{
buf[0] = CMD_DMAMOV;
buf[1] = rd;
*((UINT32 *)&buf[2]) = val; // this line is exception occur
return SIZE_DMAMOV;
}
解析上面的代码以检查它们如下
DMA_InstMOV
0x00000bf8: e1a03000 .0.. MOV r3,r0
0x00000bfc: e3a000bc .... MOV r0,#0xbc
0x00000c00: e5c30000 .... STRB r0,[r3,#0]
0x00000c04: e5c31001 .... STRB r1,[r3,#1]
0x00000c08: e5832002 . .. STR r2,[r3,#2]
0x00000c0c: e3a00006 .... MOV r0,#6
0x00000c10: e12fff1e ../. BX lr
R3值为0x08040000 使用未对齐地址执行STR指令异常(数据中止)发生。 Cortex A5不支持未对齐访问?
在DDI0406C_b_arm_architecture_reference_manual.pdf中(表A3-1加载/存储指令的对齐要求) LDM,STR不支持未对齐访问。 因此发生了数据异常。
但我还有一些问题
此驱动程序代码在Cortex-R4核心中运行良好。它没有任何问题。 可拆卸的代码是一样的。 这更令人困惑
许多linux驱动程序也使用上面的代码。 如果打开MMU,这可以解决这个问题吗?
让我知道我的目的是什么?
答案 0 :(得分:1)
您需要启用MMU才能在cortex A5中进行未对齐访问。还要确保SCTLR寄存器中的位域“A”设置为0,以确保禁用严格对齐故障
答案 1 :(得分:0)
正如我所看到的,如果buf
是32位对齐的话,你无法做你想做的事。
编译器不知道buf
是如何对齐的,因此它假定您知道自己在做什么。如果您要求进行32位写入(通过执行类似*((UINT32 *)&buf[2])
的操作),则编译器会认为这是一个有效的操作。因此,它生成STR
指令,该指令仅对齐对齐的商店。因此,错误 - 因为buf
是32位对齐的(正如您所说),buf[2]
显然不是。
我不知道为什么Cortex-R4体验会有所不同,据我所知,它使用与A5相同的指令集和对齐规则进行操作(但我可能错了)。也许你很幸运,你的buf
未对齐,buf[2]
32位对齐。