不知你在DEBUG程序,又或者阅读操作系统源码时候有没细心观察,从一个普通子函数返回与异常(中断)返回的汇编指令都是BX LR,但是这两者的意义是一样的吗?这篇文章就来揭开LR寄存器的神秘面纱。
当单片机涉及函数跳转或者任务调度的时候,理解MCU如何处理堆栈与改变各个通用寄存器的状态尤为重要,下面就来比较一下在不同情况下LR寄存器的意义。
上图是一个简单的例子,当仿真点击“下一步”的时候,MCU就会执行BX LR指令,并且从aa子函数返回到main函数中,可以看到在普通子函数里执行BX LR的意义是“跳转到LR寄存器里的地址执行”。
对比一下一段ucos的源码,如果对M3内核有所了解的小伙伴一定知道堆栈为什么是这样定义的,那么这时候我们发现OS_TaskReturn是作为一个错误返回函数,并且赋值到堆栈中R14(LR)相应的位置。
任务调度函数会将PSP堆栈指针指向我们定义自定义的堆栈,然后最后一句汇编是BX LR,那么按照普通子函数执行BX LR的意义,这个时候MCU是会运行OS_TaskReturn这个函数吗?这样不就进入错误函数了吗?
其实不然,因为用M系列实现ucos的任务调度是在PendSV异常(中断)里面实现的,而在异常(中断)里的LR寄存器不再是普通函数里面“返回地址”的意义,而是一个定义为一个称作exc-return的值,当执行BX LR时候,这个值决定了MCU退出异常(中断)之后的运行等级是在特权级还是用户级以及用的堆栈是MSP还是PSP,而MCU即将要执行的是从PSP堆栈中POP出来的p_task函数,而不是OS_TaskReturn函数。
是不是觉得很有趣,蠢蠢欲动,迫不及待想上手体验一下呢?考虑到广大群众的焦虑,我司提供 LPC824仿真套餐服务,不用998,也不用99,只要49,你还在想什么呢?赶紧复制下面的淘口令打开淘宝上车吧
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
相关推荐
电子发烧友网站提供《用智能DAC揭开医疗报警设计的神秘面纱.pdf》资料免费下载
发表于 09-14 10:50
•0次下载
在计算机科学中,寄存器(Register)是一种高速存储单元,它位于CPU内部,与CPU的运算单元和逻辑控制单元紧密相连。寄存器的主要作用是暂时存储指令、操作数和地址等临时数据,以便CPU快速访问和处理。由于
发表于 09-05 14:11
•952次阅读
在计算机科学中,寄存器(Register)是一个高速存储单元,它位于中央处理器(CPU)内部,用于存储计算机程序执行过程中所需要的数据、指令地址或状态信息。寄存器是计算机体系结构中至关
发表于 08-02 18:23
•3084次阅读
,这些时间信息又是从哪里来的呢?为什么我们可以随时随地都能获取准确的时间信息?这得益于高精度的 授时服务 ,今天我们就来揭开“授时”的神秘面纱。 大家都知道我国的北斗导航卫星,是用于定位导航的。那么北斗是怎么进行定位导
发表于 07-25 16:21
•331次阅读
。 一、寄存器寻址 寄存器寻址的定义 寄存器寻址是一种将操作数直接存储在CPU内部寄存器中的寻址
发表于 07-12 10:42
•1203次阅读
在计算机体系结构中,寄存器寻址是一种常见的寻址方式,它允许程序直接访问CPU内部的寄存器。寄存器寻址可以提高程序的执行效率,因为它避免了对内存的访问。
发表于 07-12 10:36
•527次阅读
寄存器是计算机中用于存储数据的高速存储单元,它们是CPU内部的重要组成部分。寄存器可以分为基本寄存器和扩展寄存器两种类型。 一、基本
发表于 07-12 10:31
•1050次阅读
在科技界的浩瀚星空中,埃隆·马斯克的每一次发声都如同璀璨的新星,瞬间照亮前行的道路。近日,这位科技巨擘在推特上的一则简短宣告,再次将全球的目光聚焦于人工智能的前沿阵地——他的初创公司xAI即将在八月揭开其最新力作Grok-2大语
发表于 07-02 11:38
•443次阅读
创新成果具有挽救生命、改变生活和创造梦想的能力。现在让我们一起紧随Pluto产品发布会的步伐,揭开PlutoXZU20的神秘面纱,与我们一起
发表于 06-21 08:09
•314次阅读
内核寄存器与外设寄存器: 内核寄存器与外设寄存器是完全不同的概念。内核寄存器是指 CPU 内部的寄存器
发表于 04-17 11:47
•2802次阅读
UFP芯片是一种用于USB快充技术的关键元件,它在移动设备和充电器之间进行通信和协调,以实现高效、安全、快速的充电过程。下面我们将揭开快充芯片的神秘面纱,深入探讨UFP快充芯片的工作原
发表于 04-15 12:51
•547次阅读
无论是FPGA还是ASIC,系统设计中总会存在配置寄存器总线的使用,我们会将各种功能、调试寄存器挂载在寄存器总线上使用。
发表于 03-04 13:56
•1037次阅读
CPU寄存器是中央处理器内的组成部分,是有限存贮容量的高速存贮部件。寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制
发表于 02-03 15:15
•3785次阅读
移位寄存器是一种用于在数字电路中实现数据移位操作的基本电路元件。它由多个触发器以及相关控制电路组成,具有存储、接受和移动数据的功能。移位寄存器可以分为两种类型:串行移位
发表于 01-18 10:52
•7041次阅读
16进制位关系,但是对寄存器数值的每一位并没有很直观的展示。因此就需要一个软件直观的查看寄存器值与位的关系。
发表于 11-28 12:26
•1811次阅读
评论