使用 GCC (ARM) 配置 FreeRTOS
Configuring FreeRTOS with GCC (ARM)
我对 RTOS 和 ARM Cortex MCU 都不熟悉。我需要将 FreeRTOS + GCC + mbed.org 的库与 STM32L053 核板一起使用。我已经使用 GCC+mbed+qt-creator 成功创建了一个工具链,但是我需要将 FreeRTOS 添加到这个组合中。我已经有一个使用具有相同目标的 FreeRTOS 的项目,所以我假设我可以在我的文件中使用该项目中的 FreeRTOS 文件。但是该项目是使用不同的编译器和库构建的。我的疑惑是:
- 使用我的新编译器(在我的例子中是 GCC)配置现有的 FreeRTOS 端口需要考虑什么。
- mbed 库对配置 FreeRTOS 有影响吗?
- 项目的Makefile需要修改什么。 (我现有项目的Makefile如下)
# 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 板项目的免费 GCC 工具链,请考虑在 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)。
我对 RTOS 和 ARM Cortex MCU 都不熟悉。我需要将 FreeRTOS + GCC + mbed.org 的库与 STM32L053 核板一起使用。我已经使用 GCC+mbed+qt-creator 成功创建了一个工具链,但是我需要将 FreeRTOS 添加到这个组合中。我已经有一个使用具有相同目标的 FreeRTOS 的项目,所以我假设我可以在我的文件中使用该项目中的 FreeRTOS 文件。但是该项目是使用不同的编译器和库构建的。我的疑惑是:
- 使用我的新编译器(在我的例子中是 GCC)配置现有的 FreeRTOS 端口需要考虑什么。
- mbed 库对配置 FreeRTOS 有影响吗?
- 项目的Makefile需要修改什么。 (我现有项目的Makefile如下)
# 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 板项目的免费 GCC 工具链,请考虑在 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)。