0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文看懂LR寄存器的知识

UtFs_Zlgmcu7890 来源:互联网 作者:佚名 2017-10-31 06:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

不知你在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,微信公众号:周立功单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解析Matlab如何实现移位寄存器

    本文主要介绍Matlab如何实现移位寄存器,首先介绍的是移位寄存器的原理及作用,其次介绍了m序列的生成原理及m序列的matlab 仿真实现,最后介绍了Matlab如何实现移位寄存器的代码。
    的头像 发表于 04-26 09:28 1.8w次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b>解析Matlab如何实现移位<b class='flag-5'>寄存器</b>

    ARM开发中几个常见的寄存器详解

    笔者今天来聊聊对于ARM几个特殊寄存器的理解,FP、SP和LR
    发表于 11-22 09:02 5505次阅读

    lr寄存器

    连接寄存器(Link Register, LR),在ARM体系结构中LR的特殊用途有两种:是用来保存子程序返回地址;二是当异常发生时,LR
    发表于 01-27 14:21

    寄存器与移位寄存器

    寄存器与移位寄存器 寄存器是用来寄存数码的逻辑部件,所以必须具备接收和寄存数码的功能。任何
    发表于 03-12 15:19 59次下载

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定义  寄存器是中央处理内的组成部分。寄存器是有限存贮容量
    发表于 03-08 14:26 2.2w次阅读

    数据寄存器,数据寄存器是什么意思

    数据寄存器,数据寄存器是什么意思 数据寄存器数据寄存器包括累加AX、基址寄存器BX、计数
    发表于 03-08 14:38 1.3w次阅读

    移位寄存器,移位寄存器是什么意思

    移位寄存器,移位寄存器是什么意思 移位寄存器_
    发表于 03-08 14:50 1.8w次阅读

    寄存器与移位寄存器

    寄存器与移位寄存器:介绍寄存器原理和移位寄存器的原理及实现。
    发表于 05-20 11:47 0次下载

    看懂暂存寄存器的区别

    本文开始介绍了暂存的定义和结构组成,其次介绍了暂存分类与寄存器定义,最后介绍了寄存器的原理。
    发表于 04-11 09:30 1.7w次阅读

    看懂8086CPU寄存器的特点和作用

    8086有14个16位寄存器,这14个寄存器按其用途可分为通用寄存器、指令指针、标志寄存器和段寄存器等4类。下面就来看看这四个
    发表于 04-16 11:36 1.1w次阅读
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>看懂</b>8086CPU<b class='flag-5'>寄存器</b>的特点和作用

    开发个Linux调试就必须要知道寄存器和内存!

    在我们正真的读取寄存器前,调试需要知道些关于x8664架构的相关知识。包括通用寄存器,专用寄存器
    发表于 05-14 17:28 1846次阅读

    工业机器人FANUC数据位置寄存器和位置寄存器的运用小知识分享

    工业机器人FANUC数据位置寄存器和位置寄存器的运用 寄存器指令 Registers① 寄存器指令R[i] i=1~200② 位置
    的头像 发表于 06-22 10:08 3.6w次阅读
    工业机器人FANUC数据位置<b class='flag-5'>寄存器</b>和位置<b class='flag-5'>寄存器</b>的运用小<b class='flag-5'>知识</b>分享

    了解MIPS的寄存器

    MIPS 有32个寄存器(0~31), 每个寄存器各有不同的用途。
    的头像 发表于 06-23 08:59 8482次阅读

    寄存器的基本知识

    几乎我们设计的每个模块都会有寄存器,而它们的寄存器或多或少能被CPU访问到。但CPU的接口通常只有组总线去访问这些模块,所以设计上都会把CPU和各个模块挂到总线上。这样CPU作为Master就能够访问到所有的模块了。
    的头像 发表于 07-26 13:52 1.2w次阅读

    寄存器分为基本寄存器和什么两种

    寄存器是计算机中用于存储数据的高速存储单元,它们是CPU内部的重要组成部分。寄存器可以分为基本寄存器和扩展寄存器两种类型。 、基本
    的头像 发表于 07-12 10:31 2706次阅读