第一步:在protocol.h文件下自定一个函数指针类型pUart_transmit_output。
第二步:在protocol.c定义一个函数指针变量Uart_transmit_outputCBS。
第三步:修改protocol.c文件下uart_transmit_output函数,直接调用刚刚定义的函数指针变量Uart_transmit_outputCBS,记住调用前,必须要指针不为空的条件判断,否则,如果指针调用前没正确指向,会造成指针异常,程序死机。
第四步:在protocol.c文件下编写Uart_transmit_outputCBS函数指针的注册函数,也就是让这个函数指针变量指向一个地址的函数接口。
为什么要单独写个函数呢?因为我们理想的情况下,是提供函数接口,给别的.c文件调用,而不是用全局变量的形式。
第五步:别忘记在protocol.h文件下声明下Uart_transmit_outputCBSRegister函数,否则别的.c文件无法调用这个函数。
第六步:在我们单片机串口驱动文件hal_usart.c的初始化函数hal_UsartInit里面调用Uart_transmit_outputCBSRegister函数,然后把hal_Wifi_SendByte函数地址作为形参传递进去。
当然,在此之前别忘记在hal_usart.c文件的开头include SDK相关头文件。
最终分析:这样操作完以后,结果会是怎样?
Protocol.c文件下,调用uart_transmit_outputCBS函数指针时,是不是等同于调用hal_usart.c的hal_Wifi_SendByte函数?
这就是函数指针的作用,这样就能实现,客户不修改SDK代码,SDK也能调用客户工程下.c文件里的函数了。
这些技巧不复杂,就像纱窗,有人指点一下,很快就捅破了,没人指点,可能很多年都领悟不了,这也是进阶架构师必须要掌握的技巧。
|