关于linux设备驱动是否使用全局变量的问题-创新互联

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

我的新的更多优惠的打包课程链接如下:
https://edu.51cto.com/sd/0a9d4

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:关于linux设备驱动是否使用全局变量的问题-创新互联
本文地址:http://pwwzsj.com/article/icgdp.html