【发布时间】:2021-04-01 11:13:14
【问题描述】:
我正在开展一个项目,我正在通过 STM32f4 上的 DMA 连续获取数字样本。在我做一些 DSP 的每个样本之后,DMA 都会生成一个完整的回调中断。我的计划是允许 freeRTOS 在 DMA 等待回调时处理其他任务。但是,DMA 过于频繁地生成回调,不允许 freeRTOS 运行。我想让它在每次 DMA 完成回调后,允许 freeRTOS 任务运行 6 毫秒。我想从完整的回调中调用__disable_irq(),从其中一项任务中调用__enable_irq(),但这不能保证6ms,而且我有一个高优先级的按钮中断。我还尝试禁用仅调用 __set_BASEPRI(priority<<(8-__NVIC_PRIO_BITS)) 的 DMA 中断,然后启动一个 6 毫秒的计时器。在调用__set_BASEPRI(0) 中的定时器周期已过回调以启用 DMA 中断。但由于某种原因,这根本不允许 freeRTOS 运行。它在 DMA 完成回调和 Timer period elapsed 回调之间来回切换。
我是嵌入式编程的新手,因此对此的任何评论都会有所帮助。谢谢。
【问题讨论】:
-
你的采样率是多少?
-
这有点 X-Y 问题。您正在询问如何实施您认为的解决方案,此时您可能应该退后一步,更全面地询问如何在您拥有的硬件上实现任务调度和 DSP 截止日期。您的描述可能不清楚,但我想说您没有正确使用 RTOS。您明显的 RTOS/DSP 划分是错误的。在 RTOS 中,您应该在任务中做几乎所有事情,而在中断中几乎什么都不做。中断中的任何重要处理都会损害 RTOS 确定性响应的能力。
标签: embedded stm32 interrupt freertos stm32f4discovery