【使用场景】
在Keil MDK开发环境下
如果在执行一个函数 test_A 之前,需要增加运行一些流程
而你又无法修改函数 test_A 内的任何流程时
【用法解释】
这是一个只在MDK环境才有用的函数补丁写法,即:
1. 使用 $Sub$$test_A() 定义一个新的函数体,在里面增加需要运行在 test_A 函数前的流程。
可以是执行语句,也可以调用其他函数。把 $Sub$$test_A() 当成一个平时使用的函数就行。
2. 在 $Sub$$test_A() 中,增加的流程全部结束后,用 $Super$$test_A() 来真正运行 test_A 函数
【示例】
extern void $Super$$test_A(void);
//自定义的其他函数流程
void func(void)
{
printf("func() running\n");
}
//被补丁的原函数(无法修改内部流程的那个)
void test_A(void)
{
printf("test_A running\n");
}
//补丁函数
void $Sub$$test_A(void)
{
printf("$Sub$$test_A running\n");
func();
$Super$$test_A();
printf("after $Super$$test_A\n");
}
void main(void)
{
printf("main running\n");
test_A();
}
【执行结果】
通过这份log,结合上面的示例,希望可以帮助理解,该补丁函数运行的流程
【注意】
在 $Sub$$test_A 函数中
想要调用原函数 test_A
务必使用?$Super$$test_A()
否则可能造成函数调用的无限循环,直到可使用的栈空间全部用完,程序崩溃
|