--------------------------------------------------------------------
关联参考:
STM32 回调函数 (***)https://blog.csdn.net/ken2232/article/details/135759275
回调函数(callback)是什么?(*****) https://blog.csdn.net/ken2232/article/details/132665409
STM32:回调函数的实质 (***) https://blog.csdn.net/ken2232/article/details/135812953
--------------------------------------------------------------------
一个完全相同的功能模块,可以有多种不同的函数写法。
不同的函数写法有不同的最佳使用场景:穿着不同函数马甲的相同功能模块
- 宏函数
- 通用写法
- 函数指针
- 。。。
在不同的设计模式中,通常会采用函数各种写法中的最佳写法;当函数处在不同设计模式中的不同位置,函数就有不同的作用或用途,因而就有了不同的函数叫法。
比如:回调函数,实质上,回调函数,就是一个独立函数,只不过由于它所处的位置的作用不同,因而被称之为回调函数,仅此而已。
STM32的回调函数有 2种写法:
- weak方式的通用函数写法,
- 函数指针写法。
采用回调函数的写法,是必须的吗?
是必须的,也不是必须的。
回调(callback)是一种非常重要的机制,主要可以用来实现软件的分层设计,使得不同软件模块的开发者的工作进度可以独立出来,不受时空的限制,需要的时候通过约定好的接口(或者标准)相互契合在一起,也就是C++或者JAVA等现代编程语言声称的所谓面向接口编程。同时回调也是定制化软件的基石,通过回调机制将软件的前端和后端分离,前端提供逻辑策略,后端提供逻辑实现。
这意味着:
如果使用 st官方函数库来编程,就是必须的;
如果软件完全由自己来实现,就不是必须的。
在软件编写中,分工的需要:回调,这是一种“软件编程技术”
使用 st官方函数库来编程时,HAL函数库是 st官方编写的;回调函数的具体化与完善,是由用户来完成的。
如果软件完全由自己来实现,那么,为了模拟回调函数的功能,又可以怎样来做呢?
- 直接在中断中,调用具有相同功能的普通函数就可以了。无需 weak方式的支持,无需采用函数指针。
- 或者,直接将函数的实现代码,拷贝到中断函数中也行。
- 。。。。。。
小结:
1. 回调,这是一种“软件编程技术”,只不过是为了“软件分工”的需要。
因为在基于 st函数库的编程中,HAL库与回调函数的编写,它们的完成者,不是同一个。
回调函数:就是一个独立的函数,只不过是:在特定的软件设计模式中(基于接口编程),处在特定的软件结构位置,穿上了特定的马甲(weak, 函数指针),因而,有了回调函数这个特定的称谓。实质上,还就是一个独立的函数。
2. 类比
“张三”带上拳套,跑到了擂台上,就叫“拳击手”,仅此而已。
“张三” -------功能模块
拳套 -------马甲,带着马甲的张三,叫函数;带着拳套马甲的,叫函数指针?
擂台 ------特定场景,特定位置
“拳击手” ------特定称谓
实质上,“张三” 是“张三” ,带着拳套马甲的张三,也还是张三;“函数”是“函数”。采用weak 重写, 或函数指针方式等马甲实现的,也还是函数。披着羊皮的狼,它还是狼。
注意:带着拳套的张三(函数),只有在擂台(特定场景)上才叫“拳击手”。假如此时带着拳套的张三走在闹市中,也许就叫怪人吧?
3. “回调”是一个 TMD 稀里糊涂的概念,要想理解它,可能还是使用 callback 容易理解一些。
callback
- call then back:执行具有返回值的函数。
- call without back:执行没有返回值的函数。