Добавление -std = GNU ++ 11 и -std = GNU11 Компиляции

Rogerclark
Вт 12 июля 2016 г., 11:50 вечера
Ребята

У меня есть пиар, который, помимо прочего, добавляет -std = gnu ++ 11 или -std = gnu11 в флаги компилятора; Что является то, что Ардуино.CC Использование для компиляций на их руках

Внесение такого изменения представляется высоким риском, поэтому я бы хотел отзыв от форума о том, необходимы ли такие изменения или полезные.

Олли
Ср. 13 июля 2016 г. 12:10
На практике я думаю, что основной выбор
1. Идите с новыми вещами, такими как GCC 5.x, и возьмите то, что идет с этим
- например, C11 теперь по умолчанию со времен GCC 5.0
2. Создайте механизм, позволяющий компилятору и линкеру параметры для управления флагами инструментов

Ура, Олли

Рик Кимбалл
Ср. 13 июля 2016 г. 12:12
Я попробовал несколько набросков с этим, и это не делает ничего негативного. Насколько я вижу. Если вы развлекаете флаги, изменения как насчет добавления этих флагов компилятора (C и C ++):
-MSlow-Flash-Data

И этот флаг линкера:
Spects = nano.спецификации

Эти два флага работают над тем, чтобы сделать меньший исполняемый файл, который работает быстрее.

Сжимать
Ср. 13 июля 2016 г. 12:21
Эти флаги включены в официальных системах Arduino SAM3 и SAMD Building Systems.
Хотя эти флаги считаются безопасными, я не знаю влияние в сгенерированном коде, составил довольно старый код, такой как Libmaple.
Вот список функций GNU ++ 11 Стандарта: https: // gcc.гну.org/projects/cxx-status.HTML#CXX11
Большинство из них связаны с расширениями C ++ и другими техническими вопросами для продвинутых функций самого языка.

Спецификации = нано.Флаг спецификаций на линкере оказывает очень сильное влияние в двоичном размере, если используются конструкторы C ++ или некоторые функции LIBS STD. Этот флаг также используется в версиях Arduino SAM3/SAMD.

Что касается GCC V5, у меня все еще есть проблемы с операцией USB (вы помните проблему с GCC 4.9? что -то подобное происходит) происходит)

Rogerclark
Ср. 13 июля 2016 г., 3:53
Спасибо, ребята

Такое изменение - это не то, что может быть сделано без большого количества тестирования, но, как мы знаем, большинство людей просто загружают главную версию репо и никогда не обновляют.

Re: GCC 5

Я не уверен, что это используется Сэм или Самд доска, это это?

Как говорит Сламмер, GCC 5, кажется, оптимизируется сложнее, и некоторые вещи больше не работают, если ядро ​​составлено с помощью его.

Проблемы, обычно связанные с переменными, указывающими на регистры аппаратного обеспечения, которые должны быть объявлены как летучие, но которые не являются и по какой -то причине, кажется, работают в настоящее время.

Я помню, как кто -то публикует исправление для некоторых проблем с оптимизацией с USB (несколько месяцев назад), которое, я думаю, я втянул в код, но, вероятно, есть множество других мест, где изменения оптимизации сломают код.


Re: -mslow-flash-data и pecs = nano.спецификации

Было бы хорошо, если бы двоичные файлы были меньше, но опять же, это должно быть тщательно протестировано


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

Что ж, мы должны побудить людей использовать менее стабильный код, но это может быть сложно, так как большинство людей просто хотят работать с конкретным проектом и не обязательно заинтересованы в тестировании последнего базового кода или работе с менее чем стабильным основной.

Rogerclark
Солнце 05 марта 2017 г. 2:33
Ребята

Тема GNU ++ 11 снова появилась в другой ветке.

Поэтому я думаю, что, возможно, пришло время, по крайней мере, добавить это в рецепт CPP на платформе.текст
эн.глин.

