C IIO设备缓冲区始终为空
我正在使用一个名为LSM6DSL的IMU传感器和iio驱动程序。如果我使用以下命令显示原始值,它们工作正常:C IIO设备缓冲区始终为空,c,linux-kernel,accelerometer,gyroscope,iio,C,Linux Kernel,Accelerometer,Gyroscope,Iio,我正在使用一个名为LSM6DSL的IMU传感器和iio驱动程序。如果我使用以下命令显示原始值,它们工作正常: cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw 然后我决定使用libiio,这样我就可以从C程序中读取所有这些值: struct iio_context *context = iio_create_local_context(); struct iio_device *device = iio_context_get_device
cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw
然后我决定使用libiio,这样我就可以从C程序中读取所有这些值:
struct iio_context *context = iio_create_local_context();
struct iio_device *device = iio_context_get_device(context, 1);
struct iio_channel *chan = iio_device_get_channel(device, 0);
iio_channel_enable(chan);
if (iio_channel_is_scan_element(chan) == true)
printf("OK\n");
struct iio_channel *chan2 = iio_device_get_channel(device, 1);
iio_channel_enable(chan2);
struct iio_buffer *buff = iio_device_create_buffer(device, 1, true);
if (buff == NULL)
{
printf("Error: %s\n", strerror(errno));
return (1);
}
这就是结果:
OK
Error: Device or resource busy
我错过什么了吗?如果您需要更多信息,请告诉我。我想我找到了答案,但我没有注意ncurses库的效果(很抱歉没有提到我正在使用它)
我在初始化ncurses之前移动了这些函数,现在缓冲区创建成功。很难说原因是什么。可以是权限问题(尝试使用root?)到库错误。您应该调试您的程序+libiio(使用
gdb
,strace
或只添加printf
跟踪)。在调用iio\u设备\u create\u buffer()
之前,只需输入一个断点,然后往下走,直到找到-EBUSY
错误发生的确切位置。您可能需要使用来调试libiio。如果您需要我们的帮助,请在此处抛出一个更新,提到libiio中设置了-EBUSY
的确切代码行。此外,通过EBUSY
word对libiio的源代码进行grepping也是一个好主意。假设这个错误是由libiio函数返回的,而不是由syscall/libc函数返回的,比如open()
或fopen()
,您可能会对发生的情况有一个很好的了解。@SamProtsenko,顺便说一句,有一个技巧可以用来找到罪魁祸首行,即#undef EINVAL#定义EINVAL\uuuu行\uuuu
。也许我必须写一篇关于它的文章:-)@0andriy Neat hack:)但在这种情况下,你必须重建libiio来利用这个技巧。而且仍然有可能-EBUSY
来自某个系统调用或libc调用。所以我倾向于在这里使用旧的良好调试。@0andriy说到调试技术,我发现最有用的是我称之为“智能grep”的技术。这意味着:1)使用grep
/cscope
/无论什么方法,查找代码中可能导致问题的所有位置。2) 使用您的知识和逻辑进一步缩小可能的原因,这通常会立即给出答案,从而消除实际调试的需要。3) 如果您仍然有几个可能的原因——一些printk
/printf
跟踪通常足以快速找出实际原因。这种方法的唯一问题是强迫自己更频繁地使用它:)好的是你找到了问题的根本原因。继续接受你的答案。嗨,Stackoverflow说我能在20小时内完成!