加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

关于linux设备驱动是否使用全局变量的问题

发布时间:2020-12-14 01:16:20 所属栏目:Linux 来源:网络整理
导读:关于linux设备驱动是否使用全局变量的问题 今天有人问我,关于linux设备驱动是否使用全局变量的问题,为什么说尽量不使用全局变量? 其实这个问题从两方面说: 1)使用全局变量,那么破坏了函数的重入性,为了实现函数重入,又不得不使用锁来保护全局变量。
关于linux设备驱动是否使用全局变量的问题

今天有人问我,关于linux设备驱动是否使用全局变量的问题,为什么说尽量不使用全局变量?

其实这个问题从两方面说:
1)使用全局变量,那么破坏了函数的重入性,为了实现函数重入,又不得不使用锁来保护全局变量。这个效率变得低下了。
函数重入,主要是使用局部变量,即变量放在线程的栈中,各自使用自己的,就不会冲突。另外一种是使用锁来保护,保证数据的完整性。

2)使用全局变量,那么就违背了linux驱动的编写原则。即一个驱动程序应该支持驱动多个设备同时工作。例如马达,一个马达驱动程序可能同时操作多个马达,多个轴的方向转动,一个马达控制一个轴向,例如x轴,y轴,z轴。 如果驱动程序里使用全局变量来保存设备信息,那么没法做到同时支持保存多个设备信息了。如果使用链表方式,一个链表节点保存一个设备信息,虽然可行,但是每次内核操作你的驱动的api时传入的struct device(例如struct i2c_client,内含了struct device),你不得不遍历链表并比较对象指针才能找到操作的设备的信息。显然效率低。

所以其实正确的方法是:
在probe时,分配一个私有结构体作为保存此设备的状态信息。然后调用dev_set_drvdata系列函数,把你分配的结构体和probe时传入的struct device进行绑定。 struct device是总线驱动在探查到新设备插入时创建的。
后面系统调用你的驱动的api函数时,传入的struct device,你通过dev_get_drvdata系列函数取回你的为此设备分配的私有结构体(内含具体设备的状态信息,例如i2c地址等),从而知道是操作哪个具体设备。

具体请参考我的《linux设备驱动模型》视频,
https://edu.51cto.com/course/17159.html
还有我的《如何编写设备驱动》或《深入linux内核》视频
https://edu.51cto.com/course/17132.html
https://edu.51cto.com/course/17155.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读