Тиан перестает работать через несколько часов

У меня очень странная проблема. У меня есть Tian, который запрограммирован на отправку данных датчиков на сервер. каждые х секунд. Моя программа работает хорошо, но после 14,15 часов работы она перестает работать, и я не получаю данные. Программа сначала работает быстро, затем за 2-3 часа до остановки становится все медленнее с сообщением "тайм-аут".

Я думаю, что причиной проблемы может быть неправильное использование библиотеки Ciao с моей стороны. Или, может быть, модификация на программном уровне могла бы решить проблему. Так что, если я могу помочь в этом.. (проблема не связана с использованием String, я уже тестировал использование массива с cstrings, и это не работает).

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

void CiaoReadWrite1() { CiaoData data = Ciao.read("restserver");
if (!data.isEmpty())
{
  String id = data.get(0);
  String sender = data.get(1);
  String message = data.get(2);

  splitString(message,"=",LtT2,9);

  gen            =LtT2[0].toInt(); LtT2[0]="";
  belt           =LtT2[1].toInt(); LtT2[1]="";
  genReady       =LtT2[2].toInt(); LtT2[2]="";
  hvOnOff        =LtT2[3].toInt(); LtT2[3]="";
  beep           =LtT2[4].toInt(); LtT2[4]="";
  heart1         =LtT2[5].toInt(); LtT2[5]="";
  sendConf       =LtT2[6].toInt(); LtT2[6]="";
  heart2FB       =LtT2[7].toInt(); LtT2[7]="";

  beepFB         =beep;
  heart1FB       =heart1;
  sendConfFB     =sendConf;

  Ciao.writeResponse("restserver",id, String(baroAlti*100)+"="+baroHumi*10+"="+baroPres+"="+baroTemp*10+"="+beepFB+"="+heart1FB+"="+heart2+"="+sendConfFB+"="+
                                      secCust1+"="+secCust2+"="+secEmrgSW+"="+secloop+"="+secLoop1+"="+secLoop2+"="+gndSwGnd+"="+gndSwUGnd+"="+statusA1+"="+
                                      statusA2+"="+statusA3+"="+beltStat1+"="+beltStat2+"="+beltStat3+"="+beltStat4+"="+request+"=");
  request++;
}

, 👍0


2 ответа


0

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

,

1

Вы используете функции String (S в верхнем регистре), которые выделяют и освобождают память, что является ограниченным товаром даже при 64 КБ. Стандартные функции управления кучей имеют тенденцию фрагментировать кучу на части, которые слишком малы для дальнейшего использования. Это может сделать новые выделения памяти медленнее, потому что в куче нужно искать достаточно большой кусок, и в конечном итоге это может привести к тому, что куча будет расти по направлению к стеку, пока не произойдет столкновение (что-то будет перезаписано). Мы не можем точно сказать, что это ваша проблема; у нас недостаточно информации.

Но попробуйте выделить один или несколько буферов, достаточно больших для наихудшего случая, и вместо этого используйте строковые функции C (нижний регистр 's'), sprintf(), strcpy(), strcat() и т. д. .

,