什么是回调函数(回调函数的参数)( 二 )


void hal_KeyScanCBSRegister(KeyEvent_CallBack_t pCBS){ if(KeyScanCBS == 0) { KeyScanCBS = pCBS; }}
这个函数的作用是将我们前面定义的KeyScanCBS函数指针指向外部函数地址(也就是指向那个函数的函数名) 。
当然这个功能不是必须的,只是我的思维和代码风格 。也可以不单独编写这样的函数,只是在使用之前将KeyScanCBS指向一个外部函数,或者等待程序崩溃 。哈哈哈 。
第三步:
准备好这些步骤后,我们继续说怎么用 。
在我们需要使用按键功能的地方,重写相同的功能 。c文件 。
比如app.c文件是产品功能代码(应用层),我需要使用应用层的关键功能 。
重写函数时,返回值和参数应该与该函数的指针类型相同 。
如果你忘了,我们再复习一遍 。
TYPEDEF void(* KEY event _ CallBack _ t)(KEY _ VALUE _ TYPEDEF keys);
没有返回值,参数类型为KEY_VALUE_TYPEDEF 。
只有这样才能把这个函数的地址赋给指针KeyScanCBS,才能正常传输数据 。
重写的函数是通过参数接收硬件层的键值 。如果是串行数据,同样如此,只是参数不同 。
然后我们在产品函数初始化的函数中直接调用hal_key.c的注册函数 。
将KeyEventHandle函数的地址分配给hal_key.c的KeyScanCBS函数指针
因此,最终的KeyScanCBS可以理解为等同于KeyEventHandle函数 。
在hal_key.c文件中,我们查看密钥检测和分析程序,最后我们执行KeyScanCBS将我们的密钥(密钥值)传输到我们的app.c文件中 。
这样就可以通过事件来驱动 。只有当键被按下,并且是真实有效的时候,我才会调用KeyScanCBS,将键值传递给应用层 。
中间两个文件之间没有全局变量依赖,可以完全独立,可以仔细消化 。
下面是我为什么使用枚举类型作为函数参数的一个细节 。
如果你了解一些模块的二次开发(WiFi,蓝牙等 。),模块的核心代码为你打包成lib库,你看不到源代码 。
你只能使用它们的功能 。如果不使用枚举,就不知道形参可以传入什么值了吧?
如果我使用枚举,我会为你列出所有可用的值,并给它们命名,让你一眼就能看出它们的意思 。这样方便吗?
好了,今天就到这里 。你下去后可以做实验 。
原创不容易 。尽量用最通俗的语言表达 。如果对你有帮助,请安排三网合一 。


推荐阅读