回调函数与钩子函数详解

📖 精选 ✍️ Jack | 📅 2025-08-16 | 👍 4 | 原帖↗
#知识星球 #立芯嵌入式 #来源/立芯星球 #技术/C语言 #技术/函数指针 #质量/精华

原帖 | Jack | 2025-08-16 11:20 | 👍4 | 阅读约1

关于回调函数的解释:

菜鸟教程的解释:

中断服务函数和回调函数的区别:

中断服务函数是 MCU 启动时就绑定固定地址的函数,由硬件触发;
回调函数是你写代码主动注册的函数指针,在 ISR 或其他代码中被软件调用。
ISR中会默认自动执行弱定义静态回调函数,并非真正意义上的回调函数,因为没有函数传入函数指针;比如中断来了,MCU自动调用ADC_IRQHandler中断服务函数中的HAL_ADC_IRQHandler函数,判断ADC状态寄存器发现EOC就会执行HAL_ADC_ConvCpltCallback,这个弱定义静态回调函数可以去掉__weak写成自己的同名函数,函数内部自定义一些操作,比如向队列发送消息或者读取转换数据。
回调函数指的是被传入函数且在某一时刻调用的函数指针,即函数A把函数B作为参数传给另一个函数C,由C在合适的时机调用B。比如HAL_ADC_RegisterCallback()动态注册真正意义上的函数指针回调,其第三个参数为函数指针类型typedef void (pADC_CallbackTypeDef)(ADC_HandleTypeDef hadc); 通过动态注册将自己写的回调函数作为第三个参数传入并保存在hadc对象的函数指针里,那么在执行中断时会在HAL_ADC_IRQHandler函数中调用函数指针指向的函数,即自己写的回调函数。其中函数A为HAL_ADC_RegisterCallback(),主动调用它进行注册;函数B为自己写的回调函数,通过函数指针传入;函数C为HAL_ADC_IRQHandler,中断发生时调用注册的回调函数(即 B)。
相比静态回调函数,动态回调函数多一步指针解引用,但更为灵活。

回调函数&同步回调&异步回调

回调-》我在调用一个函数A的时候,要让被调用的函数A去执行我传给它的一个函数B。这个函数B就是回调函数。
同步回调-》调用A时,我阻塞在这,A必须把我传给他的回调函数B执行完,我才继续往下走。
异步回调-》调用A时,我不阻塞在这,我接着执行后面的程序C,A独立去执行回调函数B。

钩子函数与回调函数并不是一回事,二者的区分见 老师,回调函数和钩子函数意义不

知识总结


相关笔记