请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

宋宝华:Linux内核编程广泛使用的前向声明

[复制链接]
查看: 20|回复: 0

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
39490
发表于 2020-1-19 16:04 | 显示全部楼层 |阅读模式
前向声明

先夸大一点:在统统大要的场景,尽大要天时用前向声明(Forward Declaration)。这合适信息匿伏的原则。
一个例子

那末前向声明究竟是个什么鬼?在内核写代码和看代码的童鞋,经常发现Linux内核里面充溢着这样的代码,比如
include/vim linux/regulator/driver.h
文件中:
宋宝华:Linux内核编程广泛使用的前向声明  区块链


宋宝华:Linux内核编程广泛使用的前向声明  区块链


我们以regmap这个结构体为例,这个地方就是一个前向声明,告诉背面的代码regmap是个结构体,至于这个结构体里面有什么鬼,不晓得!
Linux可以说满全国都在利用这个结构体。满全国都在利用声明在include/linux/regmap.h中的regmap_write()、regmap_read()这样的API,可以说无处不在,无处不用,比如drivers/rtc/rtc-at91sam9.c中的:
宋宝华:Linux内核编程广泛使用的前向声明  区块链


宋宝华:Linux内核编程广泛使用的前向声明  区块链


宋宝华:Linux内核编程广泛使用的前向声明  区块链


这样做带来的一个极大好处是,drivers/base/regmap/内部的全国底子不需要晓得regmap结构体长成什么样子,由于没人需要晓得,它们都只是在拜候regmap的指针!
而drivers/base/regmap/内部不管怎样点窜regmap结构体的实现和成员自己,对内部的全国底子不偏见,点窜regmap结构体后,drivers/base/regmap/之外的模块都不需要重新编译!
相反,假如我们间接把regmap结构体的内部细节袒露在include/linux/regmap.h这个头文件中,那末由于这个头文件满全国都被援用,你只要点窜regmap结构体自己,就会致使内核无数模块的增量编译!
include/linux/regmap.h中袒露了regmap_config结构体,这分析这个结构体的内容需要被regmap之外的模块晓得:


宋宝华:Linux内核编程广泛使用的前向声明  区块链




...
为什么,它触及到具体的寄存器是怎样读写的callback以及具体的寄存器pattern,这必定是一个API底子的工具,自己就应当是跨模块的工具,所以它的长相出现在了include/linux/regmap.h这个顶级头文件中。
对于一个内部模块而言,它只需要可以大要经过regmap.h公然袒露的小部分寄存器设备接口,来经过类似regmap_init_mmio()这个的API来加添regmap结构体的内部实现。比如drivers/rtc/rtc-at91sam9.c中的:


宋宝华:Linux内核编程广泛使用的前向声明  区块链






上述代码中,rtc->gpbr是一个struct regmap指针,regmap_init_mmio()在内部加添了regmap的自己实现。以后drivers/rtc/rtc-at91sam9.c再挪用regmap_write()、regmap_read()的时候,这些API从regmap模块内部挪用我们加添进去的reg_bits、val_bits、reg_stride这些寄存器pattern,帮助完成寄存器的终极读写。
画一幅图

理清关系


宋宝华:Linux内核编程广泛使用的前向声明  区块链




永久用高内聚和低耦合的脑筋计划代码。Linux内核2000万行的代码,不这么计划必定要崩盘。写代码不是轻易偷生。特别做单片机写裸奔步伐的童鞋要出格留意,你们常常以为玩Linux的童鞋代码一层层套很傻逼,这是完全不切确的大白。


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 如何炒外汇入门_外汇交易_外汇交易平台_外汇学习培训-【518外汇网】 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表