Cortex-A5未对齐访问异常

时间:2014-04-08 13:37:34

标签: cortex-a

我对Cortex-A5未对齐访问异常有一些疑问

基本系统信息打击

  • 启用了I和D缓存。
  • 已停用MMU。
  • 固件库

在开发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不支持未对齐访问。 因此发生了数据异常。

但我还有一些问题

  1. 此驱动程序代码在Cortex-R4核心中运行良好。它没有任何问题。 可拆卸的代码是一样的。 这更令人困惑

  2. 许多linux驱动程序也使用上面的代码。 如果打开MMU,这可以解决这个问题吗?

  3. 让我知道我的目的是什么?

2 个答案:

答案 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位对齐。