回调函数的初步认知

关于回调函数一般就会想到的是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");

   }

}

这样修改就会出现问题,所以最好注册函数中不要添加其他变量进行传递。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值