使用 freeRTOS 设置 1ms 中断 systick_Handler 导致任务仅 运行 一次

Using freeRTOS to set up 1ms interrupt with systick_Handler causing tasks to only run once

我是 freeRTOS 的新手。我有两个任务按顺序设置为 运行,我的程序 运行 很好。但是,当我添加 SysTick_Config 和 SysTick_Handler 时,它只会 运行 我的任务一次,然后我相信只是坐在 idleTask 上(不确定这是否是正确的术语)。我该如何解决这个问题,让我的任务 运行 像以前一样 systick_handler 也能正常工作?

如果这个问题没有意义,我深表歉意,如果我需要详细说明,请告诉我。

默认情况下,FreeRTOS 配置和使用 SysTick 用于其自身的计时目的,例如定期执行调度程序、软件计时器、阻塞函数超时等。因此,SysTick 和相关中断不能直接供用户使用。您不应该在您的用户代码中更改 SysTick。

可能有一些方法可以更改此默认行为(我不确定),但通常您不需要它。 FreeRTOS 需要一个计时器,使用功能更强大的 TIM 模块而不是 SysTick 将是一种浪费。

严格来说,您没有“使用 freeRTOS 设置 1ms 中断”;您正在忽略 FreeRTOS 并通过调用 CMSIS SysTick_Config() 并覆盖 FreeRTOS 自己的 SysTick_Handler().

来覆盖其 SysTick

SysTick(我猜这是一个 ARM Cortex-M)设计用作 RTOS 时基(线索有点在名称中;-))。如果你劫持它,RTOS 将无法正常调度。

非时间触发的任务 - 即那些由于 SysTick 以外的某些中断而安排的任务将 运行,但在您的情况下,您的任务 运行 直到 vTaskDelay() 暂停无限期地执行任务,因为您已经替换了 RTOS SysTick 处理程序。

RTOS 提供计时服务,因此您无需直接使用 SysTick 进行低分辨率(即 RTOS 节拍的分辨率;通常为 1ms)计时。

在这种情况下,您在我看来实施了 1 毫秒的刻度。 FreeRTOS 已经通过 xTaskGetTickCount().

为您提供了

其他计时服务包括:

基本上不使用 CMSIS SysTick 函数;使用 RTOS 计时服务。