RTOS(4)保存现场与恢复现场(结合汇编分析)

1.函数调用过程

1.在执行add_val()时,调用c函数的时候,第一个参数保存在R0里,第二个参数保存在R1里;所以,R0=&a,R1=&b,LR=下一条指令的地址(也就是165行);

2.将局部变量和返回地址压入栈中;

3.R2=a;将R2写入sp所指的位置,那么栈中原来存R3的位置变成了新的R2,也就是tmp这个临时变量;

4.R2=b=2;R3=tmp=1;R2=R2+R3=a+b=3;将R2写入sp所指的位置,tmp=3;

5.R2=tmp=3;a=R2;

6.将R3,LR弹出栈。LR赋值给PC,跳转到返回地址继续执行;

2.如何保护现场

a.什么叫做现场?

被打断瞬间,所有寄存器的值;

b.怎么保存?

存入栈中;

3.保存现场的多种情况

a保存现场;

|------------------------|
| 1.任务切换:所有寄存器都要保存 |
| 2.函数调用:R0,R1,R2传参的不保存; |
| 3.硬件中断:硬件保存了一部分+软件保存 |

b执行函数/处理中断;

c恢复现场;

相关推荐
飞鸟真人2 小时前
Redis面试常见问题详解
数据库·redis·面试
tianyue1002 小时前
STM32G431 ADC 多个channel 采集
stm32·单片机·嵌入式硬件
灵哎惹,凌沃敏3 小时前
FreeRTOS 任务上下文切换核心函数:xPortPendSVHandler详解
c语言·arm开发
C雨后彩虹3 小时前
计算误码率
java·数据结构·算法·华为·面试
比奇堡派星星4 小时前
Linux4.4使用AW9523
linux·开发语言·arm开发·驱动开发
Sailing4 小时前
AI 流式对话该怎么做?SSE、fetch、axios 一次讲清楚
前端·javascript·面试
比奇堡派星星5 小时前
cmdline使用详解
linux·arm开发·驱动开发
无限大65 小时前
为什么"缓存"能提高系统性能?——从 CPU 缓存到分布式缓存
后端·面试
安生生申5 小时前
STM32 ESP8266连接ONENET
c语言·stm32·单片机·嵌入式硬件·esp8266
一只小小Java8 小时前
Java面试场景高频题
java·开发语言·面试