天天看点

Cortex-M3/M4内核STM32的LR寄存器和PC寄存器怎么控制STM32跳转到指定程序:STM32的LR寄存器和PC寄存器:结语:

文章目录

  • 怎么控制STM32跳转到指定程序:
  • STM32的LR寄存器和PC寄存器:
  • 结语:

怎么控制STM32跳转到指定程序:

首先,使用标号加goto语句可以使程序强制跳转,而goto的原理实际上是汇编语言里面的强制跳转。

我们看STM32的启动文件,发现里面有这两句程序:

其中LDR R0 ,=一个函数名

意思是把这个函数的地址放到寄存器R0里面

BLX R0和BX R0意思都是跳转到以R0寄存器所存的地址

Cortex-M3/M4内核STM32的LR寄存器和PC寄存器怎么控制STM32跳转到指定程序:STM32的LR寄存器和PC寄存器:结语:

STM32的LR寄存器和PC寄存器:

PC寄存器是程序计数器,内部存的是程序当前执行到了哪个地址。LR寄存器是连接寄存器,在执行子函数前,LR会保存执行完子函数后,应该回到哪个地方。验证如下:

我们在主函数执行里面打一个断点,当程序执行到端点处时,我们发现端点处的PC指针是0X080002A2,

Cortex-M3/M4内核STM32的LR寄存器和PC寄存器怎么控制STM32跳转到指定程序:STM32的LR寄存器和PC寄存器:结语:

那么在执行函数raw_os_init()前,LR寄存器会记住执行完raw_os_init()函数后,PC指针应该跳转到哪个地址。我们再在raw_os_init()函数里面打断点,看执行子函数raw_os_init()时LR是不是存的是执行完子函数后应该返回的地址。

Cortex-M3/M4内核STM32的LR寄存器和PC寄存器怎么控制STM32跳转到指定程序:STM32的LR寄存器和PC寄存器:结语:

在执行子函数raw_os_init()时,我们发现LR里面存的是0X080002A3,比我们在temppp += 1;断点处看到的PC指针大了1。这是为什么呢?

这是因为我们在temppp += 1;打断点时,是还没执行temppp += 1;语句的PC指针地址,则执行temppp += 1;时PC指针值应该是0X080002A2 + 1=0X080002A3,刚好和LR寄存器中存的值一样。

结语:

LR存是:执行子函数后,PC指针应该跳转回去是,应该跳转的地方

继续阅读