Добавить -std = gnu ++ 11 после предупреждающих флагов
char mem[1024]; uint32_t flashStartAddress = (uint32_t)&_SPIFFS_start - 0x40200000; uint32_t begin = millis(); uint32_t elapsed = 0; p.println("Flash Mem Perf Test :"); for (int i = 0; i < 1024; i++) { ESP.flashRead(flashStartAddress, (uint32_t *)&mem, sizeof(mem) / sizeof(uint32_t)); flashStartAddress += sizeof(mem) / sizeof(uint32_t); } elapsed = millis() - begin; p.printf("\nelapsed time = %u \r\n", elapsed); p.printf("throughput = %u bytes/sec \r\n", 1024 * 1024 * 1000 / elapsed);

victor_pv
Солнце 05 марта 2017 г., 4:31
Rogerclark написал:Ребята

Тема GNU ++ 11 снова появилась в другой ветке.

Поэтому я думаю, что, возможно, пришло время, по крайней мере, добавить это в рецепт CPP на платформе.текст
эн.глин.

Добавить -std = gnu ++ 11 после предупреждающих флагов
extern "C" uint32_t _SPIFFS_start;

Rogerclark
Солнце 05 марта 2017 г. 5:09
Привет, Виктор

Я согласен.

Держите основную ветвь как передовую, так как вообще ничего не меняю, что ломает много функциональности.

Я также рад сделать Nano Lib, но нам всем нужно провести некоторое тестирование с ним.

Беннебой
Солнце 05 марта 2017 г. 11:51
Звучит отлично.

Для тех, кто хочет экспериментировать с нано -спецификациями, где это нужно настройки?

--Spects = nano.спецификации в качестве опции на GCC?

Попробовал это, и это не имеет значения для компиляции размера.

ZMEMW16
Солнце 05 марта 2017 г. 18:15
Быстрый поиск дает http: // распространять.атмель.Нет/Инструменты/OpenSo ... Ридме.текст

он говорит, что это вариант линкера
* C Использование библиотек *

Этот инструмент выпускается с двумя предварительно построенными библиотеками C на основе Newlib:
Один из них-стандартный Newlib, а другой-Newlib-Nano для размера кода.
Чтобы различить их, мы переименуем оптимизированные библиотеки, оптимизированные размером как:

либ.а --> libc_s.а
либ.а --> libg_s.а

Чтобы использовать Newlib-Nano, пользователи должны предоставить дополнительную опцию времени ссылки на GCC:
--Spects = nano.спецификации

Нано.Спецификации также обрабатывают две дополнительные библиотеки GCC: libstdc ++ _ s.а и
libsupc ++ _ s.А, которые оптимизированы для размера кода.

Например:
$ arm-none-eabi-gcc src.c -specs = nano.Спецификации $ (other_options)

Эта опция также может работать вместе с другими параметрами характеристик, такими как
--Spects = rdimon.спецификации

Пожалуйста, заметите, что -specs = nano.Спецификации - опция линкера. Будьте уверены
включить в опцию линкера, если компиляция и связывание разделены.

** Дополнительное использование библиотек Newlib-Nano

Newlib-Nano отличается от Newlib в дополнение к имени библиотеки.
Отформатированный вход/вывод номера с плавающей точкой реализован как слабый символ.
Если вы хотите использовать %F, вы должны привлечь символ, явно указав
«-u» вариант команды.

-u _scanf_float
Стивен

Беннебой
Солнце 05 марта 2017 г., 21:34
Итак, когда я поместил это в правильное место -> http: // www.STM32duino.com/viewtopic.PHP?P = 20627#P20627

Это имеет большое значение:

До - 84136 программа, 7904 Динамика
После - 76772 программа, 5856 динамика

С дополнительным преимуществом моего проекта все еще работает : D

Rogerclark
Солнце 05 марта 2017 г. 11:26
Bennehboy ​​написал:Итак, когда я поместил это в правильное место -> http: // www.STM32duino.com/viewtopic.PHP?P = 20627#P20627

Это имеет большое значение:

