嵌入式学习笔记 -函数嵌套时以及异常响应时,LR使用的具体过程

函数嵌套时以及异常响应时,寄存器LR的作用存在显著区别,理解这个问题对于理解freeRTOS底层代码的实现大有帮助,具体使用过程如下:

一 函数嵌套时的LR使用的具体过程

在ARM架构(特别是M0处理器)中,函数嵌套调用时LR(Link Register)寄存器的处理过程如下:

1 基本调用机制

当使用BL指令调用函数时,处理器在进行跳转之前,会将当前函数的下一条地址,即(PC+4)的地址,存入LR寄存器,

被调函数执行完毕函数返回时,通过MOV pc,lr 指令加载LR寄存器的值到PC寄存器,实现函数返回。

2 函数嵌套时的处理过程

每次BL调用时LR都会被新的返回值覆盖,

内层函数调用前需要对原LR值进行保存,通常压栈。以下是一个具体示例:

main:
    BL outer_func
    B .

outer_func:
    PUSH {LR}       ; 保存返回地址
    BL inner_func
    POP {LR}        ; 恢复LR
    BX LR

inner_func:
    ; 函数体
    BX LR

从以上红色字体可以看出,最后一层函数在返回时,是先执行BX lr指令返回,然后再执行出栈操作恢复包括上一层函数返回地址寄存器LR在内的所有栈内容。

二 异常发生时,LR的使用机制

以FreeRTOS操作系统为例,LR工作在异常返回机制状态下:

‌1. LR寄存器(R14)的作用

  • ARM Cortex-M架构中,LR寄存器在触发异常(如SVC)时会被自动设置为特殊的EXC_RETURN值。该值包含两部分信息:
    • ‌异常返回模式‌:标识返回后使用MSP(主栈指针)还是PSP(进程栈指针);
    • ‌栈帧类型‌:指示硬件需要恢复的寄存器集合。
  • 在FreeRTOS任务切换场景中,EXC_RETURN通常设置为使用PSP,并触发硬件自动从任务栈恢复上下文。

2. BX R14的执行逻辑

中断返回时,BX R14的执行逻辑,通常不是直接将LR寄存器的值赋值给PC寄存器,而是通过EXC_RETURN触发异常返回流程,此时处理器会:

  1. 根据EXC_RETURN确定使用PSP作为栈指针;
  2. 从PSP指向的任务栈中弹出保存的寄存器(包括R0-R3、R12、LR、PC、xPSR);
  3. 将PC设置为任务入口地址(即任务函数指针)。

以下为freeRTOS代码示例:

SVC异常:

PendSV异常:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java String函数的使用

文章目录 String字符串比较字符串查找转化字符串替换字符串拆分字符串截取(常用)字符串的不可变性 String str本来是字符串常量的引用,应该打印地址,但是编译器重写了toString方法,所以打印hello String 的构造方法 …

Oracle 11G RAC重启系统异常

vmware安装centos7环境部署Oracle RAC (11.2.0.4) 部署时所有资源情况都是正常的,关机重启虚拟机后集群资源状态异常,请教CSDN大佬 – 部署规划 域名地址备注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…

吉林省CCPC与全国邀请赛(东北地区赛)游记

总述: 本次赛段共获得一银(吉林省赛)、一铜(东北地区赛)、一铁(全国邀请赛的成绩)。总体成绩跟校内赛的情况相比队伍状态与发挥水准都有提升),但也体现出很多不足&#x…

「Python教案」循环语句的使用

课程目标 1.知识目标 能使用for循环和while循环设计程序。能使用循环控制语句,break、continue、else设计程序。能使用循环实际问题。 2.能力目标 能根据需求合适的选择循环结构。能对嵌套循环代码进行调试和优化。能利用循环语句设计&am…

OpenCV---findCountours

一、基本概念与用途 findContours是OpenCV中用于在二值图像中查找轮廓的核心函数。轮廓作为连续的点集,能够精确勾勒出物体的边界,广泛应用于目标检测、形状分析、图像分割等领域。 函数核心价值 目标检测:通过轮廓定位图像中的物体&#…

20250523-BUG:无法加载“GameLib/Framework.h“头文件(已解决)

BUG:无法加载"GameLib/Framework.h"头文件(已解决) 最近在打开新的C项目时报了这个错,我是按照以下步骤来排除的BUG,希望对您有所帮助~ 检查【C/C】-【附加包含目录】中的路径有无问题,一般需要加…

商品条形码查询接口如何用C#进行调用?

一、什么是商品条码查询接口? 1974年6月26日,美国俄亥俄州的一家超市首次使用商品条码完成结算,标志着商品条码正式进入商业应用领域。这项技术通过自动识别和数据采集,极大提升了零售行业的作业效率,减少了人工录入错…

