文章目录
- 什么是现场?
- 保存现场的数据存放在哪里?
- 保护现场的场景
什么是现场?
在[FreeRTOS 基础知识] 栈 与 汇编语言文章中解析了fun_c汇编函数,假设在执行fun_c函数的过程中产生高优先级的中断。如下图所示。
此时刚从RAM的SP栈中获取到值保存到R0,发生中断。此时需要保存R0的值,这样当中断处理函数执行完之后回到此函数还知道R0的值是多少。这就是保存环境。
通过RAM架构可知,在SOC上有R0~R15寄存器。汇编语言中可以看出,CPU当前所运行的环境就是这些寄存器构成的。当CPU发生中断、跳转、任务切换的时候,只要将这些寄存器的值保存下来。等到CPU要继续执行这函数或者任务前,将这些保存的寄存器还原。 就能继续执行该函数或任务。这就是保存/恢复现场。
保存现场的数据存放在哪里?
保护现场的场景
1、中断,在硬件中断发生的时候,需保存现场,处理中断,恢复现场。
F103 硬件中断触发时,保存现场分为两部分:
1、硬件保存寄存器R0/R1/R2,保存在栈中;
2、软件保存一些用到的寄存器
2、函数调用,在跳转函数的时候,需保存现场,执行函数,恢复现场。
调用函数时有规定,假如a_fun调用b_fun函数传参为r0/r1/r2,因此子函数r0/r1/r2这三个寄存器在保存现场的时候不做保存。
3、任务切换,系统调度时,需要保存现场,切换任务执行,恢复现场。
在保存现场时,其他任务并不知道使用了哪些寄存器,因此保存所有的寄存器R0~R15。