使用 GCC (ARM) 配置 FreeRTOS
Posted
技术标签:
【中文标题】使用 GCC (ARM) 配置 FreeRTOS【英文标题】:Configuring FreeRTOS with GCC (ARM) 【发布时间】:2015-09-17 04:02:47 【问题描述】:我是 RTOS 和 ARM Cortex MCU 的新手。我需要将 FreeRTOS + GCC + mbed.org 的库与 STM32L053 核板一起使用。我已经用 GCC+mbed+qt-creator 成功创建了一个工具链,但是我需要将 FreeRTOS 添加到这个组合中。我已经有一个使用具有相同目标的 FreeRTOS 的项目,所以我假设我可以在我的文件中使用该项目中的 FreeRTOS 文件。但是该项目是使用不同的编译器和库构建的。我的疑问是:
使用我的新编译器(在我的情况下为 GCC)配置现有 FreeRTOS 端口需要考虑哪些事项。 mbed 库是否对配置 FreeRTOS 有任何影响。 项目的 Makefile 中需要进行哪些更改。 (我现有项目的 Makefile 如下所示) # 此文件由 mbed.org 自动生成。更多 信息, # 参见 http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded GCC_BIN =的/ usr /斌/ 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/TOOL CHAIN_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。 Ø./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/s tm32l0xx_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_STM 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-尺寸 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_DGCC_ARMTEX_MTOOLCHPLUS -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 否则 CC_FLAGS += -DNDEBUG -Os endif .PHONY:所有干净的 lst 大小 全部:$(PROJECT).bin $(PROJECT).hex 大小 清洁:rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS) .s.o: $(AS) $(CPU) -o $@ $ $@ lst:$(项目).lst 尺寸:$(PROJECT).elf $(SIZE) $(PROJECT).elf DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d) -包括$(DEPS)【问题讨论】:
【参考方案1】:我已经用 GCC 成功创建了一个工具链
你这是什么意思?我在各种 ARM 架构上使用 GCC 的时间比我愿意承认的要长(其中许多是 listed on the FreeRTOS website),并且还从来没有真正创建过工具链。相反,我一直只使用预构建的 GCC 二进制文件。 ARM 自己维护的 GCC 版本(自然)对所有人免费,无需配置或构建。
如果您想要一个专业的 GCC 工具链,其中包含针对该板的项目,请考虑 Atollic 的工具(谷歌它们)。如果您想要一个包含大量 STM32 板项目的免费 GCC 工具链,请考虑在 openstm32.org 网站上找到的工具。
还是我没抓住重点?
使用我的新编译器(在我的情况下为 GCC)配置现有 FreeRTOS 端口需要考虑哪些事项。
依赖于编译器的 FreeRTOS 配置选项很少。 configMINIMAL_STACK_SIZE 可能是其中之一,因为根据使用的 GCC 库,分配给任务的堆栈可能需要比使用 IAR 编译器时更大。然而,有相当多的配置选项是依赖于架构的。例如,当使用 Cortex-M 设备时,您需要指定在该部件中实现了多少优先级位、可以进行系统调用的最大中断优先级等。设置这些的最简单方法是从一个STM32 部件的现有项目 - 来自 FreeRTOS 发行版,或来自工具公司(例如上面已经提到的两家)。
mbed 库是否对配置 FreeRTOS 有任何影响
我不熟悉 mbed 库,但需要注意的是它们如何启用和禁用中断(FreeRTOS 从不全局禁用该架构上的中断,但确实保留了掩码嵌套计数,如果库可能会搞砸也在操作中断掩码),以及它如何使用 SysTick 中断(默认情况下,FreeRTOS 使用 SysTick 来生成 RTOS 滴答中断)。
【讨论】:
谢谢@Richard。很抱歉在 IDE 中使用“工具链”术语,这是我的错误。所以使用的库不依赖于freeRTOS,我们可以更改为任何库(如STMCube)而不需要对FreeRTOS进行任何更改,对吧?你知道关于移植 FreeRTOS 演示的初学者指南吗?【参考方案2】:我创建了一个开源固件框架
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)。
【讨论】:
以上是关于使用 GCC (ARM) 配置 FreeRTOS的主要内容,如果未能解决你的问题,请参考以下文章
gcc-linaro-arm-linux-gnueabihf交叉编译器配置
关于arm-linux-gcc已经配置好环境变量可还显示找不到的问题
如何用arm-linux-gcc编译驱动程序,Makefile文件怎么写?