码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2019-05-10 17:59:36      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:课程   lin   cli   cto   状态   模型   发布   调用   地址   

关于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

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

标签:课程   lin   cli   cto   状态   模型   发布   调用   地址   

原文地址:https://blog.51cto.com/8906847/2392408

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!