我的编程空间,编程开发者的网络收藏夹
学习永远不晚

c语言中回调函数的使用方法及作用是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

c语言中回调函数的使用方法及作用是什么

本篇内容介绍了“c语言中回调函数的使用方法及作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

目录
  • 前言

  • 一、通过这节课程你能掌握以下知识:

  • 二、程序架构的核心理念和需求

  • 三、回调函数的作用

    • 输出型

    • 输入型

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

前言

今天给大家讲一下芯片/模块厂家写SDK必须会使用的一种技术:回调函数。

回调函数这个知识点其实并不是很难,难是难在网上很多讲解回调函数的都说的太学术化了化了,一点也不亲民。

很多人即使知道怎么写回调函数也根本就搞不懂它们在实际产品中也有什么用,什么时候用。

所以这节课呢我们会以程序架构的需求为出发点,讲解回调函数是怎么满足它这个需求的。

为了方便大家理解,这篇内容也对应有一篇文章,大家可以找无际单片机编程获取。

一、通过这节课程你能掌握以下知识:

掌握程序架构的核心理念或需求。掌握回调函数的作用掌握回调函数的程序编写掌握回调函数在产品中的应用

二、程序架构的核心理念和需求

很多人可能会说一个好的程序架构啊,就是代码很紧凑、执行效率也很高。

其实这个说的很片面,不完全对,这只能说明你程序算法写的好,但架构不一定做的好。

即然是架构,那自然是以从”大局”为重,思维不能局限于当下的产品功能,还要考虑到以后功能的增加和裁剪,那么对于单片机开发来说,我认为一个好的程序架构至少要达到以下要求:

硬件层和应用层的程序代码分开,相互之间的控制和通讯使用接口,而且不会共享的全局变量或数组。

这里呢,我就这个要求,别小看这一个要求,因为这个要求里面蕴藏着很多学问的,比如用专业称为可移植性、可扩展性。

那么我们来想象一下我们通常写单片机代码的方式啊,在51的时候基本一个.c文件解决,包括寄存器配置啊,产品功能啊。

c语言中回调函数的使用方法及作用是什么

这种就是没有架构的程序,然后我们进化到STM32这个单片机以后,程序大了,慢慢也会在工程文件里加几个文件夹目录把硬件层和应用层代码分开了。

于是我们会把一些不同的外设功能,比如Led、按键、串口等外设功能代码分别写在不同的.c文件里,然后统一用函数接口去调用它。

c语言中回调函数的使用方法及作用是什么

比方说控制一个LED灯亮,直接在led.c文件里写一个驱动led灯状态的函数然后给外部调用就好了。

c语言中回调函数的使用方法及作用是什么

那我们我们看这种Led的控制函数确实也是满足程序架构的需求的,硬件层和应用层代码分开,应用层用硬件层提供的接口来控制,而且又不会有硬件层和应用层共享的全部变量或数组。像这种是不是很简单?

那么不知道你们有没有碰到另外一种情况,就是应用程序需要采集硬件层的数据,比如串口接收数据,按键采集、ADC值采集。

这种硬件层的数据怎么通知应用层来拿,或者怎么主动给它?

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

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

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

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

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

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

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

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

三、回调函数的作用

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

1.输出型

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

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

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

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

2.输入型

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

什么叫响应式的函数呢?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

c语言中回调函数的使用方法及作用是什么

从模块化编程的思想来看,整个工程分为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)头文件的函数指针定义说起,具体看下图。

c语言中回调函数的使用方法及作用是什么

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

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

c语言中回调函数的使用方法及作用是什么

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

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

c语言中回调函数的使用方法及作用是什么

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

c语言中回调函数的使用方法及作用是什么

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

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

c语言中回调函数的使用方法及作用是什么

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

这样调用后,我们key.c文件的pKeyScanCBS这个指针其实就是指向的KeyScanHandle函数。

也就是说执行pKeyScanCBS的时候,就是执行KeyScanHandle函数。

那具体检测按键的功能就是KeyPoll函数,这个在main函数里调用。

c语言中回调函数的使用方法及作用是什么

当检测到键盘有输入以后,最终会调用pKeyScanCBS。

最终执行的是main.c文件的KeyScanHandle函数。

所以,我们来看下输出结果。

c语言中回调函数的使用方法及作用是什么

如果还是有点模糊,下面我再给大家捋一捋编写和使用回调函数的流程:

  1. 自定义函数指针,形参作为硬件层要传到应用层的数据。

  2. 硬件层定义一个函数指针和函数指针注册函数。

  3. 应用层定义一个函数,返回值和形参都要和函数指针一致。

  4. 应用层调用函数指针注册函数,把定义好的函数名称作为形参传入。

Ok,这就是回调函数的使用。

如果还看不懂建议多看两遍。

“c语言中回调函数的使用方法及作用是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

c语言中回调函数的使用方法及作用是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

c语言中回调函数的使用方法及作用是什么

本篇内容介绍了“c语言中回调函数的使用方法及作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录前言一、通过这节课程你能掌握以下知识
2023-06-20

C语言函数调用的作用是什么

C语言函数调用的作用是将程序的执行过程分割成更小的可重用模块,提高代码的可读性和可维护性。函数调用可以将一组操作封装到一个函数中,并在需要时多次调用该函数,避免了重复编写相同的代码。此外,函数还可以将参数传递给函数,并返回结果,实现数据的传
2023-09-13

c语言调用子函数的方法是什么

在C语言中,调用子函数的方法可以通过以下步骤实现:1. 首先,在主函数或其他需要调用子函数的函数中,声明子函数的原型。原型包括子函数的返回类型、函数名和参数列表。```c// 子函数的原型返回类型 函数名(参数列表);```2. 然后,在主
2023-10-08

c语言子函数调用的方法是什么

在C语言中,可以使用以下两种方法调用子函数:1. 值传递(Call by Value):将实参的值复制给形参,子函数中对形参的修改不会影响实参的值。```c// 声明子函数void func(int);// 调用子函数int main()
2023-09-13

C语言的回调函数怎么使用

本篇内容主要讲解“C语言的回调函数怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的回调函数怎么使用”吧!对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级
2023-06-17

C语言函数的使用方法是什么

本文小编为大家详细介绍“C语言函数的使用方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言函数的使用方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、函数的嵌套调用在定义函数时,一个函数内
2023-06-30

c语言函数的递归调用方法是什么

C语言函数的递归调用方法是指在函数内部调用自身的过程。递归调用函数可以让程序重复执行相同的操作,直到满足某个条件才停止。递归调用函数通常包含两个部分:1. 基本情况(基线条件):定义递归函数停止的条件,当满足该条件时,递归函数不再执行自身,
2023-09-04

c语言函数的定义与调用方法是什么

C语言函数的定义和调用方法如下:1. 函数的定义:在C语言中,函数的定义包括函数的返回类型、函数名、参数列表和函数体。函数的定义一般写在main函数之前或者使用函数原型声明。函数定义的一般形式如下:返回类型 函数名(参数列表) {函数体}例
2023-08-18

C语言SetConsoleCursorPosition函数使用方法是什么

这篇文章给大家介绍C语言SetConsoleCursorPosition函数使用方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。函数接口BOOL WINAPI SetConsoleCursorPosition(
2023-06-21

c语言callback回调函数怎么使用

在C语言中,回调函数(callback)是一种函数指针,可以作为参数传递给其他函数,这样在调用该函数时,可以执行传递的回调函数。下面是一个简单的示例,展示了如何使用回调函数:首先,定义一个回调函数的原型。这个原型应该与你想要传递的回调函数的
2023-10-18

C语言GetStdHandle函数使用方法是什么

今天就跟大家聊聊有关C语言GetStdHandle函数使用方法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。函数的接口HANDLE WINAPI GetStdHandle(
2023-06-21

C语言SetConsoleCursorInfo函数使用方法是什么

本篇文章为大家展示了C语言SetConsoleCursorInfo函数使用方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。函数的接口BOOL WINAPI SetConsoleCursorI
2023-06-21

C语言的回调函数如何使用

这篇“C语言的回调函数如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言的回调函数如何使用”文章吧。1.程序架构一
2023-06-29

C语言断言函数assert()的使用方法是什么

本篇内容介绍了“C语言断言函数assert()的使用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  在C语言库函数中提供了一个辅
2023-06-25

C语言函数分类自定义参数及调用方法是什么

本篇内容主要讲解“C语言函数分类自定义参数及调用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言函数分类自定义参数及调用方法是什么”吧!1. 函数是什么?提到函数,我们最先想到的
2023-06-21

go语言调用函数方法是什么

在go语言中,定义了函数之后,我们可以通过“函数名()”的方式调用函数,语法“返回值变量列表 = 函数名(参数列表)”。当“()”中包含多个参数时,参数变量以逗号分隔,尾部无须以分号结尾;“返回值变量列表”中,多个返回值使用逗号分隔。
2023-05-14

c语言中sizeof函数的作用是什么

sizeof函数可以用来获取数据类型、变量或表达式的字节大小。它返回一个size_t类型的值,表示指定对象占用的字节数。sizeof函数在编译时计算,并且不会对表达式进行求值。通常用来在程序中确定数据类型的存储大小,例如用于动态内存分配、数
c语言中sizeof函数的作用是什么
2024-03-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录