下面是我的理解,如果大家有空,请帮我看看是否正确,谢谢
//interrupt.h 文件,由甲方编写
#ifndef INTERRUPT_H
#define INTERRUPT_H
void interrupt(void);
void CallBackRegister(void(*func2)());
#endif
//interrupt.c //模拟单片机中断文件,由甲方编写
#include "interrupt.h"
static void (*func3)(); //定义函数指针变量(产生代码,非声明)
//==============================
void CallBackRegister(void(*func2)()) { //定义注册函数,给乙方使用
func3 = func2; //记忆乙方的函数地址,这就是回调函数注册
}
//==============================
void interrupt(void) {
void (*func)(); //定义局部函数指针变量
func = func3; //将上面注册进来的地址赋值测试
func(); //通过指针,运行被调用的函数
add(); //普通方式,直接调用函数
}
//==============================
/*
请教:
1:
请问,这里的甲方是不是(必须)要定义一个本文件的全局函数指针变量 func3
然后,注册函数 CallBackRegister 和 中断函数 interrupt 共用这个变量,
这样甲方才能"知道"和"运行"乙方传进来的函数
2:
我在代码上的注释是否正确,因为它代表了我的理解。谢谢
*/
//main.c //main.c 文件,由乙方编写
#include <stdio.h>
#include "interrupt.h"
//==============================
void add(void) { //定义被调用的函数,这个函数叫“回调函数”
static int test; //测试变量
test++; //变量++
printf("test=%d\n", test); //输出显示
}
//==============================
int main(void) { //用户(乙方)的主函数
CallBackRegister(add); //注册回调函数,就是把add函数的地址告诉甲方
interrupt(); //模拟单片机进入中断服务函数
return 0;
}
//end
|