Каждый раз, когда вызывается loop
, выделяется 32 байта памяти.У Arduino Uno не так много памяти, поэтому он быстро иссякает.Вам нужно освободить память, когда вы закончите использовать.Вот аналогия.
RAM это кусок строки.Эта строка имеет фиксированную длину.Вы можете отрезать кусок этой строки и использовать его для чего угодно.Это распределение.Если вы продолжите вырезать 32 байта из вашей строки, у вас в конечном итоге закончится.Вам нужно приклеить кусок строки обратно на основную строку, когда вы закончите ее использовать.Это освобождение.
Это была довольно дурацкая аналогия, но я надеюсь, что вы поняли идею!Чтобы решить непосредственную проблему, вы можете просто добавить free(result)
в конец функции, чтобы освобождать каждый раз, когда вы выделяете.Чтобы действительно решить проблему должным образом, вы должны разместить ее в стеке, а не в куче.Когда вы выделяете в стеке, память автоматически освобождается в конце области.Чтобы выделить 32 байта в стеке, вы просто должны сделать следующее:
char result[32];
Память в result
действительна только в пределах ее объема (функция loop
).Приведенный выше фрагмент в основном эквивалентен следующему:
char result_0;
char result_1;
char result_2;
// ...
char result_29;
char result_30;
char result_31;
Распределение стека происходит намного быстрее, чем выделение кучи (malloc
и free
), поскольку компилятор точно знает, сколько памяти вы используете.Это имеет свои недостатки, хотя.Чтобы выделить память в стеке, компилятору необходимо знать, сколько памяти вы используете!Вы не можете сделать это:
int size = get_a_number_from_somewhere();
char result[size];
, потому что компилятор не знает, сколько памяти выделить.Однако это:
int size = get_a_number_from_somewhere();
char *result = malloc(size);
// ...
free(result);
полностью в порядке.
В общем случае вы должны выделять в стеке, когда необходимый объем памяти является константой времени компиляции (например, 32
) и кучейвыделить иначе.Каждый раз, когда вы пишете malloc
, тщательно продумывайте, куда должен идти соответствующий free
.