До - 84136 программа, 7904 Динамика
После - 76772 программа, 5856 динамика

С дополнительным преимуществом моего проекта все еще работает : D

victor_pv
Вт
Я только что протестировал -std = gnu ++ 11 и -std = gnu11 компилируется, не имеет значения в размере кода, а корзина просто работает нормально.

Стивестронг
Вт, март 07, 2017 12:01
Вы также протестировали опцию линкера "-specs = nano.спецификации " ? Это должно сделать трюк по размеру. Даниэфф написал:Это то же самое, что ViewTopic.PHP?f = 14&t = 1502 , и в основном использование нового/маллока в коде.

Не могли бы вы что -нибудь попробовать: положить это ESP.flashRead(_index,(uint32_t *)& LED_BUFFER, sizeof(LED_BUFFER));

Рик Кимбалл
Ср. 8 марта 2017 г. 15:22
Мне нравится нано.спецификации .. Однако большинство здесь, вероятно, будут удивлены тем, что функции printf, которые используют %F, ничего не отображают .. Просто хотел, чтобы люди знали, а не ухожу. Если вы используете методы потока Arduino, Floats Print Fine. Однако, кажется, многим людям нравится подход стиля Printf. Я предпочитаю стиль потоковой передачи, который использует форматирование времени компиляции.

victor_pv
Ср. 08, 2017, 17:13
Стивестронг написал:Вы также протестировали опцию линкера "-specs = nano.спецификации " ? Это должно сделать трюк по размеру. Даниэфф написал:Это то же самое, что ViewTopic.PHP?f = 14&t = 1502 , и в основном использование нового/маллока в коде.

Не могли бы вы что -нибудь попробовать: положить это send-read command - wait for spi read - send to usb host, send-read command - wait for spi read - send to usb host , send-read command - wait for spi read - send to usb host

Rogerclark
Ср. 08 марта 2017 г., 21:12
Я думал, что уже есть проблемы с печатию плавающей запятой даже с текущими конфигурациями

Я тоже не знаю printf %f работает на AVR

Rogerclark
Сб 11 марта 2017 г., 6:29
Ребята

Я думаю, что добавление этих файлов не вызовет никаких проблем, так как многие люди проверили их без вредных последствий

Также была обсуждена о том, как удержать мастер / главу репо «передовой край» и отдельные ветви для стабильных версий
Я в порядке с этим, но я думаю, а не ветви, что мы можем использовать систему GitHub «Выпуски», которая, я думаю, просто помечает конкретный коммит в качестве «выпуска»

Единственное, в чем я не уверен, это то, что мы называем текущей версией релиза, прежде чем внести эти изменения.

Я не думаю, что мы можем использовать систему нумерации версий, потому что, если мы позвонили в текущую версию 1.0 это подразумевает, что его функциональность завершена / со всеми текущими API Arduino; а это нет.

Мы могли бы использовать V 0.9 и т. Д., но я думаю, что это было предложено ранее, что мы используем что -то вроде «stable_ $ date», где $ дата находится в формате yyyymmdd

эн.глин. Stable_20170310

Я думаю, что это, вероятно, будет нашим лучшим вариантом в данный момент, но я открыт для других предложений

Эдогальдо
Пт 12 мая 2017 г. 16:12
Дорогие, я играл с опциями компилятора/линкера (последнее ядро ​​Maple F1), и это случилось со мной, что добавление »-specs = nano.Спецификации "для линкера, конечно, немного уменьшил размер эскиза, но также сломал автоматическое сброс платы на синей таблетке: с тех пор, как я должен был сбросить плату вручную, чтобы завершить загрузку..
Удаление опции восстановило функцию сброса автоматического платы.
Не мог проверить на других досках..

Лучший, e.

PS: Компилятор Версия: ARM-None-Eabi-GCC \ 4.8.3-2014Q1

Rogerclark
Пт 26 мая 2017 г., 6:08
Эти флаги компилятора были добавлены для репо F1 и F4

Видеть

