信号量会破坏微控制器中UART等外围设备的数据传输吗



Semaphore禁用中断,这会导致SPI上接收数据等其他操作损坏吗?

禁用中断不会损坏硬件接口上的数据。

问题是,如果数据被硬件外围设备接收,然后它引发中断,让处理器收集数据,那么这将被延迟。如果延迟太久,那么可能会收到更多的数据。根据外围设备的不同,必须丢弃新数据或旧数据。无论哪种方式,数据流都是不完整的。

在大多数情况下,很难预测或测试禁用中断的安全时间,所以如果可能的话,最好避免关闭中断

如果外围设备包括FIFO缓冲器,则可以增加禁用中断的安全时间长度(尽管仍然难以预测(。

大多数现代微控制器有许多方法可以避免禁用中断:

一个更好的方法是让外围设备通过DMA将数据传输到内存,这样就不需要中断。

大多数现代处理器内核提供了实现信号量的方法,甚至不需要禁用中断。

没有实现信号量的标准方法。禁用MCU上的所有中断是一种方法,但这是一种非常糟糕的业余方法。因为在具有多个中断的更复杂的应用程序中,这将使所有实时考虑和计算成为噩梦。

它会产生微妙但严重的错误。尤其是当一些庸医从驱动程序代码的深处这样做的时候。您将驱动程序导入到您的项目中,并且之前工作的代码突然中断。特别是,在使用硅供应商提供的各种库时要非常小心——它们的质量通常很差。

有更好的方法可以做到这一点,包括:

  • 确保共享变量的原子访问,这只能通过内联汇编程序或C11_Atomic(如果支持(来完成
  • 如果考虑到实时性,可以为特定硬件外设禁用一个特定中断。然后,这应该由硬件外围设备的驱动程序以setter/getter函数的形式来处理
  • 使用";穷人的旗语;通过依靠MCU的中断机制在ISR执行时阻塞所有其他中断。示例

最新更新