Pregunta

Programando para mi Arduino (en algún tipo de mezcla de C / C ++), noté algo extraño.

Cada vez que me comunico a través del puerto serie, vigilo el uso de SRAM. Normalmente, oscila entre 300 ~ 400 bytes. Sin embargo, después de agregar una nueva rutina (ver más abajo), noté que siempre saltaba de 300 ~ 400 bytes de memoria libre a EXACTAMENTE 1023. Mi presentimiento es que hay un problema.

Esta es la nueva rutina

void NewRoutine(char *cmdd){

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

Y esta es la rutina MemoryCheck

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

Tenga en cuenta esto: Primero, no funcionó. Después de agregar el comando endl, funcionó mágicamente, pero luego noté el problema de memoria.

¿Alguien tiene ideas para una solución alternativa?

¿Fue útil?

Solución

La razón por la que obtienes 1023 bytes de memoria libre es simplemente porque el malloc (en 1023, que es --1024) está teniendo éxito en el primer intento. Esto significa que tiene al menos 1023 bytes de memoria, pero no le indica la verdadera memoria disponible.

Antes de esto, debe haber tenido algo para mantener la memoria. Mi conjetura es la clase GSM aquí: probablemente contiene los datos (cmdd + 26) en un búfer interno que se vacía en una nueva línea. Tan pronto como agregue su llamada endl, probablemente recupere la memoria completa del búfer.

¿Qué tan grande es tu comando? Mi conjetura es que (o el conjunto completo de ellos) es probablemente alrededor de 700 bytes ...

Otros consejos

¿Quizás tiene un búfer en el montón para transferir datos al puerto serie?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top