Проблема памяти C / C ++?
-
10-07-2019 - |
Вопрос
Программируя для моего 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 байт ...
Другие советы
Может, он содержит буфер в куче для передачи данных на последовательный порт?