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 に答える