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

Will semaphore corrupt data transmission of peripherals like UART in a microcontroller?

信号量禁用中断,因此这会导致其他操作(例如在 SPI 上接收数据)损坏吗?

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

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

有更好的方法,包括:

  • 确保共享变量的原子访问,这只能通过内联汇编程序或 C11 _Atomic(如果支持)来完成。
  • 为特定的硬件外围设备禁用一个特定的中断,如果可以的话,考虑到实时性。那么这应该由该硬件外围设备的驱动程序以 setter/getter 函数的形式处理。
  • 使用普通标志变量形式的“穷人信号量”,依靠 MCU 的中断机制在 ISR 执行时阻止所有其他中断。 Example.

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

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

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

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

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

更好的方法是让外设通过DMA将数据传输到内存,所以根本不需要中断。

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