STM32F 中断返回地址

问题描述 投票:0回答:1

我想知道STM32F中中断的返回地址,尤其是arm处理器。

在正常函数中,返回地址保存在Link Register中,但是在中断中,我发现Link Register的值为0xFFFFFF9。

所以我找到了参考号。 armv6的手册,但我还是不知道返回地址保存在哪里。

enter image description here enter image description here

我附上了参考文献的一部分。手册。

我猜想 ReturnAddress(ExceptionType);是保存返回地址的地方。

所以我检查了[SP, #24],但该值不是返回地址。

arm interrupt stm32f4discovery
1个回答
0
投票

一切都有记录,您所要做的就是尝试一下。

.thumb_func
.global _start
_start:
stacktop: 
.word 0x20001000
.word reset 
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word svcall
.word hang
.word hang
.word hang
.word hang


.thumb_func
.globl TEST
TEST:
    mov r0,#0
    mov r1,#1
    mov r2,#2
    mov r3,#3
    svc 0
    bx lr

void svcall ( void )
{
...
}

转储堆栈

来自arm文档

MemA[frameptr,4]     = R[0];
MemA[frameptr+0x4,4] = R[1];
MemA[frameptr+0x8,4] = R[2];
MemA[frameptr+0xC,4] = R[3];
MemA[frameptr+0x10,4] = R[12];
MemA[frameptr+0x14,4] = LR;
MemA[frameptr+0x18,4] = ReturnAddress();
MemA[frameptr+0x1C,4] = (xPSR<31:10>:frameptralign:xPSR<8:0>);

编译后的 svcall 有栈帧

080001e8 <svcall>:
 80001e8:   b570        push    {r4, r5, r6, lr}

覆盖堆栈的第一部分

00000003 
00000000 
00000000 
FFFFFFF9  lr

然后是逻辑使用的堆栈的异常部分。

00000000 r0
00000001 r1
00000002 r2
00000003 r3
00000000 r12
08000267 lr
0800005E return address
21000000 psr


08000054 <TEST>:
 8000054:   2000        movs    r0, #0
 8000056:   2101        movs    r1, #1
 8000058:   2202        movs    r2, #2
 800005a:   2303        movs    r3, #3
 800005c:   df00        svc 0
 800005e:   4770        bx  lr

这就是预期的返回地址。

不确定您为什么会关心退货地址是什么。请注意,这不是您要分支或返回的地址(如文档所述),当然,在本例中它是 800005f。但如果您想返回到该地址,您还必须手动恢复寄存器(r0,1,2,...)。

© www.soinside.com 2019 - 2024. All rights reserved.