含有函数指针的结构体好处
//------------------- 现在的做法--------------------------------
//-------------------led灯结构体定义----------------------------
typedef struct {
int (* initialize)(void);
}LED_T;
//------------------led灯变量定义 全局变量----------------------------
LED_T led = {
.initialize = initialize
};
/* 错误代码
LED_T led ;
led.initialize = initialize; //全局变量只能 在函数体外部初始化 而不能重新赋值
*/
//-------------------initilize函数定义-------------------------------
static int initialize(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE); //ͨÓÃʱ ÐèÒªÐÞ¸Ä
initialize_led(LED1_GPIO, LED1_PIN);
initialize_led(LED2_GPIO, LED2_PIN);
initialize_led(LED3_GPIO, LED3_PIN);
return 0;
}
//----------------主函数的调用---------------------------------
int main(void)
{
led.initialize();
while(1){
}
}
//----------------分割线,以前的做法----------------------------------
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
总结:过去写初始化注重函数功能的实现,而没有将LED这样一个简单的外设包括在一起的想法。现在通过结构体的定义,我们不仅可以将针对led的外设的行为通过结构里面的函数指针囊括起来,而且这样我们 看待led 看见的 就是一个整体,而且led可以完成 很多功能。