我正在使用Keil ARMCompiler 6.15 (armclang.exe),我怀疑生成的汇编程序代码的正确性。在我看来,属性'interrupt("IRQ")‘被忽略了。对我来说,r1和r2也应该保存在堆栈中。当我删除属性'used‘时,我的完整函数也被删除(优化)。
有没有人能看到我犯的错误或者我忘记了什么?
这段代码最初是为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 发布于 2021-01-25 20:38:59
您不需要此属性。在极少数情况下,当硬件未将堆栈对齐到8字节(STKALGN位未设置),并且您将使用具有64位参数的函数(如uint64_t)时,需要使用它。进入ISR处理程序时,ARM会自动将R0-R3 +其他一些寄存器保存在堆栈中。如果你使用FPU,你可能还想启用FPU寄存器堆叠。
https://stackoverflow.com/questions/65883428
复制相似问题