微控制器C語言任何位置跳轉到任何指定位址 轉

2021-07-09 11:50:35 字數 697 閱讀 4557

用c語言寫的程式為求模組化,一般函式數量較多,函式呼叫的巢狀層數也多,要從乙個較深的巢狀立刻跳出到主函式,是非常困難的。用break或者return是跳不出來的,一般的解決方法或是使用c51的庫函式setjmp()和longjmp()實現長跳轉,但是這兩個函式在中斷函式內部是無能為力的;再或是在c函式中嵌入彙編。雖然用彙編指令可以實現程式的長距離跳轉,但是這種方法的除錯過程十分煩瑣,而且程式的可移植性差。對於習慣用c51程式設計而不想用彙編的設計者,該部分程式是乙個難題。

我們可以利用keil軟體的絕對位址跳轉,((void(code *)(void))0x00)(); keil軟體編譯時會轉換成jmp  0x00,就跳到指定的絕對位址了;

但這又有些不方便,我們想跳到任何我們想跳到的地方去,而程式一改動,絕對位址又會變,所以我們需要乙個函式能夠取得我們要跳轉的絕對位址,但又不能直接讀取程式計數器pc(絕對位址);

方法還是有的:因為微控制器c語言呼叫函式或者進入中斷時,都要線把pc壓入堆疊去,而sp值是可以讀的,因此呼叫函式,把堆疊裡的值(pc)讀出儲存,作為跳轉的據對位址;例程如下:

ff0() 

long get_jmp_addr(void)

ff1()

希望對大家有幫助!!

另 轉 其實uboot裡面就有例子,不過今天看到乙個ti的,也貼出來,實際差不了多少:

定義:uint32 gentrypoint;

用法:

微控制器C語言程式設計

一 首先我們先了解一下51微控制器的標頭檔案 include 為了能看懂reg51.h標頭檔案,下面需了解keil c51編譯器擴充套件的關鍵字 關鍵字用途 說明bit 位標量宣告 宣告乙個位標量或位型別 sbit 位變數宣告 宣告乙個可位定址變數 sfr特殊功能暫存器宣告 宣告乙個特殊功能暫存器 ...

51微控制器C語言

使用c語言已成為微控制器應用系統開發的趨勢。include 包含微控制器暫存器的標頭檔案這個檔案對微控制器內部各種暫存器進行了定義。如果將 sfr p0 0x80 語句中的 p0 改為其他名字,如 q0 那麼在程式設計時,使用第一行的 檔案包含 處理命令後,微控制器以後就不再認識 p0 而是只認識 ...

如何入門微控制器C語言

一 為什麼要學微控制器技術?傳統的電子產品公升級改造成智慧型化的電子產品需要用到微控制器技術。也就是說傳統的電子產品如電視機 電子錶 計算器 數位相機 手機 遙控器 洗衣機等產品智慧型化 微型化,需要的核心技術就是微控制器技術。所以從事電子行業的工作人員必須學好微控制器技術,否則必然被社會淘汰。二 ...