在 __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

 

posted @ 2018-11-28 11:30  风清无际  阅读(3173)  评论(0编辑  收藏  举报