回调函数的初步认知
关于回调函数一般就会想到的是ST的HAL库的一些回调函数,串口的接收回调以及ADC的回调等等。
回调函数在一般意义上通常都是作为SDK库支持包而使用,主要目的是解耦。
我们对于回调函数的认知比较简单,回调函数是一个调用其他函数的函数。在不暴露自身代码的情况下只要暴露接口就可以获取想要的值,同时也可以在自身的回调中添加一些另外的功能。
我在网上找到了很多版本的代码:
1.这个感觉像是最简单的,只是通过提供的不同的函数指针就把数据从Handle中取出然后传递到回调函数中。
#include<stdio.h>
int Callback_1(int x) // Callback Function 1
{
printf("Hello, this is Callback_1: x = %d ", x);
return 0;
}
int Callback_2(int x) // Callback Function 2
{
printf("Hello, this is Callback_2: x = %d ", x);
return 0;
}
int Callback_3(int x) // Callback Function 3
{
printf("Hello, this is Callback_3: x = %d ", x);
return 0;
}
int Handle(int y, int (*Callback)(int))
{
printf("Entering Handle Function. ");
Callback(y);
printf("Leaving Handle Function. ");
}
int main()
{
int a = 2;
int b = 4;
int c = 6;
printf("Entering Main Function. ");
Handle(a, Callback_1);
Handle(b, Callback_2);
Handle(c, Callback_3);
printf("Leaving Main Function. ");
return 0;
}
2.这个是我根据网上的一篇博文写的,功能可以实现,不过还不够好。
/*
* @Description:
* @Version: 1.0
* @Autor: lzc
* @Date: 2022-01-13 10:46:22
* @LastEditors: lzc
* @LastEditTime: 2022-01-13 14:44:08
*/
#include <stdio.h>
typedef int (*pUartCallback)(int);
int Uart_Flag = 0;
pUartCallback UartCallback;
void UartCBRegisterCallback(pUartCallback callback)
{
UartCallback = callback;
}
void UART_Deal(int Flag)
{
Uart_Flag = Flag;
UartCallback(Uart_Flag);
if (Uart_Flag == 1)
{
printf("UART Deal\n");
}
else
{
printf("UART No Deal\n");
}
}
// APP
int UART_HandleEvent1(int Flag)
{
printf("UART_HandleEvent1 Uart Flag is %d\n", Flag);
}
int UART_HandleEvent2(int Flag)
{
printf("UART_HandleEvent2 Uart Flag is %d\n", Flag);
}
int main()
{
int Uart_Rx_Flag = 0;
UartCBRegisterCallback(UART_HandleEvent2);
while (1)
{
printf("Wait Input..\n");
scanf("%d", &Uart_Rx_Flag);
UART_Deal(Uart_Rx_Flag);
}
return 0;
}
3.通过回调函数的方式依次调用不同的函数

总结: 回调函数一定要有触发条件,只有触发了回调的函数才会使得回调函数正常运转。注册函数一定需要只有注册功能,不然会使得注册函数也得加入循环。
类似上面的第二块程序,现在注册函数只会链接回调函数与定义的回调结构体。
如果修改为即传递参数又链接函数与结构体,则会出现注册函数也得加入循环的情况。
void UartCBRegisterCallback(int Flag,pUartCallback callback)
{
Uart_Flag = Flag;
UartCallback = callback;
}
void UART_Deal(void)
{
UartCallback(Uart_Flag);
if (Uart_Flag == 1)
{
printf("UART Deal\n");
}
else
{
printf("UART No Deal\n");
}
}
这样修改就会出现问题,所以最好注册函数中不要添加其他变量进行传递。

浙公网安备 33010602011771号