$Sub$$ 与 $Super$$ 的“补丁”功能
—CC_ARM编译器环境下
S u b Sub Sub$ 与 S u p e r Super Super$ 的“补丁”功能(详见 ARM® Compiler v5.06 for µVision® armlink User Guide):
这是一种特殊模式:用于有一个已经存在且不能被改变的函数的情况(比如不能更改的库函数);使用这两个模式可以帮原函数打补丁,如存在一个函数foo();
S u b Sub Sub f o o : 定 义 的 新 功 能 函 数 , 在 f o o ( ) 函 数 之 前 / 后 使 用 foo :定义的新功能函数,在foo()函数之前/后使用 foo:定义的新功能函数,在foo()函数之前/后使用Sub$ $foo 可以添加一些新的程序代码。
S u p e r Super Super f o o : 就 是 原 始 的 未 修 补 的 f o o 函 数 , 使 用 这 个 foo :就是原始的未修补的foo函数,使用这个 foo:就是原始的未修补的foo函数,使用这个Super$ $foo函数将直接跳转到foo()函数。
下面以stm32f10xxx的int main(void)函数为例:
(1) 上电后,运行启动代码startup_stm32f10xxx.s
(2) 从系统初始化(SystemInit)开始执行,将函数地址赋给R0寄存器,跳转到R0地址执行并返回此处。
(3) 将__main函数地址给R0,将函数地址赋给R0,跳转到R0地址执行,不返回。
(4) 跳转到 S u b Sub Sub$main(自己定义该函数)。
#if defined (__CC_ARM)
extern int
S
u
p
e
r
Super
Super$main(void);
/* re-define main function */
int
S
u
b
Sub
Sub$main(void)
{
preWork() ; // do somthing before call main
S
u
p
e
r
Super
Super$main(); // 跳转到 main()
return 0;
}
#endif