Помогите найти утечку памяти
- Войдите на сайт для отправки комментариев
Пнд, 24/07/2017 - 21:03
Добрый день, форумчане!
Процедура занимается генерацией смс-сообщения с последующей передачей его другой функции.
void timerInterupt() {
{
char smsbuf [150];
smsbuf[0] = '\0';
char *psmsbuf = &smsbuf[0];
{
char *str = "System powered\r";
while (*str)
{
*psmsbuf++ = *str++;
}
}
if (gerconflag == false) {
*psmsbuf = &smsbuf[15];
{
char *str = "Door closed\r";
while (*str)
{
*psmsbuf++ = *str++;
}
}
}
else
{
*psmsbuf = &smsbuf[15];
{
char *str = "Door openered\r";
while (*str)
{
(*psmsbuf++ = *str++);
}
}
}
// Serial.print("2sms ="); for (byte j = 0; j < 30; j++) {
// Serial.print(smsbuf[j]);
// } Serial.println("!");
*psmsbuf = &smsbuf[27];
{
char *str = "Current t.= ";
while (*str)
{
(*psmsbuf++ = *str++);
}
}
// Serial.print("3sms ="); for (byte j = 0; j < 40; j++) {
// Serial.print(smsbuf[j]);
// } Serial.println("!");
*psmsbuf = &smsbuf[39];
{
char t[4];
dtostrf(Temperature(Pintemp), 2, 2, t);
char *str = t;
while (*str)
{
(*psmsbuf++ = *str++);
}
}
*psmsbuf = &smsbuf[43];
{
char *str = "C\rTemp.history:\r";
while (*str)
{
(*psmsbuf++ = *str++);
}
}
// Serial.print("4sms ="); for (byte j = 0; j < 60; j++) {
// Serial.print(smsbuf[j]);
// } Serial.println("!");
*psmsbuf = &smsbuf[59];
for (byte j = 0; j <= 11; j++)
{
{
char t[4];
dtostrf(Temp[j], 2, 2, t);
char *str = t;
while (*str)
{
(*psmsbuf++ = *str++);
}
*psmsbuf++ = '\r';
}
}
// Serial.print("5sms ="); for (byte j = 0; j < 120; j++) {
// Serial.print(smsbuf[j]);
// } Serial.println("!");
*psmsbuf = &smsbuf[119];
{
char *str = "Sys.time:\r";
while (*str)
{
(*psmsbuf++ = *str++);
}
}
// Serial.print("6sms ="); for (byte j = 0; j < 140; j++) {
// Serial.print(smsbuf[j]);
// } Serial.println("!");
// for (byte j = 0; j < 140; j++) {
// if (smsbuf[j] == '\r') Serial.println(j);
// }
*psmsbuf = &smsbuf[128];
{
{
char t[1];
itoa (GetTime('H'), t, 10);
char *str = t;
while (*str)
{
(*psmsbuf++ = *str++);
}
}
*psmsbuf++ = ':';
{
char t[1];
itoa (GetTime('M'), t, 10);
char *str = t;
while (*str)
{
(*psmsbuf++ = *str++);
}
}
*psmsbuf++ = ':';
{
char t[1];
itoa (GetTime('S'), t, 10);
char *str = t;
while (*str)
{
(*psmsbuf++ = *str++);
}
}
*psmsbuf++ = '\0';
}
// Serial.print("7sms ="); for (byte j = 0; j < 150; j++) {
// Serial.print(smsbuf[j]);
// } Serial.println("!");
// for (byte j = 0; j < 150; j++) {
// if (smsbuf[j] == '\r') Serial.println(j);
// }
Serial.print("sms ="); Serial.println(smsbuf);
sendsms(smsbuf);
}
Serial.println("continue temp check");
}
void sendsms(char *currsms) //процедура отправки СМС
volatile int GetTime (char ini) ///GetTime
float Temperature(int Pintemp) //значение температуры
Плата зависает на пробегании предпоследней строчки: {
begin interupt
smsbuf=7sms =System powered
Door closed
Current t.= 0.00C
Temp.history:
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
Sys.time:
8194:8194:8194
conti⸮
}
Иногда при повторном вызове функции, хотя переменные инициализируются снова, а может и не зависнуть.
Загрузка:{
Скетч использует 18176 байт (56%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 1254 байт (61%) динамической памяти, оставляя 794 байт для локальных переменных. Максимум: 2048 байт.
}
но будет больше, поэтому раскидывться нельзя. Подскажите, пожалуйста, что не так, а то за неделю все мозги сломал((
Выложите скетч как положено, чтобы можно было обсуждать. В шапке вверху есть специальная тема с обьяснением, как правильно выкладывать код.
Спасибо. Интересующая процедура как раз начинается со строчки 100.
ой жуть какая.
Признайтесь. сколько дней вы программируете? Один?
Зачем начинать с таких сложных скетчей. помигайте сначала диодами.
Если честно - рука устанет перечислять все ошибки в коде.
Самое главное - функция, вызываемая прерыванием - или аналогичная, вызываемая библиотекой работы с таймерами - должна отрабатывать максимально быстро! Реально - вызвали, проверили одно-два условия. выставили флаг о результате - и ВЫШЛИ. А у вас половина программы запихнута в функцию timerInterupt()
Признаюсь, довольно долго. Мигать диодами может быть скучно, а нужные проекты требуют усилий.
Ваше замечание учту, спасибо, но от проблем генерации массива символов не уйти.
Совет - оставьте в скетче только генерацию текста СМС- без таймеров и интерруптов. И сначала добейтесь, чтобы оно работало. Когда получится - добавляйте в основную программу.
Тот код, что вы привели- вы явно откуда-то списали и сами не понимаете. Я бы советовал не искать в нем ошибки, а написать свой. заново. самостоятельно. Код совершенно жуткий и ошибок в нем куча.
Совет - оставьте в скетче только генерацию текста СМС- без таймеров и интерруптов. И сначала добейтесь, чтобы оно работало. Когда получится - добавляйте в основную программу.
Хорошо. Какой вариант генерации текста оптимальный, если не указатель-массив? Функция strcat в этих же условиях зависает так же, String делает больше проходов, но на второй-третий вызов - зависает.
Тот код, что вы привели- вы явно откуда-то списали и сами не понимаете. Я бы советовал не искать в нем ошибки, а написать свой. заново. самостоятельно. Код совершенно жуткий и ошибок в нем куча.
Ну да, отсюда: http://cpp.com.ru/kr_cbook/ch5kr.html :)