FreeRTOS ISR at 50 KHz



我想在ARM Cortex M4上同步闪烁led(切换GPIO引脚(,硬件计时器配置为在50KHz下引发中断

在我当前的代码中,我将一个GPIO引脚切换到一个由50KHz外部时钟信号触发的特定ISR处理程序中。结果是GPIO引脚在1KHz到96KHz的随机频率下切换非常不稳定。

除了Timer Tick Interrupt(优先级最低的100Hz(、IDLE task和我的特定ISR处理程序之外,操作系统没有运行任何其他任务。

否则,这种"切换解决方案"与同一MCU上的裸机实现完美配合。所以,我的问题似乎来自于我对FreeRTOS环境缺乏了解。

  1. 将LED切换到50 KHz的FreeRTOS ISR是否可行
  2. 我需要把它变成一个等待50KHz中断信号的任务吗
  3. 我应该创建一个50KHz的定时切换任务并同步它吗周期性地使用外部时钟信号

如果您希望50K是准确的(没有抖动(,中断的优先级必须等于或高于configMAX_SYSCALL_interrupt_priority:https://www.freertos.org/a00110.html#kernel_priority和https://www.freertos.org/RTOS-Cortex-M3-M4.html(假设您使用的端口支持中断嵌套(。

我最终发现,与裸机版本不同,我的50KHz ISR的FreeRTOS实现中没有启用指令缓存。它现在几乎像预期的那样工作(仍有一些抖动(。

在回答我的问题时,我建议如下:

  1. 将LED切换为50 KHz的FreeRTOS ISR是否可行

肯定是。FreeRTOS可以在任何频率执行ISR。可行性仅取决于MCU的计算能力以及指令和数据访问性能。可以肯定的是,与裸机实现相比,FreeRTOS将增加一些延迟来处理ISR(ISR开销和端口效率(,但同样,这将或多或少地重要,这取决于MCU的计算性能和考虑周到的频率。

  1. 我需要把它变成一个等待50KHz中断信号的任务吗

不一定。无论如何,如果需要不规则或相当重要的处理,这是一个很好的选择。然而,FreeRTOS延迟指令将花费时间,并且可能太多,无法在下一个ISR之前结束处理。更有弹性但效率较低。在我的50KHz的情况下,相对于每个ISR的平均处理量,这花费了太多时间。

  1. 我应该创建一个50KHz的定时切换任务,并定期将其与外部时钟信号同步吗

除非显著降低系统滴答频率,否则这是不可行的,因为这将导致严重的性能损失。

您无法通过FreeRTOS机制获得50 KHz。

当然,你可以试试,但这个坏主意。因此,您应该至少更改系统刻度10uS(1/50KHz/2(。在这种情况下,您的任务将具有较小的延迟(它允许"立即"做出反应(,但上下文切换ISR将经常被调用,这会降低性能。

正确的方法是使用硬件计时器生成中断(用于切换GPIO(,或者在这种情况下使用带有PWM输出的计时器。频率精度取决于时钟源。为了同步来自外部源的计时器,您应该使用外部中断和高精度(至少10uS(的附加计时器

相关内容

  • 没有找到相关文章

最新更新