我正在使用一种名为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(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
我有遗漏吗?如果您需要更多信息,请告诉我。
gdb
,strace
或只需添加printf
跟踪)。在调用iio_device_create_buffer()
之前设置断点,并向下步进,直到找到确切发生-EBUSY
错误的位置。您可能需要使用调试符号来调试libiio。如果您需要我们的帮助,请在此处更新,提及在libiio中设置-EBUSY
的确切代码行。 - Sam Protsenko#undef EINVAL; #define EINVAL __LINE__
。也许我得写一篇文章来介绍它 :-) - 0andriy-EBUSY
来自某些系统调用或libc调用。因此,在这里我倾向于使用老式的调试方法。 - Sam Protsenkogrep
/cscope
/等工具定位可能导致问题的所有代码位置。2)利用你的知识和逻辑进一步缩小可能的原因,这通常会立即给出答案,消除了实际调试的需要。3)如果仍然有几个可能的原因——几个printk
/printf
跟踪通常足以快速找出实际原因所在。这种方法唯一的问题是要强迫自己更经常地使用它 :) - Sam Protsenko