不知你在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函数。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
原文标题:神秘的LR寄存器
文章出处:【微信号:Zlgmcu7890,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。
相关推荐
笔者今天来聊聊对于ARM几个特殊寄存器的理解,FP、SP和LR。
发表于 11-22 09:02
•3058次阅读
连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR
发表于 01-27 14:21
程序状态的完整性。2)有MSP 和PSP(两者只需一个,不能同时使用,默认MSP)。MSP :主堆栈指针,系统用。PSP : 进程堆栈指针,个人堆栈指针。R14:LR连接寄存器功能:保...
发表于 12-16 06:44
AArch64 state的寄存器寄存器分为一般寄存器和特殊寄存器,另外一些
发表于 05-09 09:37
swi的功能号是如何来的?它和LR寄存器的值是何关系?如《ARM微控制器基础与实战》程序清单 6.13LDREQ R0,[LR,#-4] ;BICEQ R0,R0,0xff000000
发表于 11-30 14:32
swi 的功能号是如何来的 它和 LR 寄存器的值是何关系?如《ARM微控制器基础与实战》程序清单 6.13LDREQ R0,[LR,#-4] ;BICEQ R0,R0,0xff000
发表于 03-09 10:59
寄存器与移位寄存器
寄存器是用来寄存数码的逻辑部件,所以必须具备接收和寄存数码的功能。任何一种触发器都可以构成
发表于 03-12 15:19
•59次下载
寄存器,寄存器是什么意思
寄存器定义 寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用
发表于 03-08 14:26
•2.1w次阅读
数据寄存器,数据寄存器是什么意思
数据寄存器数据寄存器包括累加器AX、基址寄存器BX、计数寄存器
发表于 03-08 14:38
•1.2w次阅读
32位寄存器,32位寄存器是什么意思
从X8086开始学了一年,第一个ASM的程序就是变32换16进制的程序,不过现在叫我从新开始写ASM程
发表于 03-08 17:26
•1.7w次阅读
寄存器与移位寄存器:介绍寄存器原理和移位寄存器的原理及实现。
发表于 05-20 11:47
•0次下载
本文开始介绍了暂存器的定义和结构组成,其次介绍了暂存器分类与寄存器定义,最后介绍了寄存器的原理。
发表于 04-11 09:30
•1.5w次阅读
8086有14个16位寄存器,这14个寄存器按其用途可分为通用寄存器、指令指针、标志寄存器和段寄存器等4类。下面就来看看这四个
发表于 04-16 11:36
•9950次阅读
工业机器人FANUC数据位置寄存器和位置寄存器的运用
一、寄存器指令 Registers① 寄存器指令R[i] i=1~200② 位置寄存器
发表于 06-22 10:08
•3w次阅读
上拉寄存器上拉寄存器是控制对应端口上拉使能的。当对应位为0时,设置对应引脚上拉使能,对应位为1时,禁止对应引脚上拉使能。如果上拉寄存器使能,无论引脚功能寄存器如何设置(输入、输出、数据
发表于 01-14 14:31
•10次下载
评论