tl; dr - 当我正在做一个无限长文件的猫时,一切都很棒,但是当我使用C的“打开”时,即使没有读取同一个文件,一切都会失败。为什么会这样?我怎么能不让它发生?
我正在开发Digi ME9210,它主推一个小型嵌入式Linux O / S,但还有其他有用的东西,如SPI驱动程序。
我最终想做的是以每秒一致的10k样本读取SPI设备。该器件随附的示例SPI驱动程序提供了使用ioctl函数从用户区域执行SPI读取的功能。不幸的是,在查看时间时,读取根本不一致 - usleep和其他延迟函数给出了不一致的结果,即使我只使用像while (true) { sample_spi(); }
这样的紧密循环,间距也不一致。
我决定考虑编辑内核驱动程序。我可以通过编辑正确的寄存器来获得非常可靠的周期性中断,并且我能够设置一个例程,这样我就可以在每次中断时获得甜蜜的SPI读数。大。出于调试目的,我说“我也只是看它是否能以1kHz运行,而不是期望完整的10kHZ”
在shell中,为了检查我的时间,我跑了
cat /dev/spidev1.0
进行无限读取。 SPI读取主要是周期性的,偶尔会出现滑动(三或五毫秒而不是一毫秒)。我认为这与cat实用程序必须定期转储到流的方式有关。所以我写了一个小C程序,看起来像这样:
int f = open("/dev/spidev1.0", O_RDONLY);
// some time-wasting logic here
close(f);
当我运行它时,我得到10个SPI读取,然后整个Linux机器停止响应,直到我重置。
这是怎么回事?为什么cat
打开文件时文件有效会导致冻结状态?什么是猫做的不同?我假设猫看起来很像“打开文件,阅读,打印并关闭它”。 C代码占50%,甚至不是50%。
我看过的事情
答案 0 :(得分:0)
您应该尝试编写自己的cat
程序来测试您的打开,读取和关闭代码。然后将其他处理添加到该程序,直到出现故障。
如果您发现类似cat
的程序不起作用,那么
从命令行输入:
strace -o spi_cat_trace.txt cat /dev/spidev1.0
less spi_cat_trace.txt
然后尝试弄清楚您的cat
类程序与cat
在阅读文件时的作用有何不同。