2016-09-06 6 views
0

Я выполнил стандартную процедуру, чтобы получить новую плату Nucleo-F767ZI от STMicroelectronics. Процедура выглядит следующим образом:Перекрестный компилятор GCC (для ARM micro) жалуется на «не поддерживаемую точку с плавающей запятой ABI» при функции, где отсутствует инструкция FP

ШАГ 1

Я скачал SW4STM32 IDE от AC6. Это IDE для Eclipse для программирования серии микроконтроллеров STM32 от STMicroelectronics.

ШАГ 2

Я скачал последнюю CubeMX программное обеспечение от STMicroelectronics. CubeMX - это инструмент на основе Java, в котором вы можете настроить несколько базовых настроек для вашего микроконтроллера: тактовую частоту, оперативную память, периферийные устройства, .... После этого CubeMX выплевывает папку с кучей c-исходных файлов. Это в основном ваш проект для начала.

ШАГ 3

я открываю SW4STM32 IDE и импортировать проект, который CubeMX только генерируемый. Я не изменяю и не добавляю никакого кода. Я просто нажимаю кнопку сборки, надеясь, что проект будет скомпилирован в исполняемый файл .bin (и, возможно, также файл .elf). Здесь все идет не так.

ОШИБКА

компилятор находит (или думает, что он находит) ошибку в следующей функции в файле Freertos portmacro.h:

171  /* Generic helper function. */ 
172  __attribute__((always_inline)) static inline uint8_t ucPortCountLeadingZeros(uint32_t ulBitmap) 
173  { 
174   uint8_t ucReturn; 
175   
176   __asm volatile ("clz %0, %1" : "=r" (ucReturn) : "r" (ulBitmap)); 
177   return ucReturn; 
178  } 

Сообщение об ошибке я получаю от компилятора :

линия 173: извините, невыполненный: Thumb-1 жесткого поплавок VFP AB I

В настоящее время существует несколько причин, почему я не понимаю это конкретное сообщение об ошибке:

>> Выпуск 1

Первый вопрос о местонахождении ошибки. Строка 173 - это линия, в которой расположена открывающая фигурная скобка. Почему сообщение об ошибке относится к этой строке?

>> Выпуск 2

Во-вторых, я не понимаю, почему сообщение об ошибке упоминается аппаратное устройство с плавающей запятой на мой микроконтроллера. Я не вижу никакой команды с плавающей запятой в функции ucPortCountLeadingZeros(..).

>> Выпуск 3

Я открыл настройки компилятора GCC в проекте Eclipse. Просто взгляните на настройки по умолчанию.Я ничего не меняю. Вот две картинки:

enter image description here

enter image description here

Первый скриншот показывает, что следующая опция выбрана:

Instruction set : Thumb II 

Второй скриншот показывает, что следующие параметры приведены для НКУ:

-mfloat-abi=hard # Inform GCC that this micro has a hardware floating point unit 
    -mfpu=fpv5-d16  # The hardware floating point unit is double precision 
    -mthumb    # ARM Thumb instruction set 

Итак, какая версия набора инструкций Thumb на самом деле выбрана. Thumb I или Thumb II?

Пожалуйста, помогите мне узнать, почему этот сгенерированный проект из CubeMX не компилируется. Я очень благодарен за любые советы и подсказки.

EDIT:

Полный набор опций, уходящих к GCC компилятором (как видно на втором скриншоте) заключается в следующем:

-mthumb 
    -mfloat-abi=hard 
    -mfpu=fpv5-d16 
    -D__weak="__attribute__((weak))" 
    -D__packed="__attribute__((__packed__))" 
    -DUSE_HAL_DRIVER 
    -DSTM32F767xx 
    -I../Inc 
    -I../Drivers/STM32F7xx_HAL_Driver/Inc 
    -I../Drivers/STM32F7xx_HAL_Driver/Inc/Legacy 
    -I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1 
    -I../Middlewares/Third_Party/FreeRTOS/Source/include 
    -I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS 
    -I../Drivers/CMSIS/Include 
    -I../Drivers/CMSIS/Device/ST/STM32F7xx/Include 
    -Os 
    -g3 
    -Wall 
    -fmessage-length=0 
    -ffunction-sections 
    -c 
    -fmessage-length=0 
+1

GCC обычно говорит, что для цели до ARMv6T2, такой как ARM7TDMI, есть ли где-нибудь подходящий '-mcpu' или' -march'? – Notlikethat

+0

Вы сделали там очень хороший момент. По-видимому, для GCC нет опции '-mcpu', или опции -march. Это действительно очень странно. Я не понимаю, почему проект по умолчанию, сгенерированный CubeMX (и импортированный в SW4STM32), пропускает этот важный флаг компилятора :-( –

+1

ARM указывает, что CLZ доступен как 32-битная команда большого пальца, только для ARMv6T2 и выше. укажите, что вы компилируете для неправильной версии арки. –

ответ

2

Как отмечалось в комментариях ниже вопрос , проект, сгенерированный CubeMX, не указывал опцию -mcpu компилятору. Таким образом, следует вручную добавить эту опцию компилятора, компоновщика и ассемблера:

-mcpu=cortex-m7 

Если вы сделаете это, он строит без проблем.

Добавление опции в компилятор, компоновщик и ассемблер немного сложнее. Я подробно объясню, как это сделать.


1. Добавление опции для компилятора

> Щелкните правой кнопкой мыши на папку проекта в левом окне Eclipse. Нажмите на Properties во всплывающем окне. В окне свойств выберите C/C++ Build>Settings слева.

> Теперь вы должны увидеть 3 варианта посередине окна: MCU GCC Compiler, MCU GCC Linker и MCU GCC Assembler. Нажмите на первый и выберите Miscellaneous.

> Вы должны увидеть линию other flags. Добавьте к этой строке следующий параметр: -mcpu=cortex-m7.


2. Добавление опции в ассемблере

> В том же окне свойств выберите MCU GCC Assembler>General.

> Вы должны увидеть линию Assembler flags. Добавьте к этой строке опцию -mcpu=cortex-m7.


3. Добавление опции линкера

> Опять в окне свойств выберите MCU GCC Linker.

> Вы должны увидеть Command line pattern строку со следующим текстом в ней:

${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} 

> Добавить опцию -mcpu=cortex-m7 в этой строке.


После этого все, что, как компилятор, ассемблер и компоновщик знает, что вы хотите построить для архитектуры Cortex-M7. Мне все еще немного мешает, что CubeMX не поместил это по умолчанию в файл конфигурации сгенерированного проекта. Но, по крайней мере, мы знаем, что обходной путь сейчас ..

Большое спасибо @Notlikethat, @ Жан-Луи Bonnaffe и @rjp привел меня к этому решению с полезными комментариями :-)

+0

FWIW, согласно [этому сообщению на форуме] (http://www.openstm32.org/forumthread3099), еще одним обходным решением является выбор аналогичная часть STM32F7, которую IDE _does_ понимает. – Notlikethat

+0

Спасибо @ Notlikethat, это действительно умное обходное решение :-) –

1

Я уже сталкивался с подобными вопрос. IDE необходимо обновить для поддержки новой платы/чипа. Рабочее место IAR V7.50 не поддерживает F767ZI, но V7.60 делает. Обновление SW4STM32: «Справка» >> «Проверить наличие обновлений ...», затем перезапустить Eclipse;

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

  • Нет связанных вопросов^_^