Странное поведение Arduino

Тема в разделе "Arduino & Shields", создана пользователем Arduino_man, 29 авг 2017.

Метки:
?

Вы уже встречались с таким поведением программы?

  1. Да, проблему решил.

    0 голосов
    0,0%
  2. Да, но не смог решить проблему.

    100,0%
  3. Не встречался.

    0 голосов
    0,0%
  1. Arduino_man

    Arduino_man Гик

    Не помогло.
     
  2. Arduino_man

    Arduino_man Гик

    Извините, сейчас я уже не могу писать. Дальше, может, через час-полтора.:(
     
  3. AlexU

    AlexU Гуру

    Хоть и указано, что доступно 812 байт, но есть подозрение, что не хватает памяти. Не хватка памяти может быть причиной перезагрузки контроллера.
     
    Arduino_man нравится это.
  4. b707

    b707 Гуру

    на этапе setup ? - вряд ли. Ставлю на то, что глючит либо карта. либо модуль Sd
     
  5. b707

    b707 Гуру

    это хорошо, а то я тоже на работе :)
     
  6. Arduino_man

    Arduino_man Гик

    Здравствуйте!

    Сейчас попробую увеличить объём свободной памяти.
     
  7. Arduino_man

    Arduino_man Гик

    Объём свободной памяти не увеличить. В программе только две глобальных переменных. Можно изменить на int только одну (на изменение другой ругается IDE). Это никак не изменяет состояние памяти (всё те же 1236 байт).
     
  8. AlexU

    AlexU Гуру

    Что касается памяти, то это было предположение. Вполне вероятно, что причина может быть в другом.
     
  9. Arduino_man

    Arduino_man Гик

    Только что проверил, программа от Амперки (которая с DHT11) спокойно пишет лог на SD. В ней глобальные переменные используют 1044 байта (49% против 60% вместе с GPS).
     
  10. AlexU

    AlexU Гуру

    Т.е. кардридер рабочий. Тогда вероятность нехватки памяти близится к 100%, хотя опять же полной уверенности нет.
    Хорошо бы узнать на сколько увеличивается стек во время вызова функции 'SD.begin()', но боюсь это не простая задача.
     
  11. Arduino_man

    Arduino_man Гик

    Я, наверное, сегодня больше картридер гонять не буду. Завтра поищу информацию, как достать размер памяти во время работы. Если вам не трудно, не подскажете, как это сделать?
     
  12. AlexU

    AlexU Гуру

    Простого способа не знаю, кроме как лезть и править библиотеки -- временно добавлять в них вывод отладки, например, через последовательный порт.
    Хотя в Atmel Studio всё можно посмотреть в отладчике (симуляторе), без необходимости править исходники.
     
  13. DetSimen

    DetSimen Guest

    а у библиотеки SD буфер статический, или динамически хапается маллоком при создании? Ей, памойму, 512 байт надо буфера
     
  14. b707

    b707 Гуру

    Нет такой программы. в которой нельзя было бы уменьшить размер памяти :)
    Статические строки, типа "Serial ok!" "SD begin" и тд - загоните в программную память макросом F - выиграете несколько сотен байт.
     
    Arduino_man нравится это.
  15. Arduino_man

    Arduino_man Гик

    Здравствуйте!
    Нашёл пару статей по общей оптимизации программы.
    Раньше об этом слышал, но не использовал. Тоже попытаюсь применить.
     
  16. Arduino_man

    Arduino_man Гик

    Уменьшил объем с помощью F(). Вообще перестала что-либо выводить. :mad: Закомментировал весь loop(), оьъём глобальных переменных упал с начальных 60% до 44% и произошло чудо!!! Благодаря F() и пустому loop()-у SD.begin() прошла успешно! Проблема действительно в нехватке памяти! Вот только loop() мне в программе нужен, как ещё оптимизировать-то? :( В любом случае, огромная благодарность @AlexU и @b707 за помощь в решении проблемы!
     
  17. b707

    b707 Гуру

    Вам DedSimen правильно подсказал - в библиотеке работы с SD надо посмотреть размер буфера - возможно, его можно уменьшить. Или, к примеру, выделять буфер только тогда. когда он нужен.
     
  18. Arduino_man

    Arduino_man Гик

    Оптимизировал как мог. Не хватает совсем малость. Ещё бы снять сотню байт - должно заработать. Но я уже не знаю, как.
    P.S. Заключил все строки в F().
     
  19. Arduino_man

    Arduino_man Гик

    Знать бы как!..
     
  20. Arduino_man

    Arduino_man Гик