2014-04-08 46 views
0

我有用於Cortex-A5對齊訪問例外中的某些問題的Cortex-A5對齊訪問異常

基本系統信息吹

  • 我和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; 
} 

Dissamber上面的代碼來檢查它們如下

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不支持未對齊訪問?

In DDI0406C_b_arm_architecture_reference_manual.pdf(表A3-1加載/存儲指令的對齊要求) LDM,STR不支持未對齊訪問。 因此發生數據異常。

但我仍然有一些問題

  1. 此驅動程序代碼中的Cortex-R4核心工作良好。它沒有任何問題。 拆解代碼是相同的。 這更令人困惑

  2. 許多linux驅動程序也使用上面的代碼。 如果MMU已打開,哪個可以解決這個問題?

讓我知道什麼是我的工作?

+0

你能顯示一些成功完成此操作的linux驅動程序代碼嗎? –

回答

0

正如我所看到的,如果buf是32位對齊的,則無法執行所嘗試的操作。

編譯器不知道如何對齊buf,所以它假定你知道你在做什麼。如果您要求32位寫入(通過執行諸如*((UINT32 *)&buf[2])之類的操作),那麼編譯器會認爲這是一件有效的事情。因此它會生成一個STR指令,該指令僅對對齊的存儲區有效。因此,故障 - 如buf是32位對齊(如您所述),buf[2]顯然不是。

我不知道爲什麼Cortex-R4的體驗應該是不同的,據我所知它可以用與A5相同的指令集和對齊規則進行操作(但我可能是錯的)。也許你很幸運,你的buf s是未對齊的,使得buf[2] 32位對齊。

1

您需要啓用MMU才能在cortex A5中進行未對齊的訪問。還要確保SCTLR寄存器中的位域「A」被設置爲0,以確保禁用嚴格的對齊錯誤