Функция Sprintf использует много памяти!

Рекснанет
Солнце 15 мая 2016 г. 13:20
Привет,
Я пытаюсь использовать библиотеки OBD и ILI9341 одновременно, но закончилась кодовая память.
Использование только ILI9341 Я использую около 40 КБ, но это нормально из -за шрифтов и прочего.
Но только библиотека OBD также использует более 40 кб, и я обнаружил, что это немного переборка, учитывая, что он использует только последовательный порт и некоторые манипуляции строки.

Итак, я отправился в поиски, чтобы найти, кто был виновным.
Снив код библиотеки OBD, я нашел виновника! Sprintf!!!! : шок:
sketch_sprintf.jpg
sketch_sprintf.JPG (83.05 киб) просмотрено 1532 раз

Martinayotte
Солнце 15 мая 2016 г. 15:20
Это потому, что реализация LIBC приносит всю реализацию математики для поплавок.
Вы можете сделать местное воспитание LIBC, немного похоже на то, что это было сделано для других MCU, даже AVR-LIBC, таким образом, что если поплавок Printf не нужен, это будет довольно маленьким.

Стевех
Солнце 15 мая 2016 г., 17:33
и 64 -битные целые числа

Рекснанет
Ср 18 мая 2016 г. 16:00
Martinayotte написал:Это потому, что реализация LIBC приносит всю реализацию математики для поплавок.
Вы можете сделать местное воспитание LIBC, немного похоже на то, что это было сделано для других MCU, даже AVR-LIBC, таким образом, что если поплавок Printf не нужен, это будет довольно маленьким.

Sheepdoll
Ср 18 мая 2016 г. 16:49
Это появилось в потоке HALMX, так как многие реализации ITOA CALL Sprintf.

Martinayotte
Ср 18 мая 2016 г., 19:09
Рекснанет написал: Мне придется перекомпилировать всю инструментальную нагрузку на это, верно? Я думаю, может быть, это будет немного чрезмерным...

Сжимать
Ср 18 мая 2016 г., 21:33
Возьмите Sprintf отсюда: http: // www.STM32duino.com/viewtopic.PHP?F = 18&t = 1014
Пару месяцев назад я провел исследование о небольших функциях Printf, и эта реализация является наиболее худой с полной поддержкой целых чисел (8/16/32 бит), спецификаторов ширины и строк (без FP). Дискуссия была о сериале.printf, но внутри есть пользовательский Sprintf (в первой версии). Он очень маленький, немного больше 1 кб.

Рекснанет
Пт 20 мая 2016 г. 9:06 утра
Спасибо! Это действительно лучше, чем необходимо скомпилировать все это.

Я обнаружил, что другие функции также делают тот же эффект «увеличения», atof ().
Я также постараюсь найти альтернативу для этого.

Сжимать
Пт 20 мая 2016 г. 13:43
Во время моего исследования о небольших функциях печати я обнаружил несколько хитростей, чтобы почти полностью удалить стандартные функции C для арифметики с плавающей запятой, сохраняя при этом опору %F для Sprintf.
Лучше принять функцию Sprintf от компилятора SDCC (компилятор для небольших 8 -битных MCU, таких как 8051, Microchip, STM8 и т. Д.). Посмотрите источник их «Стандартной библиотеки C» для Printf. Насколько я помню, можно поддерживать плавающую запятую с 1.5-2 КБ больше кодовой памяти.

Рекснанет
Сб 21 мая 2016 г. 18:18
У меня есть некоторые проблемы при реализации этого.

Мне удалось получить одну версию Sprintf Compling в эскизе. Я все еще должен проверить, чтобы увидеть, работает ли это правильно, но кажется нормальным с точки зрения пространства (12 КБ всего на 1 кб больше :) ).

Но как я могу получить библиотеки, которые я использую для использования этой версии? Я могу получить функцию Loop () для его использования, но внешне как это можно сделать?
Я все еще не очень знаком с архитектурой кода Arduino. Могу ли я добавить этот новый код в класс печати и сделать функцию «sprintf2», которую библиотеки могут использовать вместо этого?
Я попытался реализовать «Lean Serial.print () "но я думаю, что Arduino" ide "он не составляет печатный.CPP... И если он включает внешний .c файл, он также должен составить его, но отмечать...
Я видел правила.MK File, и он должен сделать это, но чего -то не хватает...По крайней мере, на мои глаза :)

