【问题标题】:FreeRTOS ISR at 50 KHz50 KHz 的 FreeRTOS ISR
【发布时间】:2018-08-06 10:48:07
【问题描述】:

我想在 ARM Cortex M4 上使用配置为在 50KHz 上产生中断的硬件定时器同步闪烁 LED(切换 GPIO 引脚)。

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

除了定时器滴答中断(100Hz,优先级最低)、空闲任务和我的特定 ISR 处理程序之外,操作系统没有运行任何其他任务。

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

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

【问题讨论】:

  • “FreeRTOS ISR”是什么意思? ISR 实施如何从您的裸机实施转变为 FreeRTOS 实施?为什么它必须改变?
  • 嗨@kkrambo,“FreeRTOS ISR”是指中断服务例程,无论它是否在 FreeRTOS 上。实际上,我在 FreeRTOS 和裸机上的 ISR 代码完全相同。不同之处可能在于 FreeRTOS 多任务处理行为。它可能来自优先级配置、嵌套中断管理、中断开销。由于 ISR 优先级在 FreeRTOS 系统中是最高的,我认为我的 50Khz 中断会在其他所有操作之前运行......
  • ARM Cortex M4 仅指定内核,不包括硬件计时器 - 您应该指定部件本身。大多数微控制器上的大多数硬件定时器都可以直接驱动 GPIO 引脚(通过它们的 PWM 功能),而软件开销为零;如果您想要一个准确的 50 KHz 信号,您应该使用 PWM 输出。在中断中对 50KHz 信号进行 Bit-banging 将带来显着的 CPU 负载,并将影响其他任务和 ISR 的确定性和实时性能。准确性取决于操作系统或应用程序从不禁用中断。

标签: task interrupt-handling freertos rtos isr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我终于发现 指令缓存 在我的 50KHz ISR 的 FreeRTOS 实现中未启用,这与裸机版本不同。它现在几乎可以按预期工作(仍然存在一些抖动)。

    在回答我的问题时,我提出以下建议:

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

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

    1. 我是否需要将其放入等待 50KHz 中断信号的任务中?

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

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

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

    【讨论】:

      【解决方案3】:

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

      当然,您可以尝试,但这是个坏主意。因此,您应该至少更改系统滴答时间 10uS(1 / 50KHz / 2 ),在这种情况下,您的任务会有很小的延迟(它允许“立即”做出反应),但是会经常调用上下文切换 ISR,这会降低性能。

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

      【讨论】:

      • 嗨@denis,我已经在使用硬件定时器来生成 50KHz 中断(用于切换 GPIO),所以我不确定你是否理解更健康的选择。目前我不使用任何任务,GPIO 引脚切换在 ISR 中完成。我的 ISR 是否在每次处理时都隐含地要求“任务 YIELD”? Bare Metal 实现可以毫无问题地执行硬件上下文的最小保存和恢复。
      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2019-09-22
      • 2014-12-03
      • 1970-01-01
      • 2023-02-10
      相关资源
      最近更新 更多