реклама на сайте
подробности

 
 
> Cortex-M4 SIMD инструкции, Вызов функции __QADD implicit declaration
Gleb80
сообщение Mar 3 2017, 14:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Приветствую, уважаемые!
Делаю проект для 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 этих предупреждений не было.
В чем тут дело?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Сергей Борщ
сообщение Mar 3 2017, 16:15
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Gleb80 @ Mar 3 2017, 16:10) *
В чем тут дело?
Надо изучать букварь по Си или гуглить "function declared implicitly". У вас (или у них) куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Mar 3 2017, 16:18
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



edit: Сергей опередил.
Go to the top of the page
 
+Quote Post
Gleb80
сообщение Mar 3 2017, 17:01
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Цитата(Сергей Борщ @ Mar 3 2017, 19:15) *
... куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции.


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


а __qsub говорит компилятору, что нужно вставить в машиннй код такую-то инструкцию, что и происходит, это по объектным файлам видно, и программа нормально работает. А вот откуда берутся предупреждения, непонятно....
Поправьте меня если я что-то неправильно понимаю.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Mar 6 2017, 07:07
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Вот файл с дефайнами куда-то потерялся и не инклудится в файле в котором используются дефайны.
Go to the top of the page
 
+Quote Post
Gleb80
сообщение Mar 6 2017, 07:39
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 25-09-08
Из: Москва
Пользователь №: 40 470



Я ошибался, а Сергей Борщ был прав. Проблема заключалась в неправильном подключении заголовков. Чтобы объявить типы вроде uint32_t я подключал в разных местах программы заголовок cmsis_os.h вместо stdint.h. Оказывается, что когда cmsis_os.h подключается перед arm_math.h, препроцессор пропускает кусок кода с объявлениями типа #define __SMUAD __smuad. Так как на самом деле мой код не вызывал SIMD инструкций, я получал только предупреждения. Как только я попытался включить в код функцию, которая действительно вызывает SIMD инструкцию, возникла ошибка линковки. После наведения порядка в подключениях заголовков добро восторжествовало.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 07:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016