使用 GCC (ARM) 配置 FreeRTOS

Configuring FreeRTOS with GCC (ARM)

我对 RTOS 和 ARM Cortex MCU 都不熟悉。我需要将 FreeRTOS + GCC + mbed.org 的库与 STM32L053 核板一起使用。我已经使用 GCC+mbed+qt-creator 成功创建了一个工具链,但是我需要将 FreeRTOS 添加到这个组合中。我已经有一个使用具有相同目标的 FreeRTOS 的项目,所以我假设我可以在我的文件中使用该项目中的 FreeRTOS 文件。但是该项目是使用不同的编译器和库构建的。我的疑惑是:

 # This file was automagically generated by mbed.org. For more 

information, 
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded

GCC_BIN = /usr/bin/ PROJECT = Nucleo_printf OBJECTS = ./main.o  SYS_OBJECTS = ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_dac.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_comp.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_gpio.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_rcc_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_rng.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_rtc_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_iwdg.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_smartcard_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_lcd.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_adc.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_flash_ramfunc.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_rcc.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_comp_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_flash_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/mbed_overrides.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_cryp_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_i2c_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_smbus.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_tim_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_i2s.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_lptim.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_pwr.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_firewall.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_rtc.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_crc.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_flash.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_pwr_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_cortex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/system_stm32l0xx.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/board.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/startup_stm32l053xx.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_pcd_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_dma.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_wwdg.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_tsc.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_crc_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_spi.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/cmsis_nvic.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/hal_tick.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_adc_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_cryp.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_irda.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/retarget.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_pcd.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_dac_ex.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_uart.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_tim.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_usart.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_smartcard.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_i2c.o ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/stm32l0xx_hal_uart_ex.o  INCLUDE_PATHS = -I. -I./mbed -I./mbed/TARGET_NUCLEO_L053R8
-I./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM -I./mbed/TARGET_NUCLEO_L053R8/TARGET_STM -I./mbed/TARGET_NUCLEO_L053R8/TARGET_STM/TARGET_STM32L0 -I./mbed/TARGET_NUCLEO_L053R8/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L053R8

LIBRARY_PATHS = -L./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM  LIBRARIES = -lmbed  LINKER_SCRIPT = ./mbed/TARGET_NUCLEO_L053R8/TOOLCHAIN_GCC_ARM/STM32L053X8.ld

###############################################################################  AS      = $(GCC_BIN)arm-none-eabi-as CC      = $(GCC_BIN)arm-none-eabi-gcc CPP     = $(GCC_BIN)arm-none-eabi-g++ LD  
= $(GCC_BIN)arm-none-eabi-gcc OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump SIZE    = $(GCC_BIN)arm-none-eabi-size



CPU = -mcpu=cortex-m0plus -mthumb  CC_FLAGS = $(CPU) -c -g -fno-common
-fmessage-length=0 -Wall -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP CC_SYMBOLS = -DTARGET_NUCLEO_L053R8 -DTARGET_M0P -DTARGET_CORTEX_M -DTARGET_STM -DTARGET_STM32L0 -DTARGET_STM32L053R8 -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -D__CORTEX_M0PLUS -DARM_MATH_CM0PLUS -DMBED_BUILD_TIMESTAMP=1435204562.85 -D__MBED__=1 -DTARGET_FF_ARDUINO -DTARGET_FF_MORPHO 

LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -Wl,--wrap,main
-Wl,-Map=$(PROJECT).map,--cref
#LD_FLAGS += -u _printf_float -u _scanf_float LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys


ifeq ($(DEBUG), 1)   CC_FLAGS += -DDEBUG -O0 else   CC_FLAGS +=
-DNDEBUG -Os endif

.PHONY: all clean lst size

all: $(PROJECT).bin $(PROJECT).hex size


clean:  rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)


.s.o:   $(AS) $(CPU) -o $@ $ $@

lst: $(PROJECT).lst

size: $(PROJECT).elf    $(SIZE) $(PROJECT).elf

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-include $(DEPS)

I have successfully created a toolchain with GCC

你这是什么意思?我在各种 ARM 体系结构上使用 GCC 的时间比我愿意承认的要长(其中许多是 listed on the FreeRTOS website),并且从未真正创建过工具链。相反,我一直只使用预构建的 GCC 二进制文件。 ARM 自己维护一个 GCC 版本,该版本(自然)对所有人免费,不需要配置或构建。

如果您想要一个专业的 GCC 工具链以及针对该板的项目,请考虑 Atollic 的工具(Google 它们)。如果您想要一个包含大量 STM32 板项目的免费 G​​CC 工具链,请考虑在 openstm32.org 网站上找到的工具。

还是我没抓住重点?

What are the things to consider for configuring a existing FreeRTOS port with my new compiler (in my case GCC).

依赖于编译器的 FreeRTOS 配置选项非常少。 configMINIMAL_STACK_SIZE 可能是其中之一,因为根据使用的 GCC 库,分配给任务的堆栈可能需要比使用 IAR 编译器时更大。然而,有相当多的配置选项是依赖于体系结构的。例如,当使用 Cortex-M 设备时,您需要指定部件中实现了多少优先级位、可以进行系统调用的最大中断优先级等。设置这些的最简单方法是从一个STM32 部件的现有项目 - 来自 FreeRTOS 发行版,或来自工具公司(例如上面提到的两家公司)。

Did mbed libraries have any effect on configuring FreeRTOS

我不熟悉 mbed 库,但需要注意的是它们如何启用和禁用中断(FreeRTOS 从不全局禁用该架构上的中断,但确实保留了掩码嵌套计数,如果这些库也在操纵中断掩码),以及它如何使用 SysTick 中断(如果有的话)(默认情况下,FreeRTOS 使用 SysTick 来生成 RTOS 节拍中断)。

我创建了一个开源固件框架

https://github.com/labapart/polymcu 基于 newlib(类 libc)。

它支持 GCC 和 LLVM 工具链,baremetal/RTX/FreeRTOS 环境,以及主要的 MCU 供应商(Freescale、Nordic、NXP、ST)。

我创建了几个示例(Baremetal、CMSIS RTOS、FreeRTOS、通用 USB HID)

https://github.com/labapart/polymcu/tree/master/Application/Examples 在我从不同供应商处获得的所有开发板上运行。

我还在 FreeRTOS 中添加了 CMSIS RTOS API,因此您可以轻松交换基于 CMSIS 的 RTOS(例如 ARM RTX 和 FreeRTOS)。