回调函数:
1.是什么?
回调:利用函数指针进行函数调用的过程。
回调函数:在另一个系统(调用者)运行时被作为参数传递的函数(函数的内容细节由被调用者写好)
2.有什么用?
- 在单片机架构中的运用
分开硬件层和应用层代码后,当需要提供接口而不暴露源代码时,需要用到回调函数,例如在应用程序需要采集硬件层的数据时,可以提高程序移植性 - 可以直接调用函数,为什么还要用回调函数呢?
因为可以把调用者和被调用者分开,调用者不关心谁是被调用者,达到解耦的目的。分开硬件层和应用层代码后,当需要提供接口而不暴露源代码时,需要用到回调函数,例如在应用程序需要采集硬件层的数据时,可以提高程序移植性。 - 编写响应式(输入型)函数
如处理串口、按键、ADC值等信息的采集。 - 其他
利于代码的封装,代码简洁清晰。
3.怎么用?
1.原理
有多种方法可以实现回调函数机制,在C语言中可以通过函数指针来实现
2.异步回调
同步调用
异步回调
(中断内调用回调函数)异步回调简例:
注意
简例仅提供思路,这里尝试消息队列的想法,但逻辑没处理完全。
回调函数程序:
将函数作为参数赋值、运行回调函数
被调用函数程序:
实现具体的函数细节
getCValue函数是对应的函数指针要注册的函数(即被调用者的具体实现)
初始化赋值程序:
回调函数被作为参数传入,封装了函数实现的细节
中断程序:
运行回调函数
注意
- 发生中断时,设置标志,构造一个尽量简短的ISR(中断太频繁会影响其他低优先级的中断),让其他的工作由对应的线程去执行。
- 中断运行回调函数后,主函数可以有相关的对应操作,不必在主程等待数值的获取(同步),值的获取不影响主程的继续运行,可以轮询的方式判断中断中回调函数是否取值(异步)后进行对应操作。
3.回调地狱
为实现异步代码顺序执行采样传统嵌套办法而出现回调函数中嵌套回调函数的情况,导致代码可读性差,后期不好维护。
解决办法一:js中的promise对象,链式编程来解决。