Рекснанет
Сб 21 мая 2016 г. 18:40
Маленький шаг... :)

Я создал Sprintf2.C и .H и поместил их на STM32F1/Cores/Maple, и он компилируется, но я получаю предупреждение:

C: \ users \ rui \ appdata \ local \ temp \ build5420264372001361322.tmp \ zzztest.CPP.O: В функции `loop () ':
G: \ user \ Downloads \ arduino-1.6.5-R5/Zzztest.Ино: 196: Предупреждение: неопределенная ссылка на `sprintf2 (char*, char const*, ...) '

Я добавил #include "sprintf2.H "В эскизе, чтобы он не должен был делать это...
Размер кода уменьшился, поэтому я собираюсь .o Файл не был добавлен в двоичный файл, хотя он составил и .o был сгенерирован...

Эскиз:
#define timer Timer5 #define TIMER5_CH1_PIN PA0 void setup() { pinMode(TIMER5_CH1_PIN, PWM); gpio_set_af_mode(TIMER5_CH1_PIN, 2); timer.pause(); timer.setPrescaleFactor(1); // use 42MHz internal clock timer.setOverflow(2); // output ~21MHz signal (48ns period) timer.setCompare(TIMER_CH1, 1); // 50% duty cycle: 24ns low + 24ns high timer.refresh(); timer.resume(); }

Martinayotte
Сб 21 мая 2016 г., 21:18
Если ошибка находится во время ссылки, вероятно, из -за различий в подписи C/C ++:
gpio_set_af_mode(TIMER5_CH1_PIN, 2);

Рекснанет
Солнце 22 мая 2016 г. 16:51
Martinayotte написал:Если ошибка находится во время ссылки, вероятно, из -за различий в подписи C/C ++:
InitMCO1();

Grumpyoldpizza
Вторник 24 мая 2016 г. 18:58
Рекснанет написал:Привет,
Я пытаюсь использовать библиотеки OBD и ILI9341 одновременно, но закончилась кодовая память.
Использование только ILI9341 Я использую около 40 КБ, но это нормально из -за шрифтов и прочего.
Но только библиотека OBD также использует более 40 кб, и я обнаружил, что это немного переборка, учитывая, что он использует только последовательный порт и некоторые манипуляции строки.

Итак, я отправился в поиски, чтобы найти, кто был виновным.
Снив код библиотеки OBD, я нашел виновника! Sprintf!!!! : шок:

Удаление одной линии, где называется Sprintf, и размер кода падает примерно на 20 КБ!!! : шок: sketch_blank.JPG

Стевех
Ср 25 мая 2016 г., 3:24
Я думаю, что у GCC в Arduino, как IAR и Keil, выборы в IDE или командной строке, для которого используется вкус Printf (на самом деле, VPRINTF, который не зависит от потока в io). У моего есть около 4 вариантов, например
Опустить плавающую запястье
Опустить 64 -битные целые числа
Опустите некоторые неясные параметры спецификатора формата
использовать минимальный, e.глин., char, int, подписан и без подписи.
Они предварительно скомпилированы .библиотеки файлов; Также, Arduino, если они предлагают выбор, как и выше, как они, конечно, делают, иначе маленькие mcus задыхались бы.

Также та же концепция, но для scanf () и vscanf ()

Рекснанет
Ср 25 мая 2016 г. 13:24
Grumpyoldpizza написал: Arduino Zero используется -specs = nano.Спецификации для рецепта.в.комбинировать.шаблон на платформах.текст. Это будет использовать Newlib-Nano, который, в свою очередь, имеет оптимизированную реализацию Printf/Scanf по умолчанию, которая избавляется от поплавков и других менее необходимых Cruft. В качестве побочного эффекта он также существенно уменьшает печать оцматной ноги, используя меньше памяти для нечистых данных.

Grumpyoldpizza
Ср 25 мая 2016 г. 13:34
Рекснанет написал:Grumpyoldpizza написал: Arduino Zero используется -specs = nano.Спецификации для рецепта.в.комбинировать.шаблон на платформах.текст. Это будет использовать Newlib-Nano, который, в свою очередь, имеет оптимизированную реализацию Printf/Scanf по умолчанию, которая избавляется от поплавков и других менее необходимых Cruft. В качестве побочного эффекта он также существенно уменьшает печать оцматной ноги, используя меньше памяти для нечистых данных.

Сжимать
Ср 25 мая 2016 г. 14:42
Спецификатор линкера -specs = nano.спецификации, работающие также с STM32
Я строю программы с Makefiles, а код примерно на 2K-3K меньше (Grumpyoldpizza верна), а процедуры семейства printf также меньше (около 10 КБ), но не как пользовательский Printf/sprintf. У некоторых программ проблемы с Nano.спецификации, но в целом в порядке.
Я не вижу причины использования Printf из библиотеки (нормального или нано), вы можете использовать пользовательскую версию с гораздо меньшим следом, посвященным вашему приложению.

Grumpyoldpizza
Ср 25 мая 2016 г. 15:09
Сламмер написал:Я не вижу причины использования Printf из библиотеки (нормального или нано), вы можете использовать пользовательскую версию с гораздо меньшим следом, посвященным вашему приложению.

Сжимать
Ср 25 мая 2016 г. 15:38
Это зависит от того, насколько сильно вам нужна кодовая память.
Например, при игре с F401RE, со вспышкой 512KB, нет необходимости что -либо снимать (в 99.9% случаев), но в проекте с небольшими TSSOP MCU (например,. STM32F031F4P7) каждый байт считается.
Во всяком случае, в наши дни память о коде дешево, особенно с MCUS ARM.

Стевех
Ср 25 мая 2016 г., 17:10
Сламмер написал:Это зависит от того, насколько сильно вам нужна кодовая память.
Например, при игре с F401RE, со вспышкой 512KB, нет необходимости что -либо снимать (в 99.9% случаев), но в проекте с небольшими TSSOP MCU (например,. STM32F031F4P7) каждый байт считается.
Во всяком случае, в наши дни память о коде дешево, особенно с MCUS ARM.

Grumpyoldpizza
Ср 25 мая 2016 г. 18:33
Стевех написал:Сламмер написал:Это зависит от того, насколько сильно вам нужна кодовая память.
Например, при игре с F401RE, со вспышкой 512KB, нет необходимости что -либо снимать (в 99.9% случаев), но в проекте с небольшими TSSOP MCU (например,. STM32F031F4P7) каждый байт считается.
Во всяком случае, в наши дни память о коде дешево, особенно с MCUS ARM.

Стевех
Ср 25 мая 2016 г., 21:12
Я нахожусь в мире $ 20 STM32F4. И с хорошей IDE и отладчиком, которые, согласно мне, не является IDE Arduino's Long Shot.

Точно так же, как любое хобби веселее с хорошими инструментами и оборудованием. Лучше со временем.

Попытка донести дерьмо до 5-10 долларов, является чистым мазохизмом, когда вы пытаетесь использовать мусор, не включать документации.

Если бы я был студентом университета сейчас, не зная ничего лучше, я бы признателен, что за то, что по цене пиццы, риск и трудности использования доски в размере 20 долларов вместо 5 долларов, вероятно, поможет мне получить А и введите проект вовремя. И сделать меня героем для команды проекта. Тот же принцип применим к хобби.

К сожалению, слишком часто профессора имеют опыт NADA в промышленности и в реальном мире за пределами пузыря академии, где время ценно.

Сжимать
Ср 25 мая 2016 г., 21:43
Поскольку я новичок в мире STM32, моей первой доской STM32 была Nucleo-401RE (у меня был клон олимексино на много лет, но никогда не трогал), купленный в местном магазине за 14 евро. Но любопытство по поводу того, что может сделать доска 3 $, заставьте меня играть с BluePill.
Я согласен с вами, «большой» MCU с правильной документацией - лучший способ для кого -то, чтобы начать, крупные доски Nucleo предлагают исключительную ценность.

Mrburnette
Ср 25 мая 2016 г., 22:36
Стевех написал:Я нахожусь в мире $ 20 STM32F4. И с хорошей IDE и отладчиком, которые, согласно мне, не является IDE Arduino's Long Shot.

Точно так же, как любое хобби веселее с хорошими инструментами и оборудованием. Лучше со временем.

Попытка донести дерьмо до 5-10 долларов, является чистым мазохизмом, когда вы пытаетесь использовать мусор, не включать документации.
<...>

Стевех
Ср 25 мая 2016 г., 22:59
Каждому своему собственному.

