函数指针有啥用?有啥意义_第1页
函数指针有啥用?有啥意义_第2页
函数指针有啥用?有啥意义_第3页
函数指针有啥用?有啥意义_第4页
函数指针有啥用?有啥意义_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页函数指针有啥用?有啥意义?很久没写烧脑文了,今天来写一篇。

说来奇怪,昨晚睡觉前,突然在想一个问题:函数指针有啥用?有啥意义?

起源是之前有个学员问我这个问题,但是感觉当时回答得不是特别好。

有些东西就是这样,自己知道该怎么用,用在哪,但如果一下子让我很通俗易懂地表达出来,脑子就卡壳了。

昨晚夜深人静,我想到了正好我们wifi报警主机那个项目有个例子,非常适合去深刻理解。

这个项目我们对接的是涂鸦云平台,然后涂鸦云提供(SD)K,我们需要移植到我们自己的项目里去。

在移植的过程中,我们需要去更改他们SDK里面的代码,我觉得这点是可以优化的。

下面给大家举一个具体的例子:

比如我们使用的涂鸦云提供的WiFi模组,通过串口和我们(单片机)连接,有一个通讯协议,但是涂鸦云帮我们做好了这个通讯协议的代码,所以会提供一个SDK给我们。

我们在使用SDK的时候,需要修改SDK的代码,把我们这款单片机的串口发送一个字节的函数,移植到SDK里面去。

Hal_Wifi_SendBy(te)函数是(STM32)的串口发送一个字节函数。

我们要把这个函数放到涂鸦云SDKprotocol.c文件的usart_transmit_output函数里面去。

最终SDK是调用usart_transmit_output函数实现串口数据流发送功能。

Ok,我们现在思考一下,这种方式有什么问题?如何解决?

问题1:

如果采用这种方式,有一种功能实现不了,就是假设涂鸦云这个SDK要封库(lib文件),源码不开放,我们就没法把Hal_Wifi_SendByte放到protocol.c文件的usart_transmit_output函数里面去。

是不是会有这个问题?这意味着,protocol.c必须开源,但是很多企业有一些核心代码,是商业机密,不能开放的,比如做导航的地图数据库。

问题2:

客户的技术水平层次不齐,如果有些基础稍微差点的,把SDK改乱了,这样会增加涂鸦云技术支持的人工成本。

所以,如果我去做,最理想的是不让客户改SDK的任何代码,你就直接按照我的方法和流程,调用函数用。

怎么解决这个问题?那就必须要用函数指针了!记住,是必须!

第一步:在protocol.h文件下自定一个函数指针类型p(Uart)_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_Usar(tI)nit里面调用Uart_transmit_outputCBSRegister函数,然后把hal_Wifi_SendByte函数地址作为形参传递进去。

当然,在此之前别忘记在hal_usart.c文件的开头includeSDK相关头文件。

最终分析:这样操作完以后,结果会是怎样?

Protocol.c文件下,调用uart_transmit_outputCBS函数指针时,是不是等同于调用hal_usart.c的hal_Wifi_SendByte函数?

这就是函数指针的作用,这样就能实现,客户不修改SDK代

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论