FreeRTOS STM32 集成

Posted

技术标签:

【中文标题】FreeRTOS STM32 集成【英文标题】:FreeRTOS STM32 Integrating 【发布时间】:2018-07-14 17:46:27 【问题描述】:

我正在尝试在现有的 STM32 固件项目中启动 FreeRTOS。我复制了所有文件,将中断优先级更正为最低。但是,处理器卡在 xTaskIncrementTick for 循环中,无法退出该循环。同时,所有其他定时器中断停止工作。

我正在使用 HAL 库。 HAL 定时器使用 TIM1 而不是 SysTick,所以它可以被 FreeRTOS 使用。

【问题讨论】:

【参考方案1】:

我在 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 滴答中断。

【讨论】:

查看第 2624 行。我的固件无法跳出那个循环。 实际上,如果您选择使用 FreeRTOS,STM32Cube 会为 HAL 使用额外的计时器 - 然后 SysTick 仅由 FreeRTOS 使用。这是 ST 的建议。就个人而言,我认为这是在浪费资源。那么,您的意思是将 HAL_IncTIck() 添加到回调函数中?我可以添加它,但我仍然在上面提到的循环中。 根据您的建议更新了代码。现在从 vApplicationTickHook() 调用 HAL_IncTick()。在我调用任何与 RTOS 相关的东西(例如 xTaskCreate)之前,它都可以正常工作。然后 SysTick 中断停止工作,MCU 以 HardFault_Handler 结束。 但是在这种情况下 - 你真的有 SysTick 的问题还是你得到 HardFault 异常的事实? 很难说。添加 vApplicationTickHook 后,我遇到了硬故障问题。【参考方案2】:

根据我的经验,将现有代码移植到基于 FreeRTOS 的新项目中要比在现有项目中安装 FreeRTOS 快得多。您必须这样做有什么特别的原因吗?

我自己的方法是使用包含 FreeRTOS 并设置为支持您现有代码的 CubeMX 创建一个新项目,然后在为该新项目生成代码后,我会将现有代码粘贴到其中作为默认任务。这通常会给我一个稳定的起点。

【讨论】:

【参考方案3】:

目前,将 FreeRTOS 包含到您的项目中的最佳方式是使用 Stm32CubeIDE 中包含在 de 项目配置中,您可以在中间件部分激活它。

我强烈推荐观看有关 FreeRTOS 的最新官方 stm32 视频 这里是a link,所有 Lab 格式的视频都有很多有趣的细节。

【讨论】:

【参考方案4】:

您可以在 ST Microelectronics 的官方页面下载您正在使用的电路板的示例。下载后,您将拥有使用外围设备以及与 FreeRTOS 和其他资源集成的不同示例。我使用的是 STM32F746G Disco,STM32F7 设备的链接是这样的:

STM32F7 examples

【讨论】:

以上是关于FreeRTOS STM32 集成的主要内容,如果未能解决你的问题,请参考以下文章

使用STM32CubeMX创建FreeRTOS项目

使用STM32CubeMX创建FreeRTOS项目

stm32 为啥要用freertos

STM32FreeRTOS

stm32 freertos 中回调函数需要做个任务么

FREERTOS移植STM32F407