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

目录
  • 1.程序架构
  • 2.回调函数的作用
  • 3.掌握回调函数的程序编写
  • 4.回调函数在产品中的应用

下文将学习到;

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

1.程序架构

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

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

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

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

2.回调函数的作用

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

回调函数的核心作用:

  • 把数据从一个.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语言回调函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言回调函数的简单运用

    目录 一.什么是回调函数 二.简单的回调函数 三.带参数的回调函数 一.什么是回调函数 因为在程序中,我们有很多的库函数,我们也有很多的上层函数,为了增加程序的灵活性,我们就将一些函数指针作为参数传递到函数里面去. 说的粗糙一点,就是将一个函数作为另一个函数的函数参数. 调用回调函数我们需要一个中间函数进行过渡. 这个中间函数的参数是一个函数指针. 二.简单的回调函数 我们来写一个简单的例子,帮助我们理解: #include <stdio.h> /*回调函数1*/ void callBack1

  • C语言中的回调函数实例

    在C语言中一般用typedef来为回调函数定义别名(参数名). 别名通过宏定义typedef来实现,不是简单的宏替换.可以用作同时声明指针型的多个对象. 比如: 复制代码 代码如下: char *pa,pb://pa是一个char型指针,但pb是一个char型字符.我们可以这样来实现typedef char* PCHAR:PCHAR pa,pb://pa和pb都是char型指针 先看一个回调函数的例子: 复制代码 代码如下: #include<stdio.h> //方法指针的格式为:int (

  • c语言中回调函数的使用以及实际作用详析

    目录 前言 一.通过这节课程你能掌握以下知识: 二.程序架构的核心理念和需求 三.回调函数的作用 1.输出型 2.输入型 四.掌握回调函数的程序编写 总结 前言 今天给大家讲一下芯片/模块厂家写SDK必须会使用的一种技术:回调函数. 回调函数这个知识点其实并不是很难,难是难在网上很多讲解回调函数的都说的太学术化了化了,一点也不亲民. 很多人即使知道怎么写回调函数也根本就搞不懂它们在实际产品中也有什么用,什么时候用. 所以这节课呢我们会以程序架构的需求为出发点,讲解回调函数是怎么满足它这个需求的.

  • 详解C语言编程中的函数指针以及函数回调

    函数指针: 就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数. 我们先来定义一个简单的函数: //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n"); } //声明一个函数 void easyFunc(); //调用函数 easyFunc(); //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n

  • 关于c语言中回调函数的理解

    前言 在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 这段话不是那么好理解,不同语言实现回调的方式有些许不同.其实可以这样理解,回调就是在一个函数中调用另外一个函数. 在c语言中,回调是使用函数指针来实现的. 函数指针--顾名思义,是指向一个函数的指针.通常函数指针有两个方面的用途,一个是转换表(jump table),另一个是作为参数传递给一个函数. 下面是两个函数指针的声明 int(*f)(i

  • C语言模块回调Lua函数的两种方法

    lua和C通过虚拟栈这种交互方式简单而又可靠,缺点就是C做栈平衡稍微会多写一点代码. 今天分享学到的C模块回调Lua函数的两种方法,都是炒冷饭,大侠勿喷. 1. C保存函数对象 C模块可以通过注册表保存Lua里面的对象,等适当时候取出再调用即可. 复制代码 代码如下: static int lua_callback = LUA_REFNIL; static int setnotify(lua_State *L) {   lua_callback = luaL_ref(L, LUA_REGISTR

  • C语言运用回调函数实现计算器

    本文实例为大家分享了C语言运用回调函数实现计算器的具体代码,供大家参考,具体内容如下 回调函数概念: 回调函数是一个通过函数指针调用的函数,也就是将函数的地址作为参数传递给另一个函数,当这个指针回来调用其指向的函数时,称为回调函数. 本次制作计算器的功能: 1.add -- 加法 2.sub -- 减法 3.mul -- 乘法 4.div -- 除法 0.exit -- 退出 具体来通过代码讲解: (1)首先写一个菜单函数,在运行程序时打印菜单 void menu() { printf("***

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

    目录 1.程序架构 2.回调函数的作用 3.掌握回调函数的程序编写 4.回调函数在产品中的应用 下文将学习到; 程序架构的核心理念和需求 掌握回调函数的作用 掌握回调函数的程序编写 掌握回调函数在产品中的应用 1.程序架构 一个好的程序架构至少要达到以下要求: 硬件层和应用层的程序代码分开,相互之间的控制和通讯使用接口,而且不会共享的全局变量或者数组. 用专业术语描述就是可移植性.可扩展性. 在51单片机写程序时,基本上一个.c文件解决,包括寄存器配置,产品功能.到了stm32时,我们会把不同的

  • C语言中回调函数的含义与使用场景详解(2)

    目录 详解C语言中回调函数的含义与使用场景(2) 使用场景一(重定义): 使用场景二(扩展函数功能): 使用场景三(分层): 总结 详解C语言中回调函数的含义与使用场景(2) 引言:在上一篇文章中介绍了回调函数的概念与使用方法,本节将深入地介绍回调函数典型的使用场景.通过使用回调函数可以实现驱动和应用程序的分离解耦,让程序更加地灵活.也可以借助回调函数实现插入自定义代码.分层设计程序的思想. 使用场景一(重定义): 在统一的接口中,动态地改变一个函数的功能.该函数的功能可以是加载参数.或者执行运

  • C语言中回调函数和qsort函数的用法详解

    目录 回调函数 指向函数指针数组的指针 qsort(qulick sort)-库函数 回调函数 通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数. 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应. 举例: #include<stdio.h> void menu() { printf("*************************

  • C语言中回调函数的含义与使用场景详解

    目录 举例 动态改变回调函数的实现的方法: 1)编译时直接赋值 2)运行时实现动态注册 3)作为函数参数传递到指定的函数内 总结 举例 在下述程序中函数 test2_cal() 中调用 函数指针 s_cal 指定的函数执行数值的计算.则 s_cal 指定的那些函数就可以看作一个回调函数. typedef int (*my_calculate_t)(int a, int b); static int cal_sum(int a, int b) { printf("now is sum\r\n&qu

  • Go语言中的字符串拼接方法详情

    目录 1.string类型 2.strings包 2.1 strings.Builder类型 2.2 strings.Reader类型 3.bytes.Buffer 3.1 bytes.Buffer:写数据 3.2 bytes.Buffer:读数据 4.字符串拼接 4.1 直接相加 4.2strings.Builder 4.3 strings.Join() 4.4 bytes.Buffer 4.5 append方法 4.6 fmt.Sprintf 5.字符串拼接性能测试 1.string类型 s

  • C++中回调函数及函数指针的实例详解

    C++中回调函数及函数指针的实例详解 如何获取到类中函数指针 实现代码: //A类与B类的定义 class A { public: void Test() { cout << "A::Test()" << endl; } }; class B : public A { public: void Test() { cout << "B::Test()" << endl; } }; //定义类的成员函数指针 typedef

  • 对js中回调函数的一些看法

    最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框架也会越来越火爆了,做js的也越来越有前途.我也决定从后端开发渐渐向前端开发和手机端开发靠拢,废话不说了,我们来切入正题"js的回调函数"相关的东西. 说起回调函数,好多人虽然知道意思,但是还是一知半解.至于怎么用,还是有点糊涂.网上的一些

  • Go语言中普通函数与方法的区别分析

    本文实例分析了Go语言中普通函数与方法的区别.分享给大家供大家参考.具体分析如下: 1.对于普通函数,接收者为值类型时,不能将指针类型的数据直接传递,反之亦然. 2.对于方法(如struct的方法),接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以. 以下为简单示例: 复制代码 代码如下: package structTest    //普通函数与方法的区别(在接收者分别为值类型和指针类型的时候)  //Date:2014-4-3 10:00:07    import ( 

随机推荐