2009-06-24 3 views
2

Программирование для моего Arduino (в каком-то сочетании C/C++), я заметил что-то странное.Проблема с памятью 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, она работала волшебно, но потом я заметил проблему с памятью.

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

+1

Добро пожаловать в Stack Overflow! –

+0

Майк, я бы предложил избегать использования malloc в 1K RAM-машине. Вы должны уйти, не используя его в этой ситуации. :-) –

ответ

6

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

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

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

+0

Собственно, cmdd - это массив символов (строка, если возможно) длиной 14 символов. Таким образом, в основном существует много других переменных, не связанных с cmd. Максимально доступный SRAM - 1 кбайт, так что я думаю, что у меня около 700 байт данных. Есть ли способ получить истинную доступную память? После NewRoutine(), когда я вызываю другие функции, доступныйMemory все равно возвращает 1023. – 2009-06-24 01:18:50

+0

endl - это «\ n» и flush() с использованием C++ STL ostreams - возможно, здесь же. Буферизация звучит как вероятная причина для любого «странного» использования памяти или задержки вывода. –

+0

@Mike: Вы пробовали только для усмешек, что происходит, когда вы выделяете> 1023 байта? Вы подтвердили, что на самом деле это неправильно? –

0

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

+0

Вы правы, это на куче, потому что доступ к переменной cmdd занимает много времени. Поэтому я назначаю его намного раньше, чем на самом деле нуждаюсь в нем, поэтому он находится в куче. – 2009-06-24 01:13:45

Смежные вопросы