Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Cortex-M4 SIMD инструкции
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > Keil
Gleb80
Приветствую, уважаемые!
Делаю проект для STM32F437 (Cortex-M4) в Keil MDK-ARM 5.23. Среди прочего, в проекте имеются такие строки:
Код
#define ARM_MATH_CM4
#include "arm_math.h"

arm_dot_prod_f32(a, b, c, d);

Все работает как задумано, но в процессе компиляции выскакивают предупреждения:
Код
../arm_math.h(4889): warning:  #223-D: function "__SMUAD" declared implicitly
../arm_math.h(5032): warning:  #223-D: function "__QADD" declared implicitly

и т.д. перечисляются все задействованные SIMD инструкции.
Вот тут сказано, что компилятор генерирует подобные ошибки или предупреждения если контролер, для которого генерируется код, не поддерживает этих инструкций. Но Cortex-M4 поддерживает и вообще все работает нормально. Более того, когда этот же проект компилировался на MDK 4.xx этих предупреждений не было.
В чем тут дело?
Сергей Борщ
QUOTE (Gleb80 @ Mar 3 2017, 16:10) *
В чем тут дело?
Надо изучать букварь по Си или гуглить "function declared implicitly". У вас (или у них) куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции.
Kabdim
edit: Сергей опередил.
Gleb80
Цитата(Сергей Борщ @ Mar 3 2017, 19:15) *
... куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции.


Эти SIMD (Single Instruction Multiple Data) инструкции присутствуют в компиляторе как intrinsic (встроенные) функции. В заголовках есть такое место:
Код
#define __QADD  __qadd
#define __QSUB   __qsub
.... и т.д.


а __qsub говорит компилятору, что нужно вставить в машиннй код такую-то инструкцию, что и происходит, это по объектным файлам видно, и программа нормально работает. А вот откуда берутся предупреждения, непонятно....
Поправьте меня если я что-то неправильно понимаю.
Kabdim
Вот файл с дефайнами куда-то потерялся и не инклудится в файле в котором используются дефайны.
Gleb80
Я ошибался, а Сергей Борщ был прав. Проблема заключалась в неправильном подключении заголовков. Чтобы объявить типы вроде uint32_t я подключал в разных местах программы заголовок cmsis_os.h вместо stdint.h. Оказывается, что когда cmsis_os.h подключается перед arm_math.h, препроцессор пропускает кусок кода с объявлениями типа #define __SMUAD __smuad. Так как на самом деле мой код не вызывал SIMD инструкций, я получал только предупреждения. Как только я попытался включить в код функцию, которая действительно вызывает SIMD инструкцию, возникла ошибка линковки. После наведения порядка в подключениях заголовков добро восторжествовало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.