其实在一般的单片机软件开发过程中,函数指针应该不是特别常用的知识点。但是如果掌握了函数指针,一定程度上可以简化代码,使代码更加整洁。比如单片机要通过两路I2C访问两个器件(用了两路I2C,两路I2C的SCL引脚和SDA引脚已经固定),用到两个函数:
int16_t Get_Device1_Info(uint8_t slaveAddr, uint8_t Comcode); int16_t Get_Device2_Info(uint8_t slaveAddr, uint8_t Comcode);
这两个函数可以获取到两个设备的信息,得到相关的数据后需要进行相关的处理,而且数据的处理过程刚好是相同的,按照一般的思路就是:
void Get_Infomation(uint8_t Device,uint8_t slaveAddr, uint8_t Comcode) {
int16_t temp; if(Device == 1) { temp = Get_Device1_Info(slaveAddr, Comcode); ....../*相关的数据处理,假设有1000行代码*/ } else if(Device == 2) { temp = Get_Device1_Info(slaveAddr, Comcode); ....../*相关的数据处理,假设有1000行代码*/ } }
那么,如果相关的数据处理函数非常复杂,而且设备不止两个而是好几个,那么这整个函数就会显得特别的冗杂,这个时候使用函数指针就可以极大的简化代码了:
void Get_Infomation(uint8_t Device,uint8_t slaveAddr, uint8_t Comcode) { int16_t (*Func)(uint8_t ,uint8_t ); //定义一个函数指针 if(Device == 1) { Func = Get_Device1_Info; } else if(Device == 2) { Func = Get_Device2_Info; } temp = Func(slaveAddr, Comcode); ....../*相关的数据处理,假设有1000行代码*/ }
最直观的表现就是原来的代码可能有2000+行,有了函数指针之后可以缩减到1000+行,当然它的好处不仅仅这么多,如果大家有什么想法,可以畅所欲言!