在学习C语言语法时,学到一个函数指针。就是用指针指向一个函数(实质函数就是一个地址)。而后经过指针来调用该函数。当时学完以后一脸懵逼,不是不明白原理,而是不知道有什么用?直接调用不就能够了吗?何须多费功夫去搞这些花里胡哨的东西。函数
后面发现,这个函数指针也是有应用的场景的!学习
在我开发时,遇到这样一个问题。ui
IIC协议既能够用模拟也能够用硬件自带的。这样就有一个问题,有些芯片我以为硬件IIC并很差用,我想用模拟的。但这些切换就比较麻烦。全部IIC设备调用的函数都要修改一遍(C语言不支持同名函数)。这样就比较麻烦了。用宏定义吧,就显得代码臃肿,每一个调用的地方都须要#if...#else...#endif。指针
这时,我想到了函数指针。我须要用模拟IIC时,就指向模拟IIC的函数。须要硬件IIC时,就指向硬件IIC的函数。这样不就能够了吗?赶忙去试一下!code
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主机模式也作成这种方式。class