$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