https: // github.com/rogerclarkmelbourne/ ... 75B95126D8


Re: Nano-Specs

Я думаю, что необходимо провести больше тестирования, прежде чем я включил нано-спектр в аргументы компиляции, так как это звучит так, как будто это потенциально вызывает некоторые серьезные проблемы

Рик Кимбалл
Пт 08 декабря 2017 г., 8:56 вечера
[Рик Кимбалл - Ср. 08 марта 2017 г. 15:22] - Мне нравится нано.спецификации .. Однако большинство здесь, вероятно, будут удивлены тем, что функции printf, которые используют %F, ничего не отображают .. Просто хотел, чтобы люди знали, а не ухожу.
Я заметил, что размер нашего кода, кажется, когда -либо расширяется. Я пробовал какой -то пример испытаний, который использовал Sprintf и Flogs, и его полученный скомпилированный размер составлял ~ 36 тыс. Для чертежа. Это кажется чрезмерным. Я еще немного копался и наткнулся на этот пост.

http: // www.OpenSTM32.org/forumThread2108#threadid2999

В основном автор предлагает использовать '-Specs = nosys.спецификации -Specs = nano.Spects -u _printf_float 'специально в этом порядке. Цель состояла в том, чтобы использовать большую часть Nano.Библиотека спецификаций, но возвращайтесь к обычному поведению с плавающей запятой Printf. Я попробовал, изменив настройку своей платы:
$ git diff
Diff -GIT A/STM32F1/Доски.TXT B/STM32F1/Доски.текст
Индекс 49C1293..029aecf 100644
--- A/STM32F1/Доски.текст
+++ B/STM32F1/Доски.текст
@@ -410,7 +410,8 @@ genericstm32f103c.меню.CPU_SPEED.speed_128mhz.строить.F_CPU = 128000000L
#- Оптимизация
genericstm32f103c.меню.Опт.OSSTD = наименьший (по умолчанию)
genericstm32f103c.меню.Опт.OSSTD.строить.флаги.Оптимизировать = -os
-genericstm32f103c.меню.Опт.OSSTD.строить.флаги.ldspecs =
+genericstm32f103c.меню.Опт.OSSTD.строить.флаги.ldspecs = -specs = nosys.спецификации -Specs = nano.Spects -u _printf_float
genericstm32f103c.меню.Опт.oslto = самый маленький код с LTO
genericstm32f103c.меню.Опт.Ослто.строить.флаги.оптимизация = -os -flto
genericstm32f103c.меню.Опт.Ослто.строить.флаги.ldspecs = -flto
Я перешел с ~ 36к до ~ 25K .. и плавающая запястья все еще работала с Sprintf.

Это может быть что -то, что можно попробовать, если вас раздражает постоянно расширяющаяся линия талины Flash.

Стивестронг
Пт, 08 декабря 2017 г., 21:15
Я только что попробовал LD Рика.Спецификации с модифицированной версией RTC LIB, используя Sprintf, снизились с ~ 36K до ~ 18K, Sprintf работает нормально.

+5 : P

Laudlustrlabs
Пн 11 декабря 2017 г. 10:46
Итак, каково слово о обратной комплектации с C ++ 98?
Нужно ли засорить наш новый код с #if __cplusplus >= 201103L тесты?

Я бы предпочел, если бы C ++ 11 (или выше) был трудным требованием. Это сделало бы новый код намного чище и проще для тестирования.
Может быть, это уже требуется...

luca_stm32
Sun 26 августа 2018 г., 18:24
Всем привет!
Я хотел бы сделать предложение: почему бы не представить -specs = nosys.спецификации -Specs = nano.Спецификация -u _printf_float Directive при использовании «наименьший код (по умолчанию)» в опции оптимизации?
В качестве альтернативы можно было бы быть хорошей идеей добавить еще одну опцию оптимизации с -os -flto вместе со спецификациями = nosys.спецификации -Specs = nano.Spects -u _printf_float Directive?

Что ты думаешь?

С наилучшими пожеланиями.
Лука