【发布时间】:2018-07-14 17:46:27
【问题描述】:
我正在尝试在现有的 STM32 固件项目中启动 FreeRTOS。我复制了所有文件,将中断优先级更正为最低。但是,处理器卡在 xTaskIncrementTick for 循环中,无法退出该循环。同时,所有其他定时器中断停止工作。
我正在使用 HAL 库。 HAL 定时器使用 TIM1 而不是 SysTick,所以它可以被 FreeRTOS 使用。
【问题讨论】:
我正在尝试在现有的 STM32 固件项目中启动 FreeRTOS。我复制了所有文件,将中断优先级更正为最低。但是,处理器卡在 xTaskIncrementTick for 循环中,无法退出该循环。同时,所有其他定时器中断停止工作。
我正在使用 HAL 库。 HAL 定时器使用 TIM1 而不是 SysTick,所以它可以被 FreeRTOS 使用。
【问题讨论】:
我在 xTaskIncrementTick() 中看不到循环 - 请参阅此链接上的第 2589 行:https://sourceforge.net/p/freertos/code/HEAD/tree/tags/V10.0.1/FreeRTOS/Source/tasks.c您卡在哪一行?
为什么需要使用 TIM1 而不是默认的 SysTick?这将是非常不寻常的,除非您想要一个超低功耗的应用程序,在这种情况下,您可能会选择使用低功耗时钟 - 但我不认为 TIM1 是低功耗的。
我认为STM32Cube软件也使用了SysTick。除了 RTOS 之外,处理也希望使用 SysTick 的第三方库的正常方法是让 FreeRTOS 管理滴答中断,并使用 FreeRTOS 滴答钩 (https://www.freertos.org/a00016.html) 调用库的滴答处理程序。虽然我认为 STM32Cube 软件是反过来的——它安装了自己的滴答处理程序并从中调用 FreeRTOS 滴答中断。
【讨论】:
根据我的经验,将现有代码移植到基于 FreeRTOS 的新项目中要比在现有项目中安装 FreeRTOS 快得多。您必须这样做有什么特别的原因吗?
我自己的方法是使用包含 FreeRTOS 并设置为支持您现有代码的 CubeMX 创建一个新项目,然后在为该新项目生成代码后,我会将现有代码粘贴到其中作为默认任务。这通常会给我一个稳定的起点。
【讨论】:
目前,将 FreeRTOS 包含到您的项目中的最佳方式是使用 Stm32CubeIDE 中包含在 de 项目配置中,您可以在中间件部分激活它。
我强烈推荐观看有关 FreeRTOS 的最新官方 stm32 视频 这里是a link,所有 Lab 格式的视频都有很多有趣的细节。
【讨论】:
您可以在 ST Microelectronics 的官方页面下载您正在使用的电路板的示例。下载后,您将拥有使用外围设备以及与 FreeRTOS 和其他资源集成的不同示例。我使用的是 STM32F746G Disco,STM32F7 设备的链接是这样的:
【讨论】: