服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言中回调函数的使用详情

C语言中回调函数的使用详情

2022-10-13 13:39Embedded learner C/C++

这篇文章主要介绍了C语言中回调函数的使用详情,阅读下文我们将学习到架构的核心理念和需、回调函数的作用、回调函数的程序编写等内容,需要的小伙伴可以参考一下

下文将学习到;

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

1.程序架构

一个好的程序架构至少要达到以下要求:

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

用专业术语描述就是可移植性、可扩展性。

在51单片机写程序时,基本上一个.c文件解决,包括寄存器配置,产品功能。到了stm32时,我们会把不同的外设功能,比如led,按键,串口等外设功能代码分别写在不同的.c文件里,然后统一用函数接口去调用它,比方说控制一个LED灯亮,直接在led.c文件里写一个驱动led灯状态的函数然后给外部调用就好了。硬件层和应用层代码分开,应用层用硬件层提供的接口来控制,而且不会有硬件层和应用层共享的全部变量或数组。
还有一种情况,应用程序需要收集硬件层的数据,比如串口接收数据,按键采集,adc值采集,这种值应该怎么样从硬件层获取呢?
简单的方法就是用全局变量或者数组,比方说硬件层串口接收到数据了,那么我们把数据丢到数组里面,然后把接收完成的全局变量标志置为1,比方说全局变量名为RcvFlag,然后应用层程序会轮询判断RcvFlag==1?是的话就把数组里面的数据取出来解析。
但是这种方法存在实时性差和移植性差的问题,比如说需要把串口的硬件层封装起来给客户使用,不能让客户看到实现的源码,只能提供函数接口给客户使用,不可能通过告诉客户先判断哪个变量为1,然后在取哪个数组中的数据这种做法。
在这里就需要回调函数了。

2.回调函数的作用

在stm32中,像外部中断、定时器中断、串口中断都有点类似回调函数,这种函数的目的是把采集到的数据传递给cpu使用。

C语言中回调函数的使用详情

回调函数的核心作用:

  • 把数据从一个.c文件传递到另一个.c文件。

 

3.掌握回调函数的程序编写

传统写法的缺点:

  • 1、移植性差
  • 2、实时性差
  • 3、功能代码封装难

回调函数写法:

main.c代码:

#include <stdio.h>
#include "key.h" 

void KeyScanHandle(KEY_ID_TYPEDEF KeyID,KEY_STATE_TYPEDEF KeyState)
{
//    if(KeyID == KEY2)
//    {
//        if(KeyState = KEY_PRESS)
//        {
            
            printf("KeyID=%d, KeyState=%d\r\n",KeyID,KeyState);
//        }
//    }
}

int main(int argc, char *argv[])
{
    KeyInit();
    KeyScanCBSRegister(KeyScanHandle);
    KeyPoll();
 
    return 0;
}

key.c代码:

#include "key.h"

KEY_ID_TYPEDEF keyVal;    //按键ID
KEY_STATE_TYPEDEF keyState;    

pKeyScanCallBack pKeyScanCBS;

void KeyInit()
{
    keyVal = 0;
    keyState = KEY_IDLE;
    pKeyScanCBS = 0;
} 

void KeyScanCBSRegister(pKeyScanCallBack pCBS)
{
    if(pKeyScanCBS == 0)
    {
        pKeyScanCBS = pCBS;
    }
}

void KeyPoll()
{
    printf("Please Enter key value:");
    if(scanf("%d",&keyVal)==1)
    {
        printf("\r\n");
        printf("Please enter key state:");
        if(scanf("%d",&keyState)==1)
        {
            if(pKeyScanCBS != 0)
            {
                pKeyScanCBS(keyVal,keyState);
            }
        }        
    }
}

key.h代码:

#ifndef _KEY_H_
#define _KEY_H_
typedef enum 
{
    KEY1,
    KEY2,    
}KEY_ID_TYPEDEF;

typedef enum
{
    KEY_IDLE,    //空闲 
    KEY_PRESS,    //按键短按
    KEY_LONG_PRESS,    //按键长按
    KEY_RELEASE,//按键释放
 
}KEY_STATE_TYPEDEF; 

typedef void (*pKeyScanCallBack)(KEY_ID_TYPEDEF KeyID,KEY_STATE_TYPEDEF KeyState);
 
void KeyInit();
void KeyPoll();
void KeyScanCBSRegister(pKeyScanCallBack pCBS);
#endif

 

4.回调函数在产品中的应用

C语言中回调函数的使用详情

C语言中回调函数的使用详情

C语言中回调函数的使用详情

C语言中回调函数的使用详情

根据收到的不同帧内容,做出不同的功能

到此这篇关于C语言中回调函数的使用详情的文章就介绍到这了,更多相关C语言回调函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_44795447/article/details/123226449

延伸 · 阅读

精彩推荐
  • C/C++Qt实现数据导出到xls的示例代码

    Qt实现数据导出到xls的示例代码

    导入导出数据到csv由于语法简单,适用场景有限,于是本文将为大家介绍Qt如何实现导出数据到xls,感兴趣的小伙伴可以跟随小编一起试一试...

    feiyangqingyun3472022-08-17
  • C/C++C语言 联合(union)用法案例详解

    C语言 联合(union)用法案例详解

    这篇文章主要介绍了C语言 联合(union)用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    时光漫走6152021-12-23
  • C/C++vscode 安装go第三方扩展包填坑记录的详细教程

    vscode 安装go第三方扩展包填坑记录的详细教程

    这篇文章主要介绍了vscode 安装go第三方扩展包填坑记录,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需...

    风子杨yxf7714982021-09-06
  • C/C++深入C/C++浮点数在内存中的存储方式详解

    深入C/C++浮点数在内存中的存储方式详解

    本篇文章是对C/C++浮点数在内存中的存储方式进行了详细的分析介绍,需要的朋友参考下...

    C++教程网3542020-12-07
  • C/C++c++用指针交换数组的实例讲解

    c++用指针交换数组的实例讲解

    下面小编就为大家分享一篇c++用指针交换数组的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    月炼4132021-06-10
  • C/C++C++实现LeetCode(42.收集雨水)

    C++实现LeetCode(42.收集雨水)

    这篇文章主要介绍了C++实现LeetCode(42.收集雨水),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang7932021-11-24
  • C/C++C++对象排序的比较你了解吗

    C++对象排序的比较你了解吗

    这篇文章主要为大家详细介绍了C++对象排序的比较,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你...

    诺谦4602022-10-08
  • C/C++基于C语言中段错误的问题详解

    基于C语言中段错误的问题详解

    本篇文章是对C语言中段错误的问题进行了详细的分析介绍,需要的朋友参考下...

    C语言教程网3882020-11-29