与你一起揭开LR寄存器的神秘面纱

不知你在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,你还在想什么呢?赶紧复制下面的淘口令打开淘宝上车吧

OpenMV初识
OPPO加快5G产品的迭代节奏,助力5G行业快速发展
详细分析SLAM的实现和应用
Molex:75年打下坚实基础 续写下一个辉煌
简单软件实现1-Wire温度器件的硬件CRC校验和串行码流的
与你一起揭开LR寄存器的神秘面纱
云存储的架构及系统组成
纯净音质天籁之声 华为nova 2系列让你的旅途与众不同
从铁塔模式说起5g接入共建共享
直线电机生产厂家谈“彩虹码头”的黑科技
NVIDIA 首席科学家 Bill Dally 将在 Hot Chips 大会发表主题演讲
jtag接口是什么_jtag接口定义
长三角人工智能企业路演暨产业合作研讨会在上海举办
韩国或为中低频5G信号增添470MHz频宽
计数器
红外额温计使用方法_红外额温计使用注意事项
诺基亚五摄新机推迟亮相,有可能会在MWC2019上正式亮相
做好防雷检测的意义和作用
2021亚太机器人世界杯天津国际邀请赛圆满落幕
画画、写字、下围棋、组乐队样样在行 关于ABB机器人你了解多少呢