嵌入式Linux:内核驱动程序与用户空间驱动程序?

时间:2016-05-06 21:44:57

标签: linux linux-kernel embedded-linux

在Linux中使用内核空间或用户空间驱动程序时,是否有最佳方法(或至少有一些优点和缺点)?

例如,假设我正在开发一种用于感应Sensirion SHT21传感器上的湿度的电路板。我的应用程序将从传感器中读取一个样本,然后以JSON形式呈现它以供Web应用程序使用。

为了与SHT21传感器“对话”,我可以:

  • 使用echo sht21 0x40 > /sys/class/i2c-adapter/i2c-0/new_device实例化I2C设备并通过hwmon访问湿度读数,解析输出然后在我的应用程序中使用
  • 编写我自己的软件,对write()执行所需的(根据数据表)read()/dev/i2c-0操作并自行计算湿度,然后在我的应用程序中使用

第一种方法是使用sht21内核驱动程序,后者完全在用户空间中运行。

我应该去哪一个?我该如何选择?

2 个答案:

答案 0 :(得分:2)

我的头顶:

Userland方法专业人士:

  • 开发更快/更容易调试
  • 如果越野车和车祸,不能使整个系统崩溃

用户态方法缺点:

  • "性能" - 我将在这里留下一个非常含糊的概念 今天...

对于您的应用程序,请将其放在透视图中:

  • 因为我们可以安全地认为湿度不会发生显着变化 时间短,
  • 和/或你的传感器无论如何都有一些不可忽略的滞后现象 它只是出于机械原因,一滴水落在它上面 不会在一毫秒内消失,
  • ......你可能不打算每次都发送湿度测量 毫秒 - 你呢?
  • ...即使你做了,大部分延迟(" vs performance") 将来自将使其成为JSON的那部分,将其发送给 服务器(两者都显然是userland的工作), - 尽管如此 不属于您的业务,这仍然是用例的一部分 - 服务器的网络状况和处理时间,

......总而言之,我会200%采用用户态方法。

内核空间可能在技术上更加有趣"或者"奖励",但工程设置"务实"之前"有趣"。 : - )

答案 1 :(得分:0)

在这两种情况下,你驾驶从用户空间发生的事情,选项2意味着写一个我会避免的驱动程序,如果它已经存在你的好处。

如果有一个驱动程序解析并理解某些正在生产中使用的数据,那么如果它更易于使用或拥有庞大的用户群,则使用它。如果解析原始数据并且你真的被空间挤压(我怀疑这是因为你运行了一个内核),那么就编写你自己的解析器等。

要做到最短的工作,即最不复杂的工作,做到这一点。