在Linux中断处理程序中创建一个小延迟

我正在与硬件设计小组合作开发一个中断处理程序,我们正试图弄清楚bug的位置。 我正在以5khz的速度读取SPI总线上的芯片。 芯片加载4个字节并触发数据就绪引脚。

我的中断处理程序唤醒并从SPI总线读取4个字节并将数据存储在缓冲区中。 但奇怪的是,每17次读取都会给出所有0的4个字节,这是不对的。 我们正在探索的一个选项是,当芯片发送数据就绪信号时,它并不总是准备就绪。

所以,我知道我无法在中断处理程序中睡觉,但我想尝试引入10或20微秒的延迟。 现在我有一个计数到100,000的for循环然后处理中断。 我没有看到任何变化,所以我想我可能会看到有人有更好的技术来忙碌等待。 或者至少是一种更好的方法来确定我应该经历多少循环迭代,因为我不确定这需要多长时间,或者编译器是否只是优化了整个事情。

我不知道你是否可以在你的嵌入式设备上访问任何伪随机数生成库,但是进行大数乘法后跟mod肯定需要一些周期。 而不是简单地添加1(在硬件级别非常快并且编译器可以优化它以进行移位,因为您执行静态次数)使用随机数种子(系统是否可以访问时钟? )如果可用并进行大量乘法,模数或阶乘运算,负数除法也需要永远。 请记住,除法在硬件级别上花费的时间最长。 使用它对您有利。

我假设您的编译器将删除一个简单的循环。

你应该使用volatile。

volatile unsigned long i; for (i=0;i< 1000000; i++) continue; 

我还假设这不会消除问题或帮助你。

我无法相信,SPI外设有这样的错误

但是你可能会读取SPI-Fifo数据的速度。
因此,一些收到的数据将被删除。

您应该检查SPI模块的错误标志,并检查SPI的RX-empty RX-fullflags。