マイコン開発でメモリ不足!【RL78-L1C】

はじめに

マイコン開発を行っていると、特にメモリ不足の問題に直面することがあります。
このブログでは、RenesasのRL78-L1Cを例に、メモリ不足を解消する為の対策を紹介します。

1. メモリ不足の症状を見つける

マイコン開発では、メモリ不足が原因でプログラムが正しく動作しないことがあります。
その際、メモリの使用状況を確認するために役立つのが、ビルド時に生成される「マップファイル」です。
このマップファイルを確認することで、どこでどれだけのメモリを使用しているかを特定し、改善のヒントを得られます。

マップファイルとは
マップファイルには、プログラム内で使用している変数や関数がメモリのどこに配置されているか、また各セクション(コード、データなど)のメモリ使用量が記載されています。
メモリ不足を特定し、対策を講じるための重要な情報が詰まっているファイルです。

マップファイルの主な構成と読み方

セクションリスト(Section Listing)
プログラムが使用しているメモリセクションごとに、開始アドレス、終了アドレス、使用バイト数が表示されます。メモリ不足の原因を調べる際に、以下のポイントを確認します。

  • ROM使用量:プログラムコードが格納される領域です。コードサイズが大きすぎると、メモリ不足を引き起こします。
  • RAM使用量:変数や配列が格納される領域です。特にスタック領域と競合しやすく、注意が必要です。

シンボルテーブル(Symbol Table)
各変数や関数が、メモリ内のどこに配置され、どれだけのメモリを使用しているかが記載されています。特定の配列や関数がメモリを大量に消費している場合、このテーブルを確認して原因を特定します。

実際の確認手順
ROMとRAMの総使用量を確認

マップファイルのセクションリストで、ROMとRAMがRL78-L1Cの容量制限内に収まっているかを確認します。

シンボルテーブルで大きなメモリ消費項目を特定

メモリ不足の原因となっている項目(特に大きな配列やグローバル変数)をシンボルテーブルから探し出し、無駄なメモリ消費がないかをチェックします。

スタックサイズとメモリ領域の使用率確認

RAM不足が疑われる場合、スタック領域の競合がないかを確認し、必要に応じて配置を調整します。

2. 最適化レベルを変更してみる

メモリ不足を解消するために、コンパイラの最適化レベルを調整する方法もあります。RenesasのCS+ for CC環境では、コンパイラの最適化設定を変更することで、コードサイズを削減できる可能性があります。

コンパイラ最適化の種類と設定方法
コンパイラ設定の確認

CS+でプロジェクトを開き、「Build Tool」ペインの「C Compiler」→「Optimization」から最適化設定を確認します。

最適化レベルの選択

メモリ削減には、サイズ優先が適していると思いますが、有償ライセンスを保持していないと使えなかった為、一部の最適化にしています。ライセンスを保持しているのであれば、サイズ優先にしてみてください。

最適化の注意点
最適化によってデバッグが難しくなったり、処理速度が変わることもあります。CS+のビルド後に生成されるマップファイルを再確認して、メモリ使用量がどう変わったかを確認しましょう。

3. 不要な処理を削除する

メモリ不足を解消するためには、ソースコード全体を見直して、不要な処理や冗長なコードを削減することも効果的です。特に長期間使用しているプロジェクトや流用したコードには、目的に合わないコードが残っていることがあります。

関数化
同じ処理が複数回にわたって行われている場合、関数化することでコードを簡潔にし、メモリを節約できます。

// 重複した処理の例
PORT1 = 0x01;
_delay(100);
PORT1 = 0x01;
_delay(100);
// 関数化してまとめる
void repeatAction() {
    PORT1 = 0x01;
    _delay(100);
}

// 使用する場所で関数を呼び出す
repeatAction();
repeatAction();

使用していない変数や関数が残っている場合、メモリを消費する原因となります。
CS+では、未使用の変数や関数について警告メッセージが出るため、それを参考にして削除しましょう。

// 未使用の変数
int unusedVar = 0;

// 使用されていない関数
void unusedFunction() {
    // 使われていないコード
}

// メモリ削減後:unusedVarとunusedFunctionを削除

配列のサイズ見直し
配列のサイズが必要以上に大きい場合、メモリを無駄に消費します。
プログラムに必要な最小限のサイズに変更しましょう。

// 無駄に大きい配列の例
char buffer[256]; // 必要以上の大きさ

// 必要最小限のサイズに変更
char buffer[128]; // 使用するデータに合わせてサイズを変更

4. それでもどうしてもメモリが足りない場合

最終手段として、マイコンを変更してください。

変更時の注意点
マイコンを変更すると、周辺回路の設定やピン配置の違いにより、ハードウェアおよびソフトウェアの修正が必要になる場合があります。特に以下の点に注意しましょう。

  • ピン配置と周辺回路の確認
  • クロック設定の再確認
  • 外部メモリの活用(特殊なケース)

おわりに

限られたメモリ環境の中でプログラムを効率的に動作させるためには、メモリの使用状況を詳細に把握し、最適化を行うことが重要です。

よかったらシェアしてね!