回调函数的基本概念
回调函数的基本概念,这里不做详细的讲解。如果不懂的可以参考另一篇博文回调函数分析
回调函数的类型
讲回调函数之前,先了解函数调用的类型:
输出型
输出型函数就是调用用这个函数之后就能完成对应的功能需求。比如sizeof()获取数据字节大小,memcyp()是内存拷贝函数。
输出型函数占据做主导地位,知道什么时候该调用它。
输入型
输入型函数是把函数当作参数调用。而回调函数就是把函数当作参数来使用。根据回调函数的基本定义,回调函数的核心作用是:
- 把数据从一个源文件传递到另一个源文件,而不用全局变量共享数据。
- 回调函数的数据传递方式有利于代码的封装。
异步回调和同步回调的区别
同步回调函数
同步回调函数是指在执行回调函数之前,任务必须完全完成。简单说,同步回调函数按照程序逻辑顺序执行。
特点
- 阻塞执行:调用线程会阻塞直到回调完成。
- 简单的执行模型:任务的执行和回调函数的调用是线性的。代码的执行顺序与逻辑顺序一致。
异步(并行)回调函数
异步回调函数是是指任务的执行和回调函数的调用是分开的。任务可以在后台线程中异步执行,而回调函数会在任务完成后异步调用。
特点
- 非阻塞执行:主线程继续执行其他操作,不会等待回调函数完成而阻塞。任务和回调函数的执行是异步的。
- 复杂的执行模型:由于任务和回调函数的执行在不同的线程或时间点,代码逻辑可能更复杂,需要处理线程同步或数据一致性问题。
小结
同步回调函数
- 等待主线程任务完成后再调用函数。
- 执行流程顺序一致。
- 合适短时间任务
异步回调函数
- 主线程继续执行,不会因等待任务完成而阻塞。
- 任务在后台线程中执行,回调函数在任务完成后异步调用。
- 适合长时间任务,提升程序响应性,但需要处理线程安全等复杂问题。
不同类型回调函数执行过程
回调函数程序使用
在实际项目中使用回调函数有如下几个步骤:
- 自定义返回值、形参一致的函数指针类型;
typedef void (*pxfunc_callback)(void);
- 定义函数指针变量
pxfunc_callback puxhal_usart_rx_callback_func = NULL;
- 通过这个函数指针,指向应用层的函数地址(函数名)。
void vhal_app_task(puxhal_usart_rx_callback_func pcall_back)
{
puxhal_usart_rx_callback_func = pcall_back;
}
- 函数指针变量调用
// 函数层调用
puxhal_usart_rx_callback_func();
- 函数注册回调函数
// 回调函数
static void prvhal_callback_register(void)
{
}
// 注册回调函数
vhal_app_task(prvhal_callback_register);
回调函数的基本使用步骤。如果不起清楚建议多看几遍。