zoukankan      html  css  js  c++  java
  • Cortex-M3开发经验(一):函数指针的应用

    Cortex-M3开发经验(一):函数指针的应用

    在学习C语言语法时,学到一个函数指针。就是用指针指向一个函数(实质函数就是一个地址)。然后通过指针来调用该函数。当时学完之后一脸懵逼,不是不明白原理,而是不知道有什么用?直接调用不就可以了吗?何必多费功夫去搞这些花里胡哨的东西。

    后面发现,这个函数指针也是有应用的场景的!

    模拟IIC与硬件IIC的调用

    在我开发时,遇到这样一个问题。

    IIC协议既可以用模拟也可以用硬件自带的。这样就有一个问题,有些芯片我觉得硬件IIC并不好用,我想用模拟的。但这些切换就比较麻烦。所有IIC设备调用的函数都要修改一遍(C语言不支持同名函数)。这样就比较麻烦了。用宏定义吧,就显得代码臃肿,每个调用的地方都需要#if...#else...#endif。

    这时,我想到了函数指针。我需要用模拟IIC时,就指向模拟IIC的函数。需要硬件IIC时,就指向硬件IIC的函数。这样不就可以了吗?赶紧去试一下!

    typedef uint8_t (IIC_SEND)(uint8_t, uint8_t, uint8_t);
    typedef uint8_t (IIC_READ)(uint8_t, uint8_t, uint8_t);
    
    uint8_t Simulate_iic_send(uint8_t addr, uint8_t wbuffer, uint8_t length)
    {
        //模拟IIC发送时序
    }
    
    uint8_t Hardware_iic_send(uint8_t addr, uint8_t wbuffer, uint8_t length)
    {
        //硬件IIC发送实现
    }
    
    
    IIC_SEND fiic_send = Simulate_iic_send;
    IIC_SEND fiic_send = Hardware_iic_send;
    

    这样的话,我就可以在初始化时,确认使用的是硬件IIC还是模拟IIC。实际上可以在运行中修改指针,切换不同模式(然而没必要)。

    延伸:或者我们可以吧IIC从机模式,IIC主机模式也做成这种方式。

    总结

    1. 函数指针可以用在不确定需要调用函数的场合,修改指针指向即可。
    2. 函数指针让代码移植性更方便。在例子中,我们只需要改变函数实现即可,应用层只是调用指针。
    3. 暂时只想到这些,后面用更好的应用会继续更新。
  • 相关阅读:
    golang IO 流抽象与应用
    postman中 form-data、x-www-form-urlencoded、raw、binary的区别
    golang net/http 包
    MySQL高性能优化系列
    Win10系统中VirtualBox桥接时找不到网卡的问题
    Golang中下划线的使用
    pandas 基础操作 更新
    pandas 基础
    机器学习-树模型理论(GDBT,xgboost,lightBoost,随机森林)
    GBDT 详解分析 转+整理
  • 原文地址:https://www.cnblogs.com/Oushangrong/p/11014528.html
Copyright © 2011-2022 走看看