发新帖我要提问
12
返回列表
打印
[STM32F4]

STM32库函数里众多的Callback()怎么使用

[复制链接]
楼主: wyjie
手机看帖
扫描二维码
随时随地手机跟帖
21
中断后的回调。就是中断后执行这个。

使用特权

评论回复
22
木木guainv| | 2018-11-6 17:09 | 只看该作者
中断之后会调用这个函数啊

使用特权

评论回复
23
tuoxieshu| | 2018-11-11 23:21 | 只看该作者
其实就是一个函数指针,你定义一个函数然后取得这个函数的指针,在某个事件发生的地方让这个事件去调用你事先定义好的函数去完成你想做的事。所谓回调的意思就是你事先调用一下事件绑定函数并把你的函数指针告诉它,等到那个事件发生的时候就会回过头调用你的函数。这是事件驱动的基本概念,在软件设计里很常见。而mcu的一些基本的中断就是基于这个方法的。你在你定义的函数后面加上interrupt 0 1 2 3这种代码,编译器会认出你这个函数并会固定把你的函放在一个地址上,当事件发生时就会直接跳到那个地址。

使用特权

评论回复
24
whtwhtw| | 2018-11-12 09:15 | 只看该作者
本帖最后由 whtwhtw 于 2018-11-12 09:43 编辑

每个人的中断任务是不同的,为了统一标准,就定义了这个中断回调函数。HAL库标准就是不管是谁写的中断函数,都统一调用这个函数,具体某个人要执行什么任务,自己在回调函数中写任务就行了,而不必修改中断函数。这样子库函数就独立出来了。
比如stm32f1xx_hal_adc.c库文件中void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc)中断就调用了HAL_ADC_ConvCpltCallback(hadc)。而HAL_ADC_ConvCpltCallback(hadc)函数是在库里定义了的:__weak void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)。为啥库函数里定义的函数要加__weak?这个__weak是弱定义的意思,就是如果用户如果没有定义该函数,中断就调用库函数中的该函数,如果用户定义了一个不含__weak的同名的回调函数void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc),那么中断中就调用用户的函数而忽略库函数中的函数。这样做就不需要修改函数库,既保证了函数库的完整性,又增强了用户的灵活性。

使用特权

评论回复
25
whtwhtw| | 2018-11-12 09:42 | 只看该作者
所以动不动就修改函数库的都是不懂库的强大!

使用特权

评论回复
26
whtwhtw| | 2018-11-12 11:34 | 只看该作者
具体使用Callback函数的时候就是先在对应中断库函数中找到__weak定义的Callback函数,复制该函数在自己的.c文件中重新编写没有__weak定义描述的函数处理程序,该程序就是实际中断处理函数。

使用特权

评论回复
27
whtwhtw| | 2018-11-12 11:36 | 只看该作者
其实把hal库读懂了,对编程理解能更深一个层次

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则