一文看懂LR寄存器的知识.doc
《一文看懂LR寄存器的知识.doc》由会员分享,可在线阅读,更多相关《一文看懂LR寄存器的知识.doc(1页珍藏版)》请在三一文库上搜索。
1、一文看懂LR寄存器的知识不知你在DEBUG程序,又或者阅读操作系统源码时候有没细心观察,从一个普通子函数返回与异常(中断)返回的汇编指令都是BX LR,但是这两者的意义是一样的吗?这篇文章就来揭开LR寄存器的神秘面纱。当单片机涉及函数跳转或者任务调度的时候,理解MCU如何处理堆栈与改变各个通用寄存器的状态尤为重要,下面就来比较一下在不同情况下LR寄存器的意义。上图是一个简单的例子,当仿真点击“下一步”的时候,MCU就会执行BX LR指令,并且从aa子函数返回到main函数中,可以看到在普通子函数里执行BX LR的意义是“跳转到LR寄存器里的地址执行”。对比一下一段ucos的源码,如果对M3内核
2、有所了解的小伙伴一定知道堆栈为什么是这样定义的,那么这时候我们发现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函数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 看懂 LR 寄存器 知识
链接地址:https://www.31doc.com/p-3362580.html