c语言回调函数的使用及实际作用详解,已开源

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

我们以往最简单粗暴的方式是不是就是用一个全局变量,比方说硬件层串口接收到数据来了,那么我们把数据丢到数组里,然后把接收完成全局变量标志位置1。

比方说全局变量名为RcvFlag,然后应用层程序会轮询判断RcvFlag==1?是的话就开始把数组里的数据取出来解析。

很多人就会说了,你看我用这种方法照样能实现功能啊,为什么还要学习别的架构。

这样做当然可以实现功能,但是会存在移植性很差的问题。

比如说你们老板让你把这个串口的硬件层封装起来给客户用,但不能让客户看到你实现的源代码,只提供接口(函数名)给对方用。

那么这时候难道你要告诉客户先判断哪个变量为1,然后再取哪个数组的数据这么LOW的做法吗?

那么如果是懂行的客户一定会怀疑你们公司的技术实力是不是小学生水平。

那怎样做才会既方便又专业呢? 这里我们就需要用到回调函数啦。

三、回调函数的作用

那么在讲回调函数之前呢,对于函数调用呢我一般分为2种类型:

1.输出型

不知道大家有没有用过C语言自带的一些库函数,比如说sizeof()获取数据长度的函数,memcpy()是内存拷贝函数,我们调用这个函数之后呢就能完成相应的功能。

还有我们基于单片机的一些程序函数,比方说控制LED点亮熄灭、继电器吸合断开、LCD驱动等等。

那么这些呢,我一般称为输出型的函数。

输出型函数我们是主导的角色,我们知道什么时候该调用它。

2.输入型

输入型呢,也称为的是响应式的函数

什么叫响应式的函数呢?

比方说接收串口的数据,我们不知道什么数据什么时候来。

再比方说,我们按键检测的函数,我们不知道什么时候会按下按键,那么这些就要定义成响应式函数来实现,而响应式函数就可以用回调函数来实现

所以通过这两个种类型的分析啊,我们就可以知道,回调函数基本是用在输入型的处理中。

比方说串口数据接收,那么数据是输入到单片机里面的,单片机是处于从机角色。

按键检测,按键状态是输入到单片机里的。

再比方说ADC值采集,ADC值也是输入到单片机里的。

那么它们输入的时间节点都是未知的,这些就能够用回调函数来处理。

具体怎么处理后面我们会用代码来给大家举例。

回调函数还有一个作用就是为了封装代码

比如说做芯片或者模组的厂家,我们拿典型的STM32来举例,像外部中断、定时器、串口等中断函数都是属于回调函数,这种函数的目的是把采集到的数据传递给用户,或者说应用层。

所以回调函数的核心作用是:

1.把数据从一个.c文件传递到另一个.c文件,而不用全局变量共享数据这么LOW的方法。

2.对于这种数据传递方式,回调函数更利于代码的封装。

四、掌握回调函数的程序编写

前面说了很多概念性的东西,可能大家也比较难理解,回调函数最终呢是靠函数指针来实现的。

那么我这里通过一些模拟按键的例子来演示下怎么回通过调函数来处理它们。

下面是我们的c-free工程,用这个来模拟方便点:

img

从模块化编程的思想来看,整个工程分为2个部分,应用层main.c文件,硬件层key.c和key.h文件。

不管再怎么复杂的程序,我们都要先从main函数一步步往下挖,main函数代码如下。

int main(int argc, char *argv[])

{

KeyInit();

KeyScanCBSRegister(KeyScanHandle);

KeyPoll();

return 0;

}

KeyInit();是key.c文件的按键初始化函数

KeyScanCBSRegister(KeyScanHandle);是key.c的函数指针注册函数。

这个函数可能大家会有点蒙,请跟进我们的节奏,下面开始烧脑环节,也是写回调函数的必须步骤,

想理解这个回调函数注册函数,我们要先从硬件层**(key.h)**头文件的函数指针定义说起,具体看下图。

img

这里自定义了一个函数指针类型,带两个形参。

然后,我们在key.c这个文件里定义了一个函数指针变量。

img

重点来了,我们就是通过这个函数指针,指向应用层的函数地址(函数名)

具体怎么实现指向呢?就是通过函数指针注册函数。

img

这个函数是在main函数里调用,使用这种注册函数的方式注册灵活性也很高,你想要在哪个.c文件使用按键功能就在哪里调用。

img

这里要注意,main.c这个文件要定义一个函数来接收硬件层(key.c)过来的数据。

这里定义也不是乱定义的,一定要和那个自定义函数指针类型返回值、形参一致。

img

然后把这个函数名字直接复制给KeyScanCBSRegister函数的形参就可以了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-lRybOtGz-1713295098606)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值