FreeRTOS ISR在50 KHz

时间:2018-08-06 10:48:07

标签: task interrupt-handling freertos rtos isr

我想通过硬件计时器同步闪烁LED(切换GPIO引脚),该计时器配置为在ARM Cortex M4上以 50KHz 产生中断。

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

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

否则,此“切换解决方案”与同一MCU上的Bare Metal实现完美配合。因此,我的问题似乎是由于我对FreeRTOS环境缺乏了解。

  1. 将LED切换为50 KHz的FreeRTOS ISR是否可行?
  2. 是否需要将其放入等待50KHz中断信号的任务中 ?
  3. 是否应该以50KHz创建定时切换任务并进行同步 定期使用外部时钟信号?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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

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

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

  
      
  1. 我需要在等待50KHz中断信号的任务中执行此操作吗?
  2.   

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

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

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

答案 2 :(得分:1)

FreeRTOS机制无法获得50 KHz。

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

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