陈奇网络工作室

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

系统运输

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

今天,有人提出了关于linux设备驱动程序是否使用全局变量的问题。 你为什么说尽量不使用全局变量?

其实这个问题从两个方面说:

1 )使用全局变量会破坏函数的可重新输入性,必须使用锁来保护全局变量以实现函数的重新输入。 这变得没有效率了。

函数的重新输入主要使用局部变量。 这意味着变量将放在线程的堆栈中,如果每个线程都使用自己的东西,则不会发生冲突。 另一种是使用锁进行保护,保证数据的完整性。

2 )使用全局变量会违背linux驱动的创建原则。 这意味着一个驱动程序必须支持多个设备的并发操作。 例如,一个电动机驱动器可能同时操作多个电动机,导致多个轴的方向发生旋转,从而导致一个电动机控制一个轴,例如x轴、y轴和z轴。 如果在驱动程序中使用全局变量保存设备信息,则无法同时支持保存多台设备信息。 可以使用链表方法将设备信息保存在链表节点中,但每次内核操作驱动程序api时传递的struct device (例如struct i2c_client )包含struct device 必须遍历链表,比较要操作的设备的信息。 显然效率不高。

所以其实正确的方法是:

probe指定专用结构以存储此设备的状态信息。 然后,调用dev_set_drvdata系列函数将分配的结构与probe时传递的struct device绑定在一起。 当检测到新设备的插件时,将由总线驱动创建结构设备。

当后面的系统调用你驱动的api函数时,传递的struct device,你通过dev_get_drvdata系列的函数分配给你的这个设备的专用结构(具体的设备的状态信息,例如I2C API )

具体请参考我的《linux设备驱动模型》视频

33559 edu.51cto.com/course/17159.html

还有我的《如何编写设备驱动》或《深入linux内核》视频

3359 edu.51cto.com/course/17132.html

33559 edu.51cto.com/course/17155.html

另外,请看我的相关培训视频:

欢迎参加我们推出的每门课程: https://edu.51cto.com/lecturer/8896847.html

我的新更多优惠套餐的链接如下。

https://edu.51cto.com/sd/0a9d4

详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3