猫与打开一个只读文件

时间:2016-11-02 15:50:43

标签: c linux-kernel embedded-linux cat spi

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%。

我看过的事情

  1. 也许你的中断实际上是不可持续的 - 如果我只是更新一个计数器而不是执行SPI读取,那么中断会永远非常愉快。
  2. 也许C将永远不会像猫那样工作 - 如果我将中断速度降低到20Hz,那么C代码和cat的工作方式就会相同。
  3. 也许猫是完美的 - 如果我将中断速度提高到10kHz,猫会在冻结之前读取约5ms。在冻结之前,c代码会做几次读取,间距大不相同。

1 个答案:

答案 0 :(得分:0)

您应该尝试编写自己的cat程序来测试您的打开,读取和关闭代码。然后将其他处理添加到该程序,直到出现故障。

如果您发现类似cat的程序不起作用,那么

从命令行输入:

strace -o spi_cat_trace.txt cat /dev/spidev1.0
less spi_cat_trace.txt

然后尝试弄清楚您的cat类程序与cat在阅读文件时的作用有何不同。