0

Keil ARMCompiler 6.15 (armclang.exe) を使用していますが、生成されたアセンブラ コードの正確性に疑問があります。属性 'interrupt("IRQ")' が無視されているようです。私にとっては、r1 と r2 もスタックに保存する必要があります。「使用済み」属性を削除すると、完全な機能が削除されます(最適化)。

私が犯した過ちや忘れたことを誰かに見られますか?

もともとコードは gcc 用に作成されました。

割り込みルーチンに使用される属性:

#define INTERRUPT_PROCEDURE __attribute__((interrupt("IRQ"),used,section(".IsrSection")))
#define ISR_VARIABLE __attribute__((section(".IsrSection")))
#define FAST_SHARED_DATA __attribute__((section(".FastSharedDataSection")))

C++ コード:

uint64_t volatile FAST_SHARED_DATA systick_value = uint64_t(0);
extern "C" {
    void INTERRUPT_PROCEDURE SysTick_Handler()
    {
        systick_value++;
    }
}

アセンブラー コード:

0x08001280  push {r4, r6, r7, lr} 
0x08001282  add r7, sp, #8 
0x08001284  mov r4, sp 
0x08001286  bfc r4, #0, #3 
0x0800128a  mov sp, r4 
0x0800128c  movw r0, #8192  ; 0x2000 
0x08001290  movt r0, #8192  ; 0x2000 
0x08001294  ldrd r1, r2, [r0] 
0x08001298  adds r1, #1 
0x0800129a  adc.w r2, r2, #0 
0x0800129e  strd r1, r2, [r0] 
0x080012a2  sub.w r4, r7, #8 
0x080012a6  mov sp, r4 
0x080012a8  pop {r4, r6, r7, pc} 
0x080012aa  movs r0, r0 
0x080012ac  movs r0, r0 
0x080012ae  movs r0, r0 
4

1 に答える 1