Вопрос

Программируя для моего Arduino (в какой-то смеси C / C ++), я заметил нечто странное.

Каждый раз, когда я общаюсь через последовательный порт, я слежу за использованием SRAM. Обычно он составляет от 300 до 400 байт. Однако после добавления новой подпрограммы (см. Ниже) я заметил, что она всегда перепрыгивала с 300 ~ 400 байт свободной памяти до ИМЕННО 1023. Я догадываюсь, что есть проблема.

Это новая процедура

void NewRoutine(char *cmdd){

   GSM.print(cmdd);
   GSM.print(26, BYTE);
   GSM.print(endl); // <-- added later
   Serial.print(availableMemory());
}

И это подпрограмма MemoryCheck

  int availableMemory() {
  int size = 1024;
  byte *buf;
  while ((buf = (byte *) malloc(--size)) == NULL);
  free(buf);
  return size;
}

Обратите внимание: во-первых, это не сработало. После того, как я добавил команду endl, она работала волшебным образом, но затем я заметил проблему с памятью.

У кого-нибудь есть идеи для обхода проблемы?

Это было полезно?

Решение

Причина, по которой вы получаете 1023 байта свободной памяти, заключается в том, что malloc (1023 - то есть - 1024) успешно выполняется с первой попытки. Это означает, что у вас есть по крайней мере 1023 байта памяти - но не говорит вам истинную доступную память.

До этого у вас должно было быть что-то, что сохраняло память. Я предполагаю, что класс GSM здесь - он, вероятно, хранит данные (cmdd + 26) во внутреннем буфере, который сбрасывается на новую строку. Как только вы добавите свой вызов endl, вы, вероятно, получите всю память обратно из буфера.

Насколько велика ваша команда? Я предполагаю, что он (или их полный набор) составляет около 700 байт ...

Другие советы

Может, он содержит буфер в куче для передачи данных на последовательный порт?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top