2016-08-11 48 views
0

大家好,我在同一個地方多次在皮層m1上發生HardFault異常。我有HardFault實施和我可以讀堆疊寄存器:ldrsh皮質m1硬性缺陷

stacked_r0 unsigned int類型爲0x4(十六進制)
stacked_r1 unsigned int類型0x60905f98(十六進制)
stacked_r2 unsigned int類型爲0x0(十六進制)
stacked_r3 unsigned int類型0x6092304b(十六進制)
stacked_r12無符號整型0x60922ff8(十六進制)
stacked_lr無符號整型0x60810be3(十六進制)
stacked_pc無符號整型0x60810ce2(十六進制)
stacked_psr無符號整型0x41000000(十六進制)

在堆疊PC上的操作是: 60810ce2:ldrsh r2,[r3,r2]

爲什麼會導致故障?

UPD 我已經重新排列變量,現在它已經墜毀在距離的memcpy FreeRTOS中碼

stacked_r0 unsigned int類型0x6090c858(十六進制)
stacked_r1 unsigned int類型0x6091f8b4(十六進制)
stacked_r2 unsigned int類型爲0x3C(稱爲十六進制)
stacked_r3無符號整型0x6091f8a4(十六進制)
stacked_r12無符號整型量0x280(十六進制) stacked_lr無符號整型0x60827f89(十六進制)
stacked_pc無符號整型0x6082b0dc(十六進制)
stacked_psr unsigned int 0x1000000(Hex)

6082b0ba:bne。Ñ0x6082b120

6082b0bc:添加R5,R2,#0

6082b0be:添加R4,R0,#0

6082b0c0:潛艇R5,#16

6082b0c2:LSR之間R5,R5, #4

6082b0c4:添加R5,#1

6082b0c6:LSLS R5,R5,#4

6082b0c8:添加R1,R1,R5

6082b0ca:LDR R6,[R 3,#0]

6082b0cc:STR R6,[R4,#0]

6082b0ce:LDR R6,[R3 ,#4]

6082b0d0:STR R6,[R4,#4]

6082b0d2:LDR R6,[R 3,#8]

6082b0d4:STR R6,[R4,#8]

6082b0d6:LDR R6,[R 3,#12]

6082b0d8:添加R3,#16

6082b0da:STR R6,[R4,#12]

6082b0dc:添加R4,# 16

+0

是一個對齊訪問。 –

+0

沒關係,但是爲什麼?在堆棧 – qmor

+0

棧R3點是RAM,什麼棧都與它的低位爲0XB或1011 LDRSH或LDRH低位已成爲LDR零,較低的兩個必須是LDRD較低的零三個必須是零。你正試圖做一個未對齊的半字訪問,並且處理器正確地阻止了你這樣做。 –

回答

1
使用編譯器生成對準

簡單實例LDRSH:

short more_fun (short); 
short fun (short a) 
{ 
    unsigned int ra; 
    short x[16]; 
    for(ra=0;ra<16;ra++) 
    { 
     a+=more_fun(x[ra]); 
    } 
    return(a); 
} 

臂-NONE-EABI-GCC -mthumb -O2 -c so.c -o so.o -march = ARMv6的米 臂-NONE-EABI-objdump的-D so.o

00000000 <fun>: 
    0: b570  push {r4, r5, r6, lr} 
    2: b088  sub sp, #32 
    4: 0004  movs r4, r0 
    6: 466d  mov r5, sp 
    8: ae08  add r6, sp, #32 
    a: 2300  movs r3, #0 
    c: 5ee8  ldrsh r0, [r5, r3] 
    e: f7ff fffe bl 0 <more_fun> 
    12: 3502  adds r5, #2 
    14: 1904  adds r4, r0, r4 
    16: b224  sxth r4, r4 
    18: 42b5  cmp r5, r6 
    1a: d1f6  bne.n a <fun+0xa> 
    1c: 0020  movs r0, r4 
    1e: b008  add sp, #32 
    20: bd70  pop {r4, r5, r6, pc} 
    22: 46c0  nop   ; (mov r8, r8) 

堆棧剩餘對齊時,堆棧操作,推,彈出和堆棧幀是8個字節(2個字)的所有倍數。

陣列是在堆棧上和他們使用R5基本上爲索引到陣列,貌似LDRSH需要兩個寄存器,以便它們設置r3至零,這樣他們可以具有一個第二寄存器。這裏的關鍵是他們開始排列,SP的地址已至少低三位零假設這個代碼之外每個人都符合該公約。然後代碼添加2〜R 5各自一次循環,保持指針半字邊界上對齊的陣列,較低位爲地址爲每次使用LDRSH的保持爲零。沒有對齊問題。

請提供類似〔實施例,可能的代碼片段,但可以肯定的左右對齊LDRSH相關片段。