Как автоматически исключить математику двойной точности из сгенерированного кода?

#floating-point #arm #embedded #clang #precision

#с плавающей запятой #arm #встроенный #лязг #точность

Вопрос:

В нашем встроенном проекте, предназначенном для ядер ARM Cortex M *, мы используем набор инструментов на основе ARM clang (v6). Мы используем float type для нашей математики с плавающей запятой. Пытаясь минимизировать занимаемый объем, мы обнаружили, что некоторое пространство занимают ненужные double <-> float преобразования.

Источником некоторых из этих преобразований было использование литералов, не включающих f спецификатор (например, использовать 12.34 вместо 12.34f ). Чтобы устранить это, я ищу опцию компилятора, которая использует float тип по умолчанию. Просматривая документацию компилятора и общую справку clang, я не смог найти ни одного.

Есть ли какой-либо параметр (командный параметр, прагма, атрибут и т.д.), Который может достичь этой цели?

Комментарии:

1. Похоже, решение состоит в том, чтобы исправить ошибочный код. Вы просто не должны смешивать двойные литералы с плавающими значениями, и это не вина цепочки инструментов. То же самое касается вызовов функций, всегда есть разные функции для double и float.

2. Вы можете сканировать свои файлы map на предмет двойных связанных вызовов и обрезать их таким образом. Мы сделали это в системах с поддержкой soft float (т. Е. без аппаратного обеспечения), чтобы предотвратить массовую нагрузку на процессор, вызванную плавающими значениями.

3. @MichaelDorgan — Мы уже сделали это и тщательно преобразовали литералы в явные числа с плавающей запятой. Вопрос касался дополнительного уровня защиты и будущей проверки.

4. Вы всегда можете создать скрипт на Python для автоматического сканирования и помечать ошибки. Не совсем то доказательство будущего, которое вы хотите, но, по крайней мере, доказательство «сейчас» для многих nows.

5. @Lundin » всегда есть разные функции для double и float». -> Печать float , похоже, является исключением.

Ответ №1:

-fsingle-precision-constant — это то, что вы ищете, хотя мое личное мнение таково, что вам следует избегать этого и использовать явное приведение.

Комментарии:

1. Спасибо. Я не могу найти эту опцию в документации armclang, поэтому я предполагаю, что она там не поддерживается.

2. Фактически, поиск дал этот пост: lists.llvm.org/pipermail/llvm-dev/2015-July/088040.html Это похоже на опцию GCC.

3. Вместо этого Clang использует константу -cl-single-precision-constant. В настоящее время у меня не установлен ARM clang, но с самим clang флаг работает. Смотрите здесь .

4. Похоже, armclang не поддерживает эту опцию.