当前位置: 首页 > news >正文

[FreeRTOS 基础知识] 保存现场与恢复现场

文章目录

    • 什么是现场?
    • 保存现场的数据存放在哪里?
    • 保护现场的场景


什么是现场?

在[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。

相关文章:

  • day28回溯算法part04| 93.复原IP地址 78.子集 90.子集II
  • 企业应如何选择安全合规的内外网文件摆渡系统?
  • Java Agent的使用与实现
  • Nginx 精解:正则表达式、location 匹配与 rewrite 重写
  • 基于可解释性深度学习的马铃薯叶病害检测
  • ⑤单细胞学习-cellchat组间通讯差异分析
  • 用Pip配置Pytorch环境 (Pytorch==2.3.0)
  • Java数组的定义 ,基本概念与使用
  • Helm离线部署Rancher2.7.10
  • 解决windows11开机xbox自启动
  • 十二、【源码】配置注解执行SQL
  • 10秒钟docker 安装Acunetix
  • 43【PS 作图】颜色速途
  • 一篇文章搞定Java数组初始化,从此告别迷惑
  • 【Python核心数据结构探秘】:元组与字典的完美协奏曲
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 2017-08-04 前端日报
  • Apache Zeppelin在Apache Trafodion上的可视化
  • docker容器内的网络抓包
  • Electron入门介绍
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • js ES6 求数组的交集,并集,还有差集
  • SpringBoot 实战 (三) | 配置文件详解
  • 阿里云前端周刊 - 第 26 期
  • 分布式事物理论与实践
  • 如何设计一个比特币钱包服务
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用 Docker 部署 Spring Boot项目
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 消息队列系列二(IOT中消息队列的应用)
  • 用Canvas画一棵二叉树
  • 转载:[译] 内容加速黑科技趣谈
  • ​渐进式Web应用PWA的未来
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #mysql 8.0 踩坑日记
  • $.proxy和$.extend
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (¥1011)-(一千零一拾一元整)输出
  • (2015)JS ES6 必知的十个 特性
  • (八十八)VFL语言初步 - 实现布局
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (力扣题库)跳跃游戏II(c++)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (算法)区间调度问题
  • (五)关系数据库标准语言SQL
  • (译)2019年前端性能优化清单 — 下篇
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ****Linux下Mysql的安装和配置
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 4.0中的泛型协变和反变
  • .Net core 6.0 升8.0
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型