私はマイクロコントローラーのプログラミングにかなり慣れていません。LPC1788 を使って数週間が経ちました。
私が最近抱えている問題の 1 つは、予想よりもずっと早くメモリ不足になることです。mallocできる連続したメモリのブロックの大きさをテストすることで、使用可能なメモリの量をテストしました。結果は972バイトです。割り当ては、アドレス 0x10000000 (このボードでは約 64kB である必要があるオンチップ SRAM の開始) から開始されます。
私が現在取り組んでいるプログラムは、LCD を利用してメッセージを表示できる単純なデバッガとして機能することを意図しています。新しいメッセージによって常に「追加」される 1 つの文字列があり、メッセージ全体が LCD に表示されます。画面のメッセージの長さが垂直方向の境界を超えると、最も古いメッセージ (一番上に近いメッセージ) が収まるまで削除されます。ただし、追加のメモリの割り当てを拒否する前に、約 7 つの追加メッセージしか追加できません。必要に応じて、プロジェクトの main.c はhttp://pastebin.com/bwUdpnD3でホストされます。
以前、threadX RTOS を使用して複数のスレッドを作成および実行するプロジェクトの作業も開始しました。そのプログラムにLCDの使用を含めようとしたとき、メモリも非常に限られていることがわかりました。LCD は SDRAM のベース アドレスから始まるすべてのピクセル データを格納しているように見えますが、それが私が使用している SRAM と同じかどうかはわかりません。
私が必要としているのは、LCD を利用しながら、複数のスレッドが機能したり、大きな文字列を格納したりできるように十分なメモリを割り当てる方法です。1 つの可能性としては、バッファーまたはその他のメモリー領域を使用することが考えられますが、その方法がよくわかりません。どんな助けでも大歓迎です。
tl;dr: LCD に大きな文字列を出力しようとすると、SRAM の割り当て可能なメモリがすぐに不足します。
編集 1: 変数 currMessage でメモリ リークが検出されました。現在は修正されていると思います:
strcpy(&trimMessage[1], &currMessage[trimIndex+1]);
// Frees up the memory allocated to currMessage from last iteration
// before assigning new memory.
free(currMessage);
currMessage = malloc((msgSize - trimIndex) * sizeof(char));
for(int i=0; i < msgSize - trimIndex; i++)
{
currMessage[i] = trimMessage[i];
}
編集 2: メモリ リークの修正を実装しました。プログラムは今ではかなりうまく機能し、私はかなりばかげていると感じています。