Перейти к содержанию
    

Cortex-M4 SIMD инструкции

Приветствую, уважаемые!

Делаю проект для 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 этих предупреждений не было.

В чем тут дело?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... куда-то потерялось подключение (#include) заголовочного файла, в котором объявлены эти функции.

 

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

#define __QADD  __qadd
#define __QSUB   __qsub
.... и т.д.

 

а __qsub говорит компилятору, что нужно вставить в машиннй код такую-то инструкцию, что и происходит, это по объектным файлам видно, и программа нормально работает. А вот откуда берутся предупреждения, непонятно....

Поправьте меня если я что-то неправильно понимаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот файл с дефайнами куда-то потерялся и не инклудится в файле в котором используются дефайны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...