在CH32V003單片機中使用 內(nèi)置的__get_SP()函數(shù)遇到的問題

需求功能:

????? ? 軟件獲取當前程序的PC地址值,并保存以便下一次進入

目前使用的方法:

????????調(diào)用官方給的__get_SP()函數(shù)

????????下面是我自己在封裝的函數(shù),其中u32NowPC 是一個全局變量

????????void GetNowPC(void)

????????{

????????? ? u32NowPC = __get_SP();

????????

????????// return u32NowPC;

????????}


????????下面是當我時間計數(shù)到達后,想再次進入之前的保存斷點地址的寫法

????????tArrTaskComps[nowtaskIndex].pfun_delay = (void*) u32NowPC;


出現(xiàn)的問題:

????????當我使用上面的功能時,在調(diào)試模式下,發(fā)現(xiàn)會進入到如下函數(shù)里面

/*********************************************************************

?* @fn? ? ? HardFault_Handler

?*

?* @brief? ?This function handles Hard Fault exception.

?*

?* @return? none

?*/

void HardFault_Handler(void)

{

? while (1)

? {

? }

}


是我對__get_SP()使用錯誤了嗎?或者有其他方法能實現(xiàn)我需要功能呢?

????????

程序計數(shù)器是pc,不是sp。sp是棧指針。


如果你一定要跳,如果跳的兩邊棧操作不匹配,一定會出問題。我猜測lz應該是大概率不理解匯編層級的計算機原理。在C里面,就算是goto也不允許你函數(shù)跳轉(zhuǎn)。如果lz一定需要跳轉(zhuǎn),這算是非常規(guī)操作,必須檢查匯編代碼確認問題。


至于lz想實現(xiàn)的功能,大概率可以重新理清邏輯用函數(shù)調(diào)用搞定。


感謝回復!

????????那個sp不是保存跳轉(zhuǎn)前的PC值的嗎?那目前我想獲取到調(diào)用函數(shù)前的那個斷點pc值,對于CH32V003單片機是否可以實現(xiàn)呢?


您好,SP是棧指針,一般用于保存中斷斷點、函數(shù)調(diào)用返回值、CPU現(xiàn)場數(shù)據(jù)等。關于程序計數(shù)器PC值,可以在調(diào)試時直接通過PC寄存器查看當前PC值,也可以查看匯編那部分,會有PC值,如下圖:

image.png



“那目前我想獲取到調(diào)用函數(shù)前的那個斷點pc值”


我想你的意思是看“調(diào)用函數(shù)GetNowPC”那條指令的PC值。

我查了一下RISCV架構,RISCV有ra寄存器,專用于函數(shù)返回值,而且是?caller-save。有嵌套的時候caller把ra保存到棧里面。

GetNowPC作為最后一級調(diào)用,應該直接保存一下ra就行。你可以檢查一下GetNowPC調(diào)用時是不是類似


jal?ra,?function_label


這種用法,如果是的話,ra就是pc+4。


但話說回來,”并保存以便下一次進入“。下一次進入這件事是比較困難的,并不是程序的常規(guī)操作。





只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频