在 __CC_ARM 編譯器環境下,使用$Sub$$ 與 $Super$$ 的“補丁”功能


$Sub$$ 與 $Super$$ 的“補丁”功能(詳見 ARM® Compiler v5.06 for µVision® armlink User Guide):

這是一種特殊模式:用於有一個已經存在且不能被改變的函數的情況(比如不能更改的庫函數);使用這兩個模式可以幫原函數打補丁,如存在一個函數foo();

$Sub$ $foo :定義的新功能函數,在foo()函數之前/后使用$Sub$ $foo 可以添加一些新的程序代碼。

$Super$ $foo :就是原始的未修補的foo函數,使用這個$Super$ $foo函數將直接跳轉到foo()函數。

 

下面以stm32f10xxx的int main(void)函數為例:

(1)  上電后,運行啟動代碼startup_stm32f10xxx.s

(2)  從系統初始化(SystemInit)開始執行,將函數地址賦給R0寄存器,跳轉到R0地址執行並返回此處。

(3)  將__main函數地址給R0,將函數地址賦給R0,跳轉到R0地址執行,不返回。

 

(4)  跳轉到$Sub$$main(自己定義該函數)。

#if defined (__CC_ARM)
     extern int $Super$$main(void);
  /* re-define main function */
  int $Sub$$main(void)
  {
    preWork() ;      // do somthing before call main

       $Super$$main();      //  跳轉到 main() 
    return 0;
  }

#endif

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM