订阅

首页

函数指针有啥用?用它有啥好处?看完即懂!

面包芯语 2023-08-03 18:48:12

你点击蓝字关注,回复“入门资料”获取单片机入门到高级开挂教程

开发板带你入门,我们带你飞


(资料图)

文 |无际(微信:603311638)

全文约1323字,阅读大约需要5-10分钟

很久没写烧脑文了,今天来写一篇。

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

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

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

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

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

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

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

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

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

Hal_Wifi_SendByte函数是STM32的串口发送一个字节函数。

我们要把这个函数放到涂鸦云SDK protocol.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文件下自定一个函数指针类型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文件里的函数了。

这些技巧不复杂,就像纱窗,有人指点一下,很快就捅破了,没人指点,可能很多年都领悟不了,这也是进阶架构师必须要掌握的技巧。

end

下面是更多无际原创的个人成长经历、行业经验、技术干货。

1.电子工程师是怎样的成长之路?10年5000字总结

2.如何快速看懂别人的代码和思维

3.单片机开发项目全局变量太多怎么管理?

4.C语言开发单片机为什么大多数都采用全局变量的形式?

5.单片机怎么实现模块化编程?实用程度让人发指!

6.c语言回调函数的使用及实际作用详解

7.手把手教你c语言队列实现代码,通俗易懂超详细!

8.c语言指针用法详解,通俗易懂超详细!

相关稿件

最近更新

函数指针有啥用?用它有啥好处?看完即懂!

38.18亿+2.5万㎡现房销售 湖州中石竞得大兴三合庄地块

美芯片巨头高通手机收入大跌、被迫裁员

长华化学龙虎榜:4家机构进卖出前5 净卖出共2737万元

天府融媒看大运|记者对话大运会金牌得主宋布寒:希望有机会出征奥运会,为国争光!

南京1912酒吧排名(南京1912酒吧)

舜禹股份:我们会密切关注灾区的灾情,如有需要我们将提供必要的技术和设备支持

欧陆通:如有涉及应披露的事项,公司将严格按照相关监管规则及时履行信息披露义务

雅克科技:公司Low-α球形硅微粉产线已经建设完成,产品主要应用于集成电路封装领域

万胜智能:公司目前暂无超导方面研究

汤臣倍健:公司围绕消费者健康业务,以膳食营养补充剂为核心,不断为用户健康创造价值

奋达科技:鉴于合作项目执行完毕,公司目前与H在智能穿戴领域未有业务往来,主要在智能锁方面有合作

9.9元咖啡杀疯了!星巴克回应被瑞幸首次“反超”:欢迎竞争

公安部:全面放宽大城市落户条件

俄罗斯对外国设备加强“安全评估”,苹果等公司被纳入审查范围

nhrvs2*2.5是什么线(nh rvs 2 1 5是什么线)

吉林省气象台8月3日11时0分发布强对流天气蓝色预警

中国石化页岩气勘探获突破

海融科技(300915)8月3日主力资金净买入578.08万元

淋雨后怎么“补救”?中医提倡7个「热办法」

雪迪龙:目前台风对公司生产经营没有影响

威腾电气: 公司目前没有产品应用在超导行业。未来如有相关计划,公司将会按照规定履行信息披露义务

万顺新材:公司高阻隔膜、铝箔产品均已应用于食品包装

新北洋:截至2023年上半年,新北洋运营的在营点位数量已超过5000个

东方嘉盛:送股后的股东人数和财务数据请见公司2023年半年度报告

舒华体育: 目前公司生产经营有序进行,本次台风未对公司造成重大不利影响

中国石化页岩气勘探获突破

注意!节能国祯将于8月28日召开股东大会

多主力现身龙虎榜,苏州规划上涨3.61%(08-03)

直击涿州洪水第一线:百人被困建筑工地