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. 暂时只想到这些,后面用更好的应用会继续更新。
posted @ 2019-06-13 10:12  BakuBoy  阅读(249)  评论(0编辑  收藏  举报