крах скетча от сложения строк и числа

Тема в разделе "Arduino & Shields", создана пользователем djdance, 26 июл 2012.

  1. djdance

    djdance Нерд

    любопытно, почему такая конструкция работает нормально



    Код (Text):
      String ret="";
      ret=" direction: "+String(iii);
    а вот такая довольно быстро приводит к сбою в памяти и краху скетча вплоть до перезагрузки ардуино?
    Код (Text):
      String ret="";
      ret=ret+" direction: "+String(iii);
    крах вызовет и ret=ret+" direction: "+iii;
    а вот если убрать про iii, то краха не происходит.
    и все ок, если использовать ret+="..

    мне кажется это непонятным.
     
  2. Unixon

    Unixon Оракул Модератор

    Хм... такое ощущение, что оператор += и пара операторов + и = по отдельности настолько по разному реализуют работу с памятью, что в итоге либо происходит копирование строки в никуда, либо возникает нехватка памяти.

    С ходу никакого криминала в библиотеках адруины не углядел, элементарные проверки аргументов функций на месте. Если это не банальное переполнение памяти из-за ее фрагментации, значит кто-то где-то в библиотеке сам себя обманул...
     
  3. djdance

    djdance Нерд

    угу...
    вообще нехорошо, что ардуино вот так легко подвесить. Кто перегрузит робота, если он автономен? Сторожа из mini ставить? а для него еще сторожа? :D
     
  4. hibiki

    hibiki Гик

    тестировать, тестировать и еще раз тестировать :)
     
  5. djdance

    djdance Нерд

    вообще, с такими вещами у ардуино явно беда. Память портится сразу, софт виснет или выдает белиберду.
    Код (Text):
    client.println("<input type=CHECKBOX id=\"JS"+lineAi+"\" name="+lineAi+" value=\"1\" "+lineA+"> Activate servo<br>");
    приходится разбивать
    Код (Text):
    client.print("<input type=CHECKBOX id=\"JS");
                    client.print(lineAi);
                    client.print("\" name=");
                    client.print(lineAi);
                    client.print(" value=\"1\" ");
                    client.print(lineA);
                    client.print("> Activate servo<br>");

    ксттаи, вопрос. А как вообще отлаживать, как выяснить, что скетч упал и с какой ошибкой? (деление на ноль например :))
     
  6. Unixon

    Unixon Оракул Модератор

    А вот тут наступает конец Arduino IDE :)
    Если у вас Windows, можете мигрировать на нормальные IDE для AVR, в т.ч. AVR Studio от Atmel, куда более фичастые. Eще в Eclipse что-то такое есть, но как оно там - не знаю, не пробовал. Если Mac - Бог в помощь, совершенно не в курсе есть ли что-то общее у маководов с AVR микроконтроллерами. Если Linux - плагины к Eclipse и simulavr и emulare, в конце-концов WINE+AVR Studio. :)
     
  7. djdance

    djdance Нерд

    о! продолжу складывать в эту тему лики и глюки, может кому-то пригодится

    значит, обнаружилось, что delay() портит вывод в web-server
    и вместо того чтоы написать...
    Код (Text):
    server.print("температура=");
    sensors.requestTemperatures(); // Send the command to get temperatures
    delay(750);
    server.print(sensors.getTempCByIndex(0));
    ...надо заносить всё в строковую переменную и делать принт извне процедуры опроса датчиков.
    иначе в http печатаются нули, а вывод данных вообще непредсказуемо затирается.
    (да и нули браузеры воспринимают тоже непредсказуемо)
     
  8. djdance

    djdance Нерд

    пропустил
    > А вот тут наступает конец Arduino IDE :)
    ну, эмулятор наверное можно и без установки AVR юзать?
    и потом, есть же какие-то дамперы для ардуины, встречал в гугле. Валят ерроры в озу или в еепром
     
  9. Unixon

    Unixon Оракул Модератор

    Есть разные виды ошибок. В процессе возникновения ошибки работы с памятью с помощью вывода отладочных сообщений не разобраться, т.к. в результате ошибки ломается сам механизм отладки. Тут нужен либо эмулятор, либо JTAG.
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Можно использовать аппаратный WatchDogTimer. Контроллер должен постоянно теребить одну из своих ножек - 01010101.... Как только сигнал перестанет меняться (контроллер завис и перестал дергать ногу) - микросхема WatchDogTimer выдаст управляющий сигнал на Reset.
     
  11. djdance

    djdance Нерд

    аппаратный - это какой?
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    http://ru.wikipedia.org/wiki/Сторожевой_таймер
    Насчет конкретной микросхемы не подскажу, но могу разузнать, если Вам интересно.
     
  13. djdance

    djdance Нерд

    так что мне википдия, я знаю что такое вочдог, с 2003 с ними работаю. ;)
    но нужна программируемая реализация, заточенная программно и аппаратно конкретно под ардуину.
     
  14. Megakoteyka

    Megakoteyka Оракул Модератор

    А чем поможет программный вочдог? Я себе такое слабо представляю. Если программа пойдет гулять по памяти, уже ничего не поможет, ИМХО... Или я чего-то недопонимаю?
     
  15. djdance

    djdance Нерд

    не программный. Программируемый. Нужна возможность задать ему интервал ожидания ноги и интервал ожидания перезагрузки. А также, желательно, флаг приостановки проверок. А также регулярный принудительный ресет. Все это продиктовано опытом :)
     
  16. hibiki

    hibiki Гик

    странный у вас опыт :)

    здесь уже нужен баланс достаточной надежности и экономической целесообразности достижения этой самой надежности. можно и 15 "сторожей" налепить (а то программируемый отдельный watchdog тоже может заглючить), но стоит ли?
     
  17. djdance

    djdance Нерд

    > странный у вас опыт :)

    ПО в бете может нормально дёргать ногу вочдога, но при этом фактически умереть в основном коде (из-за ликов, неверного алгоритма, вхождения в ошибочный режим и тп). В любом стационарном GSM-роутере есть ежесуточный принудительный ресет - тоже не от хорошей жизни.
     
  18. hibiki

    hibiki Гик

    у нас на скважинах не было. были, правда, спец.обученные нажатию кнопки "ресет" люди :)
     
  19. djdance

    djdance Нерд

    угу :))

    кстати, опять столкнулся с крахом скетча, и не пойму, куда копать.
    симптомы: если часто дергать ethernet-сервер, который крутит, допустим, моторами - довольно быстро портится память. Симптомы: текстовые константы и переменные случайным образом замусориваются, ну и как следствие скетч делает что попало и виснет.
    Объем скетча 21 из 32 кбайт, не так уж и много, freemem выдает 800 байт... :(
     
  20. hibiki

    hibiki Гик

    может, отказаться нафиг от сиплюсовых строк? неудобно, конечно, но, видимо, очень уж плохо с кучей (если там вообще куча есть, а не выделение памяти напрямую) получается