天天看點

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指針應該跳轉回去是,應該跳轉的地方

繼續閱讀