RAM が 2K しかないatmega328に取り組んでいます。
スクリプトを使用して、LCD タイマーの 10 桁を表す 10 個のビットマップから 10 バイトの配列を作成します。これらのバイト配列はソース コードに格納されていますが、一度に 1 桁しか書き込まないため、それらすべてを RAM に保持する理由はありません。このようにして、より大きな数字を使用してRAMの消費を減らすことができます!
これは私がやろうとしていることです:
void load_digit_ba(uint8_t digit, uint8_t digit_ba[]) {
// from 0 to 9 I copy the current digit in the byte array form into digit_ba
if (digit == 0) {
uint8_t digit_ba_tmp[10] = { 24, 40, 0, 0, 0, 224, 240, 248, 252, 254 };
memcpy(digit_ba, digit_ba_tmp, 10);
}
...
}
しかし、コンパイラはすべての配列に対して静的にメモリを予約しているようです。私の場合、122 バイト * 10 桁 = ~1K で、RAM の半分以上です。
Sketch uses 7,310 bytes (23%) of program storage space. Maximum is 30,720 bytes.
Global variables use 1,695 bytes (82%) of dynamic memory, leaving 353 bytes for local variables. Maximum is 2,048 bytes
[10] の代わりに配列 [11] にセルを追加し、イニシャライザとして 10 の値を渡すと、代わりに実行時にメモリが割り当てられます(らしい) :
void load_digit_ba(uint8_t digit, uint8_t digit_ba[]) {
if (digit == 0) {
uint8_t digit_ba_tmp[11] = { 24, 40, 0, 0, 0, 224, 240, 248, 252, 254 };
memcpy(digit_ba, digit_ba_tmp, 10);
}
...
}
Aurdino IDE は次のように述べています。
Sketch uses 11,396 bytes (37%) of program storage space. Maximum is 30,720 bytes.
Global variables use 597 bytes (29%) of dynamic memory, leaving 1,451 bytes for local variables. Maximum is 2,048 bytes.
uint8_t digit_ba_tmp[]
コンパイラに長さを計算させる場合と同じ動作で、〜 1K RAM が予約されます。
なぜセルを追加するとそれが行われ、クリーンなのですか? 私には思えません。ここでの前提は、数字配列の長さは数字ごとに固定されており、内容を変更するだけで、シリアル経由で一度に 1 つの数字をディスプレイに送信するため、現在の数字を RAM にロードしてから送信することは理にかなっているということです。それ。ここでは、ヒープ/スタック メモリの断片化の問題は見られません。よろしいですか? スマイリー悲しい