文章目录
- 怎么控制STM32跳转到指定程序:
- STM32的LR寄存器和PC寄存器:
- 结语:
怎么控制STM32跳转到指定程序:
首先,使用标号加goto语句可以使程序强制跳转,而goto的原理实际上是汇编语言里面的强制跳转。
我们看STM32的启动文件,发现里面有这两句程序:
其中LDR R0 ,=一个函数名
意思是把这个函数的地址放到寄存器R0里面
BLX R0和BX R0意思都是跳转到以R0寄存器所存的地址
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3MDO5MTOxUTMxEjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
STM32的LR寄存器和PC寄存器:
PC寄存器是程序计数器,内部存的是程序当前执行到了哪个地址。LR寄存器是连接寄存器,在执行子函数前,LR会保存执行完子函数后,应该回到哪个地方。验证如下:
我们在主函数执行里面打一个断点,当程序执行到端点处时,我们发现端点处的PC指针是0X080002A2,
那么在执行函数raw_os_init()前,LR寄存器会记住执行完raw_os_init()函数后,PC指针应该跳转到哪个地址。我们再在raw_os_init()函数里面打断点,看执行子函数raw_os_init()时LR是不是存的是执行完子函数后应该返回的地址。
在执行子函数raw_os_init()时,我们发现LR里面存的是0X080002A3,比我们在temppp += 1;断点处看到的PC指针大了1。这是为什么呢?
这是因为我们在temppp += 1;打断点时,是还没执行temppp += 1;语句的PC指针地址,则执行temppp += 1;时PC指针值应该是0X080002A2 + 1=0X080002A3,刚好和LR寄存器中存的值一样。
结语:
LR存是:执行子函数后,PC指针应该跳转回去是,应该跳转的地方