использование строк в проекте и его размер

Тема в разделе "Arduino & Shields", создана пользователем gonzales, 6 авг 2018.

  1. gonzales

    gonzales Гик

    Доброго времени суток, форумчане!

    В связи с забивкой всех 32кБ памяти 328 атмеги начал проводить оптимизацию кода и наткнулся на пренеприятную штуку.
    Есть функция, принимающая как параметр String
    Код (C++):
    void SendToNextionString(String s) {
      NextionSerial->print(s);
      NextioncomandEnd();
    }
    Соответственно в теле программы формируется вот такая строка
    Код (C++):

    SendToNextionString("test");
    Размер скеча сразу вырастает с 444 до 1670 байт, а если поставить вот такую конструкцию

    Код (C++):
    float v = 25.5;
    SendToNextionString("page0.text.txt=\"" + String(v) + "\"");
    то даже страшно становиться 3674 байта (11%)

    Прошу опытных гуру пролить свет, как можно это побороть.

    PS. При компилировании того же скеча под STM32duino размер скеча увеличивается с 13764 до 34888 байт, а это уже ни в какие ворота не лезет((((

    Вот полный тестовый скеч
    Код (C++):
    void setup() {
      // put your setup code here, to run once:
    float v = 25.5;
    SendToNextionString("page0.text.txt=\"" + String(v) + "\"");
    }

    void loop() {
      // put your main code here, to run repeatedly:

    }

    void SendToNextionString(String s) {
      //
    }
     
  2. ИгорьК

    ИгорьК Гуру

    Разве полный?
     
  3. ИгорьК

    ИгорьК Гуру

    Смотри, друже! Я полагаю что Вы в скетче применяете библиотеку от Nextion. Размер памяти - следствие ее работы.
    В теме про Nextion я давал ПРИМЕР отправки данных без библиотеки - попробуйте повторить и посмотрите что с памятью.
     
    arkadyf нравится это.
  4. parovoZZ

    parovoZZ Гуру

    Всю текстовку вывести в ПЗУ, плавающую запятую вообще не использовать.
     
  5. ИгорьК

    ИгорьК Гуру

    Думаю не получится, там идет передача переменной с плавающей точкой.
     
  6. b707

    b707 Гуру

    добавлю к предыдущим советам - класс String тоже не использовать, обходиться символьными массивами char*
    А для STM32Duino существует волшебный ключик компиляции. уменьшающий рахмер бинарника при том же коде от 1.5 до 3х раз - поищите на буржуйских сайтах
     
    arkadyf, parovoZZ, gonzales и ещё 1-му нравится это.
  7. ИгорьК

    ИгорьК Гуру

    ...
    То есть ftoa()
     
  8. gonzales

    gonzales Гик

    Nextion вообще не причем, интересует только работа со строками. От float тоже отказаться не могу, ибо)))
    Пробовал, это не сильно уменьшает размер
     
  9. gonzales

    gonzales Гик

    Поищу, спасибо!!!
    А для Arduino IDE нет такого ключика случайно?
     
  10. b707

    b707 Гуру

    Float я бы все-таки попробовал выкинуть. Домножить величину на 100 и работать с целым. С выводом величин на экран проблем не будет - надо только уже в строке добавить точку перед последними двумя цифрами.
     
    arkadyf и parovoZZ нравится это.
  11. b707

    b707 Гуру

    вы не на то обратили внимание в ответе. Если убрать флоат и научиться правильно работать со строками - никакой ключик будет не нужен.
     
    arkadyf и parovoZZ нравится это.
  12. parovoZZ

    parovoZZ Гуру

    ерунду не говори. В 8-ми битках использовать float - признак говнокода.
     
  13. parovoZZ

    parovoZZ Гуру

    в абдурино нет, а в правильных иде - есть.
    Впрочем, у кошака спроси - он знает, как в абдурино оптимизацию нужную включать.
     
  14. gonzales

    gonzales Гик

    Это первое, что я решил сделать, по сути мне нужно провести две операции с char*, перевести значение с плавающей запятой ( или целое) к строковому типу и сложить две строки. Я офигел, насколько это оказалось геморойным занятием))), а главное размер кода после всех манипуляций не сильно сократился.
     
  15. parovoZZ

    parovoZZ Гуру

    когда откажешься от
    Код (C++):
    void setup()
    и
    Код (C++):
    void loop()
    ещё раз офигеешь.
     
    gonzales нравится это.
  16. b707

    b707 Гуру

    Чтобы размер кода сократился существенно - нужно отказаться от использования String и float по всей программе, а не только в одном месте.
    Ведь код растет не от пары ваших строчек, а от того, что любое упоминание float в скетче тащит в код специальную библиотеку для поддержки арифметики с плавающей точкой - а это несколько килобайт. Вот вам и результат.
    Со Стринг точно так же.
     
    arkadyf нравится это.
  17. b707

    b707 Гуру

    я на ардуино.ру где-то выкладывал эксперименты с СТМДуино - что сколько весит. Setup и Loop на фоне остального не так и много - меньше килобайта.
     
    arkadyf нравится это.
  18. gonzales

    gonzales Гик

    Это понятно, что во всей программе.
     
  19. vvr

    vvr Инженерище

    а если в программировании не гуру как паровоз, то проще всё на мегу перетащить и не париться .
     
    Daniil и ИгорьК нравится это.
  20. b707

    b707 Гуру

    Вот все кстати хотел спросить - что такое пихают новички в программы. что они у них в Нану не помещаются?
    Я даже придумать ничего подобного не могу :)
    У меня больше 11к еще ни одного проекта не было :) Система сбора показаний с датчиков и отсылки в интернет с текстовым меню -занимает 9К. Радиуправляемый компрессор с кучей режимов - 7к. кода.
    Валяется куча Нан - не знаю, куда применить. Слишком большие. Заказал себе партию Атмега88 с размером флеша 8к - думаю, на большинство моих проектов хватит.

    И это я на Ардуино пишу. Писал бы на "честном Си", как Паровоз - еще меньше было бы :)
     
    CYITEP_BAC9I и arkadyf нравится это.