grebenkoff 0 3 марта, 2017 Опубликовано 3 марта, 2017 · Жалоба Приветствую, уважаемые! Делаю проект для 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 этих предупреждений не было. В чем тут дело? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 3 марта, 2017 Опубликовано 3 марта, 2017 · Жалоба В чем тут дело?Надо изучать букварь по Си или гуглить "function declared implicitly". У вас (или у них) куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 3 марта, 2017 Опубликовано 3 марта, 2017 · Жалоба edit: Сергей опередил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grebenkoff 0 3 марта, 2017 Опубликовано 3 марта, 2017 · Жалоба ... куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции. Эти SIMD (Single Instruction Multiple Data) инструкции присутствуют в компиляторе как intrinsic (встроенные) функции. В заголовках есть такое место: #define __QADD __qadd #define __QSUB __qsub .... и т.д. а __qsub говорит компилятору, что нужно вставить в машиннй код такую-то инструкцию, что и происходит, это по объектным файлам видно, и программа нормально работает. А вот откуда берутся предупреждения, непонятно.... Поправьте меня если я что-то неправильно понимаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 6 марта, 2017 Опубликовано 6 марта, 2017 · Жалоба Вот файл с дефайнами куда-то потерялся и не инклудится в файле в котором используются дефайны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
grebenkoff 0 6 марта, 2017 Опубликовано 6 марта, 2017 · Жалоба Я ошибался, а Сергей Борщ был прав. Проблема заключалась в неправильном подключении заголовков. Чтобы объявить типы вроде uint32_t я подключал в разных местах программы заголовок cmsis_os.h вместо stdint.h. Оказывается, что когда cmsis_os.h подключается перед arm_math.h, препроцессор пропускает кусок кода с объявлениями типа #define __SMUAD __smuad. Так как на самом деле мой код не вызывал SIMD инструкций, я получал только предупреждения. Как только я попытался включить в код функцию, которая действительно вызывает SIMD инструкцию, возникла ошибка линковки. После наведения порядка в подключениях заголовков добро восторжествовало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться