首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >armclang是否将所有需要的寄存器都保存在具有属性(“IRQ”)的堆栈上?

armclang是否将所有需要的寄存器都保存在具有属性(“IRQ”)的堆栈上?
EN

Stack Overflow用户
提问于 2021-01-25 19:00:26
回答 1查看 42关注 0票数 0

我正在使用Keil ARMCompiler 6.15 (armclang.exe),我怀疑生成的汇编程序代码的正确性。在我看来,属性'interrupt("IRQ")‘被忽略了。对我来说,r1和r2也应该保存在堆栈中。当我删除属性'used‘时,我的完整函数也被删除(优化)。

有没有人能看到我犯的错误或者我忘记了什么?

这段代码最初是为gcc创建的。

用于中断例程的属性:

代码语言:javascript
复制
#define INTERRUPT_PROCEDURE __attribute__((interrupt("IRQ"),used,section(".IsrSection")))
#define ISR_VARIABLE __attribute__((section(".IsrSection")))
#define FAST_SHARED_DATA __attribute__((section(".FastSharedDataSection")))

C++代码:

代码语言:javascript
复制
uint64_t volatile FAST_SHARED_DATA systick_value = uint64_t(0);
extern "C" {
    void INTERRUPT_PROCEDURE SysTick_Handler()
    {
        systick_value++;
    }
}

汇编程序代码:

代码语言:javascript
复制
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 
EN

回答 1

Stack Overflow用户

发布于 2021-01-25 20:38:59

您不需要此属性。在极少数情况下,当硬件未将堆栈对齐到8字节(STKALGN位未设置),并且您将使用具有64位参数的函数(如uint64_t)时,需要使用它。进入ISR处理程序时,ARM会自动将R0-R3 +其他一些寄存器保存在堆栈中。如果你使用FPU,你可能还想启用FPU寄存器堆叠。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65883428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档