我有几个使用 ioctl 调用通过 SPI 进行异步通信的函数。
这些函数执行速度非常快,因为数据有效负载只有几个字节 - 但是 - 必须不中断计时。
我注意到这些功能有时会在 CPU 服务其他线程时被中断——这最终会破坏异步通信;它改变了时间。
对于这两个功能,我如何指定它们不能被中断?
我有几个使用 ioctl 调用通过 SPI 进行异步通信的函数。
这些函数执行速度非常快,因为数据有效负载只有几个字节 - 但是 - 必须不中断计时。
我注意到这些功能有时会在 CPU 服务其他线程时被中断——这最终会破坏异步通信;它改变了时间。
对于这两个功能,我如何指定它们不能被中断?
我认为您无法在大多数普通操作系统(如 Windows、OsX、Linux)上使用常规程序来做到这一点。如果可以,那么恶意软件可以通过简单地声明无限循环不可中断来锁定您的机器。在设备驱动程序中可能会执行类似的操作。如果您真的需要这种级别的控制,那么可以使用实时操作系统。
我认为您可以在 Linux 的内核模块中执行此操作。
禁用所有中断既困难又危险(并且会因内核更新而中断)——除非绝对必要,否则您应该避免这样做。对于 SPI,您应该依赖处理时序和内核配置的驱动程序,如 Android 串行库。
我已经尝试在微控制器上实现协议和时序(当我需要在两组引脚上同时具有不同速度的不同 SPI 时)——即使没有多线程问题,也很难做到完美。所以你真的应该问问自己,我是否应该自己实现低级通信调用。
我意识到这实际上并没有回答你关于如何禁用所有中断的问题,但我觉得它同样解决了你的最终目标。