你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于最近学习C语言回调和钩子函数的想法,以及对HAL库回调函数的困惑

[复制链接]
rui41104 提问时间:2026-8-3 19:43 / 已解决

最近学C语言 回调函数可以理解为 先注册地址 再等待触发 触发之后调用这个函数 这个称为回调函数 在STM32中 裸机情况下 回调函数就是中断服务函数ISR 只有硬件触发这一种触发情况 而钩子函数是等待某个函数运行到一定阶段后进行调用 由这个钩子函数的定义来看 HAL库里的回调函数反而是钩子函数 常规情况下 HAL库的回调函数都是在中断服务函数的结束部分进行的 他的运行阶段固定

不知道这里是否是翻译错误

用AI总结一下我的想法

回调函数本质是“注册-触发-调用”机制。在STM32裸机环境下,回调函数通过函数指针实现运行时动态绑定,其唯一触发源是硬件中断。当硬件事件发生时,CPU跳转至中断服务函数(ISR),在ISR的尾部(即清除标志位之后、中断返回之前)调用已注册的回调函数——此时仍处于中断上下文,因此回调函数中不能执行阻塞操作。回调的核心特征是运行时可切换 :同一个中断源可以通过修改函数指针指向,动态绑定不同的处理逻辑。

钩子函数则完全不同。在STM32 HAL库中,钩子通过__weak关键字实现编译期静态绑定。HAL库在处理完底层寄存器操作后,会在ISR的固定位置(同样是尾部)调用这些弱函数。开发者通过重写同名强函数来“填空”,但一个工程中只能有一个实现,无法在运行时动态更换。

最容易混淆的地方来了: HAL库中所有带Callback后缀的弱函数(如HAL_UART_RxCpltCallback),虽然名字叫回调,但本质上都是钩子——因为它们是编译期绑定的固定流程介入点,不具备运行时动态切换能力。

收藏 评论2 发布时间:2026-8-3 19:43

举报

2个回答
xmshao 最优答案 回答时间:1 小时前

呵呵 这里不必拘泥于术语的称谓了,知道做什么用的即可。具体到这里,本质上就是一段代码,基于特定事件、条件才被调用的功能代码。

STM32 库里面的回调函数,准确地讲,库里并没有完整的现存的回调函数,只是准备了些有名无实的空壳或函数指针。

是的,那些回调函数主要是为各种中断服务准备的,但不是全部。因为还有些回调函数是为各种初始化事件准备的。

另外,STM32 库里的回调函数其实有两套,一套是weak 替换型,使用时将weak 拿掉填写相关代码即可;还有一套就是实时注册型,即使用函数指针绑定相关的回调函数。

这里刚好有篇文章专门介绍STM32 库的回调函数的,你可以阅读参考。

[LAT1241 浅谈STM32库里的回调函数 | STMCU中文官网

rui41104 回答时间:半小时前

xmshao 发表于 2026-8-4 14:54
<strong>呵呵 </strong> **这里不必拘泥于术语的称谓了,知道做什么用的即可。具体到这里,本质上就是一段代码,基于 ...

[md]谢谢解答

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版