硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1997|回复: 7
收起左侧

[其它] M3.M4中断ISR上下文保存疑问

[复制链接]

5

主题

14

回帖

29

积分

新手上路

积分
29
发表于 2022-2-16 14:01:08 | 显示全部楼层 |阅读模式
M3,M4 内核在发生中断的时候,硬件会自动入栈PSR、PC、LR、R12、R3-R0。那么剩下几个寄存器怎么处理呢?
我们写ISR的时候,不会去做另外几个寄存器的现场保存,所以ISR 整个过程中都不会用到剩余的寄存器?为什么?

image.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2022-2-16 14:32:37 | 显示全部楼层
如果你是用的C编译器,像MDK,IAR,GCC等,他们都帮你做了,你可以看下C编译生成的汇编代码。用到了额外的寄存器,代码里面会有PUSH入栈操作。

如果你是自己写汇编中断,如果用到了自动入栈以外的寄存器,需要你自己做push和pop管理。
回复

使用道具 举报

5

主题

14

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2022-2-16 14:58:10 | 显示全部楼层
eric2013 发表于 2022-2-16 14:32
如果你是用的C编译器,像MDK,IAR,GCC等,他们都帮你做了,你可以看下C编译生成的汇编代码。用到了额外的 ...

谢谢, 这就去看看汇编
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2022-2-16 15:59:11 | 显示全部楼层
看RTOS的port文件,一目了然。
代码不规范,亲人两行泪!
回复

使用道具 举报

5

主题

14

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2022-2-16 20:01:19 | 显示全部楼层
int test(int i)
{
                return ++i;
}
void USART1_IRQHandler(void)
{
       
        int a;
        a=2;
        a=a*a;
        USART_Cmd(USART1,ENABLE);
        test(a);

}

i.USART1_IRQHandler
    USART1_IRQHandler
        0x00000000:    b510        ..      PUSH     {r4,lr}
        0x00000002:    2402        .$      MOVS     r4,#2
        0x00000004:    4364        dC      MULS     r4,r4,r4
        0x00000006:    2101        .!      MOVS     r1,#1
        0x00000008:    4803        .H      LDR      r0,[pc,#12] ; [0x18] = 0x40013800
        0x0000000a:    f7fffffe    ....    BL       USART_Cmd
        0x0000000e:    4620         F      MOV      r0,r4
        0x00000010:    f7fffffe    ....    BL       test ; 0x0 Section #2
        0x00000014:    bd10        ..      POP      {r4,pc}
    $d
        0x00000016:    0000        ..      DCW    0
        0x00000018:    40013800    .8.@    DCD    1073821696

反汇编后 USART1_IRQHandler
如果使用到了PSR、PC、LR、R12、R3-R0之外的寄存器
MDK会自动PUSH
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2022-2-16 22:45:25 | 显示全部楼层
《ARM过程调用约定文档》 (Arm Architecture Procedure Call Standard, AAPCS) 里面定义了很多 ARM 体系结构软/硬件接口会涉及到的术语和概念,其中对 core registers 的功能、分配和ABI层面对行为做了很详细的定义,其中 {r0-r7} 在调用过程中分为低位寄存器和高位寄存器。
低位寄存器属于 caller-save registers,高位寄存器属于 callee-save registers。所以在函数调用发生/上下文切换时,都可以看到子过程跳转前的上下文会负责保存好 {r0-r3} 的上下文。
而高位寄存器作为 callee save context,其上下文状态需要由被调用的函数负责保存和恢复。
C编译器在编译单个函数的时候会根据函数内容进行寄存器分配,当被编译的函数需要使用高位寄存器 {r4-r7} 时,编译器会在函数的入口和出口自动插入对应的保存和恢复上下文的语句 (push/pop)。

Callee-save registers
Are registers that a called procedure must preserve. To preserve a callee-save register, the called procedure would normally either not use the register at all, or store the register to the stack during procedure entry and re-load it from the stack during procedure exit.
Caller-save registers
Are registers that a called procedure need not preserve. If the calling procedure requires their values to be preserved, it must store and reload them itself.
The first four registers r0-r3 (a1-a4) are used to pass argument values into a subroutine and to return a result value from a function. They may also be used to hold intermediate values within a routine (but, in general, only between subroutine calls).
A subroutine must preserve the contents of the registers r4-r8, r10, r11 and SP (and r9 in PCS variants that designate r9 as v6).


这类底层体系结构相关的问题,一般都可以通过查阅体系结构参考手册、调用约定手册和权威指南得到答案。
我自己经常查阅的资料,从指令集定义到架构实现到软件接口,层次逐渐提升,分别是:
1. IHI0042J, AAPCS
2. DDI0403E, v7m 体系结构参考手册
3. DDI0489F, cortex-m7 架构参考手册
4. DUI0553, cortex-m7 用户设计指南
5. Cortex-M4 权威指南

IHI0042J_2020Q2_aapcs32.pdf

615.62 KB, 下载次数: 9

DDI0403E_e_armv7m_arm.pdf

5.88 MB, 下载次数: 8

DDI0489F_cortex_m7_trm.pdf

1.19 MB, 下载次数: 8

DUI0553_cortex_m4_dgug.pdf

1.7 MB, 下载次数: 7

回复

使用道具 举报

5

主题

14

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2022-2-17 16:31:16 | 显示全部楼层
alexyzhov 发表于 2022-2-16 22:45
《ARM过程调用约定文档》 (Arm Architecture Procedure Call Standard, AAPCS) 里面定义了很多 ARM 体系结 ...

非常感谢
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2023-3-14 17:52:32 | 显示全部楼层
dengjingg 发表于 2022-2-16 20:01
int test(int i)
{
                return ++i;

LR寄存器不是自动入栈的吗?怎么又PUSH了一次。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 18:41 , Processed in 0.182506 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表