Настройка FreeRTOS с GCC (ARM)

Я новичок в RTOS и ARM Cortex MCU. Мне нужно использовать библиотеку FreeRTOS + GCC + mbed.org с ядерной платой STM32L053. Я успешно создал набор инструментов с помощью GCC+mbed+qt-creator, но мне нужно добавить FreeRTOS к этой комбинации. У меня уже есть проект, который использует FreeRTOS с той же целью, поэтому я предполагаю, что я могу использовать файлы FreeRTOS в этом проекте в своих файлах. Но этот проект построен с использованием разных компиляторов и библиотек. Мои сомнения:

  • Что нужно учитывать при настройке существующего порта FreeRTOS с моим новым компилятором (в моем случае GCC).
  • Оказали ли библиотеки mbed какое-либо влияние на настройку FreeRTOS.
  • Какие изменения необходимы в Makefile проекта. (Makefile моего существующего проекта приведен ниже)
 # Этот файл был автоматически сгенерирован mbed.org. Для получения дополнительной информации # см. 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_0/0/0/0/0/0/0/0/0/0/0/02/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1/0/0/1/0/1/2/1/2/1 _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. о./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. о./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###########___#__#__R_T_T_G_T_T_G_T_T_G_R_G_G_R_G_R_G_R_G_RG #############################################################  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 РАЗМЕР = $(GCC_BIN)arm-none-eabi-size



CPU = -mcpu=cortex-m0plus -mthumb  CC_FLAGS = $(CPU) -c -g -fno-common
-fmessage-length=0 -Wall -FNO-исключения -функции-разделы -FDATA-секции -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 = $(ЦП) -Wl,- ГЦ сечения --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: все очистить lst размер все: $(PROJECT).bin $(PROJECT).hex размер clean:  rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS)


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

lst: $(PROJECT).lst размер: $(PROJECT).elf    $(SIZE) $(PROJECT).elf

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d)
-включить $ (DEPS)

2 ответа

Решение

Я успешно создал цепочку инструментов с GCC

Что ты имеешь в виду? Я использую GCC на различных архитектурах ARM уже больше лет, чем мне хотелось бы признать (многие из которых перечислены на веб-сайте FreeRTOS), и мне еще никогда не приходилось создавать цепочку инструментов. Вместо этого я всегда использовал предварительно собранные двоичные файлы GCC. Сами ARM поддерживают версию GCC, которая (естественно) бесплатна для всех и не требует настройки или сборки.

Если вам нужен профессиональный инструментарий GCC с проектами, ориентированными на эту доску, тогда рассмотрите инструменты Atollic (Google их). Если вам нужен бесплатный набор инструментов GCC с проектами для большого количества плат STM32, рассмотрите инструменты, найденные на сайте openstm32.org.

Или я упускаю суть?

Что нужно учитывать при настройке существующего порта FreeRTOS с моим новым компилятором (в моем случае GCC).

Существует очень мало параметров конфигурации FreeRTOS, которые зависят от компилятора. configMINIMAL_STACK_SIZE, вероятно, является одним из них, поскольку в зависимости от используемых библиотек GCC стек, выделяемый для задач, может быть больше, чем, например, при использовании компилятора IAR. Однако существует довольно много вариантов конфигурации, которые зависят от архитектуры. Например, при использовании устройства Cortex-M необходимо указать, сколько битов приоритета реализовано в детали, максимальный приоритет прерывания, из которого могут выполняться системные вызовы, и т. Д. Самый простой способ установить их - начать с существующий проект для части STM32 - либо из дистрибутива FreeRTOS, либо из инструментальной компании (такой как два, уже упомянутых выше).

Оказывали ли библиотеки mbed какое-либо влияние на настройку FreeRTOS?

Я не знаком с библиотеками mbed, но нужно обратить внимание на то, как они включают и отключают прерывания (FreeRTOS никогда глобально не отключает прерывания в этой архитектуре, но поддерживает счетчик вложенности маски, который может быть испорчен, если библиотеки также манипулируют маска прерывания) и как она использует прерывание SysTick, если оно вообще используется (по умолчанию FreeRTOS использует SysTick для генерации прерывания тика RTOS).

Я создал фреймворк с открытым исходным кодом

https://github.com/labapart/polymcu который основан на newlib (libc-like).

Он поддерживает наборы инструментов GCC и LLVM, среды baremetal/RTX/FreeRTOS и основных поставщиков MCU (Freescale, Nordic, NXP, ST).

Я создал несколько примеров (Baremetal, CMSIS RTOS, FreeRTOS, Generic USB HID)

https://github.com/labapart/polymcu/tree/master/Application/Examples который работает на всех платах разработчика, которые я получил от разных поставщиков.

Я также добавил CMSIS RTOS API во FreeRTOS, чтобы вы могли легко менять RTOS на основе CMSIS (например, ARM RTX и FreeRTOS).

Другие вопросы по тегам