2015-06-30 3 views
1

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

  • Что нужно учитывать при настройке существующего порта FreeRTOS с моим новым компилятором (в моем случае GCC).
  • Были ли библиотеки 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 [email protected] $ [email protected] 

lst: $(PROJECT).lst 

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

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

ответ

2

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

Что вы имеете в виду под этим? Я использую GCC на различных архитектурах ARM в течение многих лет, чем я хотел бы признать (многие из которых - listed on the FreeRTOS website), и им никогда не приходилось создавать цепочку инструментов. Вместо этого я всегда использовал только предварительные сборки 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) ,

+0

Спасибо @ Richard. Извините за использование терминологии «toolchain» для IDE, это моя ошибка. Таким образом, используемые библиотеки не зависят от freeRTOS, мы можем перейти на любые библиотеки (например, STMCube) без каких-либо изменений в FreeRTOS, не так ли? Знаете ли вы руководство для новичков, о портировании демонстраций FreeRTOS. –

-1

Я создал базу с открытым исходным кодом прошивки

https://github.com/labapart/polymcu, который основан на newlib (Libc типа).

Он поддерживает GCC и LLVM toolchain, 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, поэтому вы можете легко заменить ОС на базе CMSIS (например, ARM RTX и FreeRTOS).

Смежные вопросы