Я выполнил стандартную процедуру, чтобы получить новую плату 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. Просто взгляните на настройки по умолчанию.Я ничего не меняю. Вот две картинки:
Первый скриншот показывает, что следующая опция выбрана:
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
GCC обычно говорит, что для цели до ARMv6T2, такой как ARM7TDMI, есть ли где-нибудь подходящий '-mcpu' или' -march'? – Notlikethat
Вы сделали там очень хороший момент. По-видимому, для GCC нет опции '-mcpu', или опции -march. Это действительно очень странно. Я не понимаю, почему проект по умолчанию, сгенерированный CubeMX (и импортированный в SW4STM32), пропускает этот важный флаг компилятора :-( –
ARM указывает, что CLZ доступен как 32-битная команда большого пальца, только для ARMv6T2 и выше. укажите, что вы компилируете для неправильной версии арки. –