查看: 3509|回复: 7

嵌入式C编程经验 之 函数指针

[复制链接]
  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-6 14:54:41 | 显示全部楼层 |阅读模式
    分享到:

    /***********************************************************************************
    * Filename: 一线研发之声:嵌入式C编程经验 之 函数指针
    * Author:SedateFire
    * E-mail:SedateFire@126.com
    * Version:1.0
    * Modify Date: 2012-01-12
    * key: 嵌入式 函数指针 回调函数
    * 本文首发: 环球资源-电子工程专辑-博客: 静心斋
    ***********************************************************************************/
          今天讨论什么呢,就讨论函数指针吧
           指针,在C语言中,是一个神圣的存在,可远观不可亵玩焉。函数指针,则是指针里面更让人敬畏的存在。
          如果你是一个单片机工作者,那么我猜测你八成忘记了函数指针如何定义,我几乎可以想象出你苦苦思索的神态了。
          如果你是一个linux底层驱动工作者,那么显然你要感叹造物住的神奇,函数指针竟是如此的遍地开花。尤其是linux 2.6以后的内核版本,你几乎要被指针晃花眼睛了,没有2年工作经验你都很难找到函数的原型定义在哪里。linux内核是一个高度抽象的世界,它把所有外设都视为文件,这一切,函数指针功不可没。
          前者太遥远,因为单片机基本上无法应用函数指针。比如Keil C51,函数指针是非常危险的,因为编译器不知道你这个指针要指向那个函数,也就无法分析分配每个局部变量。额...那个静态编译懂吗?用一句形象的话为君解惑,对于静态编译,每个变量(含局部)它的地址都是恒定不变的,但不是唯一的哦。C51的栈,只用来存储函数返回地址。当然,特殊的递归编译不在讨论范围之内。所以,单片机程序和函数指针基本绝缘。只有一个途径可以用函数指针,那就是在编译阶段就告诉编译器这个函数指针的对象,且那个函数必须是有定义的,存在的。
         static const void (*function_pointer)(void) = function_exist;
         如果你的单片机程序中,有一个很大的很有规律的类似switch的写法,那么可以改写成静态函数指针数组,用查表方式,无论是可阅读性,还是程序效率,都颇有可道之处。如果不告诉编译器函数指针的对象,那你就完蛋了,程序也许能跑,但bug是莫名其妙的,没有任何逻辑的。如果你说那样干没有问题,那我也不争辩,只盼你能买几张彩票送我。



          linux当中的函数指针,那是锣鼓喧天鞭炮齐鸣红旗招展人山人海啊~~。基本上只要是结构体,里面都必有一个函数指针,而且是一层嵌套一层地层层抽象上去,还有一堆令人头皮发麻的void *无类型指针,指针和变量齐飞,代码共数据一色。所以,高薪不是没有依据的。随着android的迅猛发展,大家接触linux内核的机会也会越来越多。



          当然多数人没那么好运的,我们说点实际点的,M0/M3平台。这个平台是很适用函数指针的,因为它是压栈式的编译方式。它最广泛的应用是回调函数,就我个人体会来讲,回调函数主要是为了分层清晰和模块化而存在的。我底层想传递消息给顶层,但又不好直接调用顶层函数,于是就用函数指针这种暗度陈仓的方式。有人说,直接调用不就得了,搞什么虚文。问题是顶层随时可能换,函数名也会变,到时候移植起来发现,顶层和底层盘根错节,相互依赖,那是很痛苦的。顶层对底层说,小兄弟,这个事情你先做,有什么情况你就打电话给我,剩下的我来处理。底层含着眼泪对顶层说,哥,你别说了,你还是先把电话号码给我吧,您干嘛老换号码啊。这个记录电话的媒介,就是回调函数指针。
              回调之妙,食髓知味。
    夜了,闪人先,期待本文1.1版吧,呵呵

    点评

    点个赞  发表于 2015-8-10 01:49

    评分

    参与人数 1与非币 +5 收起 理由
    loveeeboard + 5 三周年铜板双倍!

    查看全部评分

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-6 14:55:24 | 显示全部楼层
    每天发帖到   一定数量   不给铜板?、
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-11-17 13:26
  • 签到天数: 410 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-6 15:44:20 | 显示全部楼层
    非干货的赶脚。。。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 23:48
  • 签到天数: 214 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2015-8-6 19:20:21 | 显示全部楼层
    哈哈,,刷铜板的节奏u
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2018-3-28 17:24
  • 签到天数: 276 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-8-6 19:46:09 | 显示全部楼层
    蒲公英╯ 发表于 2015-8-6 19:20
    哈哈,,刷铜板的节奏u

                            
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-3-9 16:16
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2015-8-7 08:51:40 | 显示全部楼层
    #define 发表于 2015-8-6 14:55
    每天发帖到   一定数量   不给铜板?、

    请看积分规则https://www.cirmall.com/bbs/home ... =credit&op=rule
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-8-11 13:15:53 | 显示全部楼层
    谢谢分享。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-22 00:48
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2017-5-29 07:11:42 | 显示全部楼层
    最爱的是有铜板的网!早上好。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 17:47 , Processed in 0.197683 second(s), 30 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.