Arduino用STM32 FreeRTOS库
这是将FreeRTOS移植到STM32作为Arduino库。
有关FreeRTOS的更多信息,请访问FreeRTOS网站。 另外,请参阅非常有用的入门指南页面。
该库提供了2个FreeRTOS版本:
每个版本都经过ST修改(参见FreeRTOS源码中的st_readme.txt)。
这些与STM32Cube MCU包提供的相同。 或者通过STMicroelectronics GitHub组织: stm32_mw_freertos。
配置
FreeRTOS有几个配置选项,可以在FreeRTOSConfig.h文件中指定。
该库提供了一个名为FreeRTOSConfig_Default.h
的默认FreeRTOS配置文件。
用户可以通过在名为STM32FreeRTOSConfig.h
的文件中添加自己的配置,在草图级别提供自己的FreeRTOS配置文件。
或者通过在名为STM32FreeRTOSConfig_extra.h
的文件中添加额外配置,在草图级别添加默认配置之外的额外FreeRTOS配置。
FreeRTOS提供了堆分配方案,请参见RTOS源代码中包含的内存分配实现。 为了扩展这些方案,基于Dave Nadler的工作添加了使用C运行时(Newlib)的线程安全堆分配:
http://www.nadler.com/embedded/newlibAndFreeRTOS.html
默认情况下,使用heap_useNewlib.c
。可以通过配置文件中的定义进行更改:
/* 定义要使用的内存分配实现:
* 1到5对应heap_[1-5].c
* -1对应heap_useNewlib_ST.c
* 默认为-1,参见heap.c
*/
从v10.0.1开始,可以使用CMSIS-RTOSv2替代默认的CMSIS-RTOS。
要使用CMSIS-RTOSv2,必须定义configUSE_CMSIS_RTOS_V2
并将其设置为1
。
限制
- MPU: 不支持。
- 未提供CMSIS-RTOSv2支持。它作为示例提供。
- 在Cortex-M0和Cortex-M0+上,xTaskCreate()和vTaskStartScheduler()之间禁用所有IT。 因此,无法在中间使用IT,如Serial.print()... 这就是为什么在"frLiyLayland"示例中,在xTaskCreate()和vTaskStartScheduler()之间, 我们使用直接printf(),它将直接访问USART而不使用中断
文件和配置
- STM32FreeRTOS.h : 必须始终首先#include。它引用所需的包含文件。
- STM32FreeRTOSConfig.h : 如果在草图级别存在,它包含FreeRTOS配置。
- STM32FreeRTOSConfig_extra.h : 如果在草图级别存在,它包含额外的FreeRTOS配置。
- FreeRTOSConfig_Default.h : 如果
STM32FreeRTOSConfig.h
不存在,它包含此STM32移植版的默认FreeRTOS配置。
测试结果(使用Arduino_Core_STM32)
STM32FreeRTOS v9.0.x
开发板 | AnalogRead_DigitalRead | Blink_AnalogRead | frBlink | frBlinkPrint | frJitter | frLiuLayland |
---|---|---|---|---|---|---|
Nucleo F091RC | 通过 | 通过 | 通过 | 通过 | 通过 | 失败 |
Nucleo F103RB | 通过 | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F303RE | 通过 | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F429ZI | 通过 | 通过 | 通过 | 通过 | 通过 | 通过 |
STM32F746G-DISCOVERY | 通过 | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo L053R8 | 通过* | 通过* | 通过* | 通过* | 通过* | 失败 |
Nucleo L152RE | 通过 | 通过 | 通过 | 通过 | 通过 | 通过 |
B-L475E-IOT01A | 通过 | 通过 | 通过 | 通过 | 通过 | 通过 |
STM32FreeRTOS v10.0.x
开发板 | AnalogRead_DigitalRead | frBlinkPrint | frLiuLayland | frBlink (CMSIS-RTOSv2) | Blinky (CMSIS-RTOSv2) |
---|---|---|---|---|---|
Nucleo F091RC | 通过 | 通过 | 失败 | 通过 | 通过 |
Nucleo F103RB | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F303RE | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F429ZI | 通过 | 通过 | 通过 | 通过 | 通过 |
STM32F746G-DISCOVERY | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo-G071RB | 通过 | 通过 | 失败 | 通过 | 通过 |
Nucleo H743ZI | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo L053R8 | 通过* | 通过* | 失败 | 通过 | 通过 |
Nucleo L152RE | 通过 | 通过 | 通过 | 通过 | 通过 |
B-L475E-IOT01A | 通过 | 通过 | 通过 | 通过 | 通过 |
P-Nucleo-WB55RG | 通过 | 通过 | 失败 | 通过 | 通过 |
* 由于RAM较小,将configUSE_NEWLIB_REENTRANT
设置为0时通过。
STM32FreeRTOS v10.2.x
开发板 | AnalogRead_DigitalRead | frBlinkPrint | frLiuLayland | frBlink (CMSIS-RTOSv2) | Blinky (CMSIS-RTOSv2) |
---|---|---|---|---|---|
Nucleo F091RC | 通过 | 通过 | 失败 | 通过 | 通过 |
Nucleo F103RB | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F303RE | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F411RE | 通过 | 通过 | 通过 | 通过 | 通过 |
STM32F746G-DISCOVERY | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo-G071RB | 通过 | 通过 | 失败 | 通过 | 通过 |
Nucleo-G474RE | 通过 | 通过 | 失败 | 通过 | 通过 |
Nucleo H743ZI | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo L053R8 | 通过* | 通过* | 失败 | 通过 | 通过 |
Nucleo L152RE | 通过 | 通过 | 通过 | 通过 | 通过 |
B-L475E-IOT01A | 通过 | 通过 | 通过 | 通过 | 通过 |
P-Nucleo-WB55RG | 通过 | 通过 | 失败 | 通过 | 通过 |
* 由于RAM较小,将configUSE_NEWLIB_REENTRANT
设置为0时通过。
STM32FreeRTOS v10.3.1
开发板 | AnalogRead_DigitalRead | frBlinkPrint | frLiuLayland | frBlink (CMSIS-RTOSv2) | Blinky (CMSIS-RTOSv2) |
---|---|---|---|---|---|
Nucleo F091RC (Cortex-M0) | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo G071RB (Cortex-M0+) | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo F103RB (Cortex-M3) | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo L476RG (Cortex-M4) | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo H743ZI (Cortex-M7) | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo L552ZE-Q (Cortex-M33) | 通过 | 通过 | 通过 | 通过 | 通过 |
Nucleo U575ZI-Q (Cortex-M33) | 通过 | 通过 | 通过 | 通过 | 通过 |