Linux 在用户空间中运行i2c例程还是在内核空间中运行同一个驱动程序?
我正在开发一个运行嵌入式Linux的基于ARM的系统。我正在用我编写的用户空间程序以100Hz(每10ms读取12次)的频率通过i2c(使用SMBUS例程)从两个惯性传感器读取数据 我可以看到运行“top”并排除代码中的某些部分,我的计算负载的主要部分是由i2c函数造成的(大约90%的CPU总负载是由我的软件提供的30%)Linux 在用户空间中运行i2c例程还是在内核空间中运行同一个驱动程序?,linux,linux-kernel,linux-device-driver,embedded-linux,i2c,Linux,Linux Kernel,Linux Device Driver,Embedded Linux,I2c,我正在开发一个运行嵌入式Linux的基于ARM的系统。我正在用我编写的用户空间程序以100Hz(每10ms读取12次)的频率通过i2c(使用SMBUS例程)从两个惯性传感器读取数据 我可以看到运行“top”并排除代码中的某些部分,我的计算负载的主要部分是由i2c函数造成的(大约90%的CPU总负载是由我的软件提供的30%) 如果我使用一些驱动程序(内核空间)来读取这些数据,你认为计算负载会保持不变,只是会以不同的名称考虑,还是会因为某种系统优化而实际减少?你确定你没有忙着等待,还是做了一些效率低
如果我使用一些驱动程序(内核空间)来读取这些数据,你认为计算负载会保持不变,只是会以不同的名称考虑,还是会因为某种系统优化而实际减少?你确定你没有忙着等待,还是做了一些效率低下的事情?我使用的是usleep()为了维持时间安排(我需要在100Hz下对采集的数据运行算法)。但是,如果我真的排除了计算部分(我原以为是最重的部分),我看不到任何CPU负载减少。相反,当我排除i2c例程并生成随机数来运行代码时,我看到了它。它解决了吗?如果是,请更新帖子。如果没有,您能否更新问题以提供用户空间应用程序正在使用的i2c功能的详细信息?我正在使用SMBUS功能通过i2c进行通信,正如我在问题中所述。您知道您正在使用的i2c总线控制器吗?如果您使用GPIO位切换控制器,访问需要大量CPU时间是正常的,因为如果我没记错的话,切换引脚之间的等待是繁忙的等待。