Rogerclark
Чт 26 мая 2016 г. 2:20 утра
@slammer

Потратьте 5 долларов и купите Maple Mini.

Эти доски гораздо более высокое качество, чем у досок с синими таблетками в 2 или 3 доллара, и у них меньше проблем с USB


@stevech

Весь смысл этого форума для людей, которые хотят использовать Arduino на STM32. Есть и другие форумы для людей, которые хотят использовать другие инструменты.

Несмотря на то, что я за свободу слова, вы, кажется, пытаетесь вывести людей с форума и вдали от духа Arduino

Рекснанет
Пт 27 мая 2016 г. 13:04
STM32F4 также можно использовать в режиме Arduino, справа? :) (Хотя я не полностью поддержан, если я понял это от того, что я прочитал)

@stevech имеет некоторый момент на Arduino Ide, это большой кусок... Я использую его только для компиляции и отправки кода в STM32. Кроме этого, даже блокнот ++ гораздо более полезен, чем он! Я не знаю, как они называют это "ide"... :?

Но даже с F1's мы все еще можем заставить вещи работать :) и за долю от цены, что очень хорошо, когда делаю много разных проектов.

Rogerclark
Пт 27 мая 2016 г. 14:29
Я также просто использую IDE в качестве инструмента компиляции / загрузки.

Я использую Notepad ++ в Windows в качестве редактора, так как он намного лучше, чем IDE.

Я рассматриваю Ардуино как всю экосистему, e.глин. IDE в качестве инструмента компиляции и загрузки, основных API и основных LIBS (SPI I2C и т. Д.) И массы сторонних либеров и других кодов E.глин. Показ драйверов, а также целые кодексы, такие как Arduino JSON, а также монитор открытой энергии и т. Д. и т. Д

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

Я понимаю, что не все коды Arduino Code - это хорошее качество, но мой код является глюком, как у следующего человека, и получение рецензирования Pier и исправленных кода Libs из GitHub, обычно будет более стабильным, чем я пытаюсь написать код с нуля на основе листов данных устройств

Но я всегда смотрю на то, насколько активным является репонирование GitHub, и как недавно было обновлено и сколько его вилок, чтобы почувствовать, какая стабильность и т. Д.
Поскольку с другой стороны, в моей дневной работе мы купили в различных предварительно написанных пакетах с закрытым исходным кодом (хотя и небольших и дешевых пакетов), а качество кода сильно варьируется. (Это часто, поскольку код был записан для конкретного проекта, а затем перепродал как общее назначение, и его трудно перепрофировать, чтобы внести небольшие изменения).
Иногда код - это просто низкое качество, но это удача розыгрыша при покупке в коде с закрытым исходным кодом, без возможности увидеть все это, прежде чем заплатить за это.

Mrburnette
Пт 27 мая 2016 г., 11:42 вечера
Rogerclark написал: <...>
Поскольку с другой стороны, в моей дневной работе мы купили в различных предварительно написанных пакетах с закрытым исходным кодом (хотя и небольших и дешевых пакетов), а качество кода сильно варьируется. (Это часто, поскольку код был записан для конкретного проекта, а затем перепродал как общее назначение, и его трудно перепрофировать, чтобы внести небольшие изменения).
Иногда код - это просто низкое качество, но это удача розыгрыша при покупке в коде с закрытым исходным кодом, без возможности увидеть все это, прежде чем заплатить за это.

Рекснанет
Солнце 29 мая 2016 г., 9:32
Grumpyoldpizza написал: Arduino Zero используется -specs = nano.Спецификации для рецепта.в.комбинировать.шаблон на платформах.текст. Это будет использовать Newlib-Nano, который, в свою очередь, имеет оптимизированную реализацию Printf/Scanf по умолчанию, которая избавляется от поплавков и других менее необходимых Cruft. В качестве побочного эффекта он также существенно уменьшает печать оцматной ноги, используя меньше памяти для нечистых данных.

Стевех
Солнце 29 мая 2016 г., 8:33 вечера
Rogerclark написал:@stevech

Весь смысл этого форума для людей, которые хотят использовать Arduino на STM32. Есть и другие форумы для людей, которые хотят использовать другие инструменты.

Несмотря на то, что я за свободу слова, вы, кажется, пытаетесь вывести людей с форума и вдали от духа Arduino