SD07_NVM的安装及相关操作

以下是在 Windows 系统 上使用 NVM(Node Version Manager) 管理多个 Node.js 版本的详细步骤,从零开始操作: 一、准备工作 卸载旧版 Node.js 打开 控制面板 → 程序和功能,找到已安装的 Node.js 和 npm,彻底…

OSI 深度安全防御体系架构深度剖析

文章目录 前言什么是 OSI 深度安全防御体系架构各层的安全防御措施物理层数据链路层网络层传输层会话层表示层应用层 OSI 深度安全防御体系架构的优势全方位防护深度防御灵活性和可扩展性 总结 前言 大家好,我是沛哥儿。今天咱们来深入探讨一下 OSI 深度安全防御体…

大模型应用:开发移动端页面个人中心页面提示词

角色 你是一个移动端web页面开发专家,擅长开发移动端页面,使用原生web技术(html,css,js),开发的页面针对手机移动端友好 技术栈 使用基础的Html,CSS,JavaScript方案实现&#xff…

从零到一:影刀RPA学习者的破局之路

1. 学习目标与预期差距分析 1.1 官方课程学习目标梳理 影刀RPA的官方课程旨在帮助学习者掌握RPA(机器人流程自动化)的基本概念、操作技能和常见应用场景。课程内容通常包括: RPA基础理论:介绍RPA的定义、优势、发展历程以及与其…

计算机组成与体系结构:硬盘驱动器(Hard Disk Drives)

目录 💽 硬盘驱动器(HDD):传统的固定辅助存储设备 什么是硬盘驱动器? 硬盘的工作原理 HDD 的物理结构 Disk Pack(盘组) Tracks(磁道) Cylinders(柱面&…

GitCode镜像仓库批量下载开发实录

GitCode作为国内领先的开源代码托管平台,其镜像仓库批量下载功能对开发者生态建设与开源协作效率提升具有关键价值。本文基于企业级代码资产管理需求,系统记录从需求分析到生产部署的全周期开发实践。内容覆盖镜像仓库同步机制设计、分布式任务调度优化、…

基线配置管理:为什么它对网络稳定性至关重要

什么是基线配置(Baseline Configuration) 基线配置(Baseline Configuration)是经过批准的标准化主设置,代表所有设备应遵循的安全、合规且运行稳定的配置基准,可作为评估变更、偏差或未授权修改的参考基准…

AJAX get请求如何提交数据呢?

在 AJAX 中使用 GET 请求提交数据,主要通过 在 URL 后拼接查询参数 的方式实现,具体步骤如下: 1.构造带参数的 URL 将数据以 键值 的形式拼接在 URL 后,多个参数间用 & 连接。例如: var url "https://exa…

基于FashionMnist数据集的自监督学习(对比式自监督学习SimCLR算法)

目录 一,对比式自监督学习 1.1 简介 1.2 常见算法 1.2.1 SimCLR (2020) 1.2.2 MoCo (2020) 1.2.3 BYOL (2021) 1.2.4 SimSiam (2021) 1.2.5 CLIP (2021) 1.2.6 DINO (2021) 1.2.7 SwAV (2020) 二,代码逻辑分析 2.1 整体目标与流程 2.2 数据…

Linux:基础指令与内涵理解(下)与权限

1.mv 作用:将文件移动、文件重命名 语法: mv (选项) 源文件/目录 目标文件/目录 (1)将文件/目录移动到当前目录的新文件/目录(也就是重命名操作) 这里我们mv了test.txt文件到当前目录下当前并不存在的ln.tx…

卷积神经网络(CNN)入门学习笔记

什么是 CNN? CNN,全称 卷积神经网络(Convolutional Neural Network),是一种专门用来处理图片、语音、文本等结构化数据的神经网络。 它模仿人眼识别图像的方式: 从局部到整体,一步步提取特征&a…

c#基础07(调试与异常捕捉)

文章目录 调试与异常捕捉调试异常处理C#中的异常类异常处理抛出对象 调试与异常捕捉 很多时间,写代码不能一撸到底,中间都是经历过无数次的调试,才能正常正确的运行起来。.Net调试有很多方法和技巧。 调试 在C#中程序调试主要指在Visual S…

一种比较精简的协议

链接地址为:ctLink: 一个比较精简的支持C/C的嵌入式通信的中间协议。 本文采用的协议格式如下 *帧头 uint8_t 起始字节:0XAF\ *协议版本 uint8_t 使用的协议版本号:当前为0X01\ *负载长度 uint8_t 数据段内容长…