2

为我的 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 命令后,它神奇地工作,但后来我注意到内存问题。

有人有解决方法的想法吗?

4

2 回答 2

6

您获得 1023 字节可用内存的原因纯粹是因为 malloc(在 1023 - 即 --1024 上)在第一次尝试时就成功了。这意味着您至少有 1023 字节的内存 - 但不会告诉您真正的可用内存。

在此之前,您一定有一些东西可以保持记忆。我的猜测是这里的 GSM 类 - 它可能将数据(cmdd + 26)保存在一个内部缓冲区中,该缓冲区在换行符上刷新。一旦您添加了 endl 调用,您可能会从缓冲区中取回全部内存。

你的命令有多大?我的猜测是它(或它们的全部)可能大约是 700 字节......

于 2009-06-24T01:08:51.623 回答
0

也许它在堆上保存一个缓冲区来将数据传输到串口?

于 2009-06-24T01:06:10.490 回答