将外设驱动程序与 RTOS 连接

Interfacing peripheral drivers with RTOS

我的一个项目选择的控制器是 STM32L1 系列。 ST 为 USB、I2C、SPI 等提供驱动程序。因此,在决定使用 RTOS 时,是否需要考虑驱动程序。或者在决定了 RTOS 之后,是否有任何标准的方式将微控制器的外围驱动程序与 RTOS 接口?

不,微控制器外设驱动程序和 RTOS 通常是独立的,因此不需要考虑兼容性。微控制器外设驱动程序是不依赖于任何 RTOS 服务的基本驱动程序。事实上,外围库可以在没有任何 RTOS 的情况下使用。 RTOS 通常不依赖定时器以外的任何微控制器外围设备。甚至定时器的设置也没有内置到 RTOS 中。计时器通常在启动 RTOS 之前由用户代码设置。

如果我没能说服你,而你仍然想要一些兼容性保证,那么请探索 CMSIS

虽然 ST 的低级驱动程序没有 RTOS 依赖项或要求,但您可以使用 RTOS 机制围绕这些构建更高级别的驱动程序架构,例如支持互斥、缓冲和管理器处理程序优先级。

例如,您可以通过设备管理器线程或互斥来管理对设备的多线程访问。

没有标准定义的方法将外设驱动程序连接到 RTOS,因为它取决于 RTOS。然而,一种常见的方法是利用 RTOS 提供的阻塞互斥量或信号量。阻塞互斥量意味着如果互斥量不可用,任务将等待直到它空闲并且在此之前不使用任何 CPU 时间。

通常当 运行 RTOS 时,您希望外设驱动程序使用中断尽快获取输入数据,然后将数据传递给可以花时间处理的 RTOS 任务数据。这是管理外设中断和 RTOS 多任务处理的一种非常干净的方法。

一般的情况是您有一个等待互斥锁的任务。大多数时候它不需要任何 CPU 时间。当外设驱动程序被中断调用时,驱动程序从硬件中获取数据,并释放互斥锁,等待任务将被唤醒。实际数据可以使用全局变量或其他 RTOS 定义的机制在外设驱动程序和任务之间传递。可以使用信号量来完成类似的机制。

ST提供的外设驱动程序(无论是StdPeripheralLib、HAL还是LL)都可以在该模型下运行。因此,在决定使用哪种 RTOS 时,您应该考虑 API 支持此模型的 RTOS。