嵌入式C语言-回调函数的使用及实际作用详解

回调函数是一种将函数作为参数传递的技术,主要用于数据传递,避免全局变量。文章介绍了回调函数的概念,区分了输出型和输入型函数,并展示了在实际项目中定义、注册和调用回调函数的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回调函数的基本概念

回调函数的基本概念,这里不做详细的讲解。如果不懂的可以参考另一篇博文回调函数分析

回调函数的类型

讲回调函数之前,先了解函数调用的类型:

输出型

输出型函数就是调用用这个函数之后就能完成对应的功能需求。比如sizeof()获取数据字节大小,memcyp()是内存拷贝函数。

输出型函数占据做主导地位,知道什么时候该调用它。

输入型

输入型函数是把函数当作参数调用。而回调函数就是把函数当作参数来使用。根据回调函数的基本定义,回调函数的核心作用是:

  1. 把数据从一个源文件传递到另一个源文件,而不用全局变量共享数据。
  2. 回调函数的数据传递方式有利于代码的封装。

异步回调和同步回调的区别

同步回调函数

同步回调函数是指在执行回调函数之前,任务必须完全完成。简单说,同步回调函数按照程序逻辑顺序执行

特点
  1. 阻塞执行:调用线程会阻塞直到回调完成。
  2. 简单的执行模型:任务的执行和回调函数的调用是线性的。代码的执行顺序与逻辑顺序一致。

异步(并行)回调函数

异步回调函数是是指任务的执行和回调函数的调用是分开的。任务可以在后台线程中异步执行,而回调函数会在任务完成后异步调用

特点
  1. 非阻塞执行:主线程继续执行其他操作,不会等待回调函数完成而阻塞。任务和回调函数的执行是异步的。
  2. 复杂的执行模型:由于任务和回调函数的执行在不同的线程或时间点,代码逻辑可能更复杂,需要处理线程同步或数据一致性问题。

小结

同步回调函数
  1. 等待主线程任务完成后再调用函数。
  2. 执行流程顺序一致。
  3. 合适短时间任务
异步回调函数
  1. 主线程继续执行,不会因等待任务完成而阻塞。
  2. 任务在后台线程中执行,回调函数在任务完成后异步调用。
  3. 适合长时间任务,提升程序响应性,但需要处理线程安全等复杂问题。
不同类型回调函数执行过程

在这里插入图片描述

回调函数程序使用

在实际项目中使用回调函数有如下几个步骤:

  1. 自定义返回值、形参一致的函数指针类型;
typedef void (*pxfunc_callback)(void);
  1. 定义函数指针变量
pxfunc_callback puxhal_usart_rx_callback_func = NULL;
  1. 通过这个函数指针,指向应用层的函数地址(函数名)。
void vhal_app_task(puxhal_usart_rx_callback_func pcall_back)
{
	puxhal_usart_rx_callback_func = pcall_back;
}
  1. 函数指针变量调用
// 函数层调用
puxhal_usart_rx_callback_func();
  1. 函数注册回调函数
// 回调函数
static void prvhal_callback_register(void)
{
}
// 注册回调函数
vhal_app_task(prvhal_callback_register);

回调函数的基本使用步骤。如果不起清楚建议多看几遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值