【マイコン・メモ】RL78のRMA容量不足によるRAM化け対策
組み込み系ではプログラムの配置場所、つまり番地の指定はプログラマの責任です。
今日はRL78マイコンで遭遇したトラブルとその解決策についてのメモを残したい。
RL78マイコンには2kbytesのデータフラッシュを搭載した製品がある。これを用いることでマイコン内部にデータを記録できるので、外付けのEEPROMが不要になるという利点がある。
RL78 ファミリ. データ・フラッシュ・ライブラリ Type04
使用方法については、別の機会に取り上げたく思うが、その際に一つ厄介な問題にぶつかった。
このデータフラッシュを使用したプログラムの動作中に変数が別の値に化けてしまうのである。プログラム動作中に変数が勝手に変わってしまえば、もちろん正常な動作はしない。
統合開発環境のCubeSuiteとE1デバッガで確認したところ、ローカル変数とグローバル変数のアドレスが重複していた。 そのために変数が勝手に書き変わってしまっていた。
原因はRAMの容量不足だった。
私が使用しているRL78/G12はRAM容量が512bytesしかない。一方、データフラッシュを使用するには、RAMのFFE20HからFFEFFHまでの領域をsaddr領域として確保しないといけない。
そのため、使用できるRAM領域が極端に少なくなり、変数のアドレスの重複を招いていた。
プログラムで変数を極力減らしてみたが、それでもアドレスの重複は直らない。
メモリマップを確認したところ、スタートアップルーチンが200bytes以上を占めて、貴重なRAM容量を独占していた。
そこで以下を参照してスタートアップルーチンを削減した。
RL78ファミリ用Cコンパイラ CA78K0R. スタートアップルーチンの変更について
RL78/G10はS1コアであり、私が使用していたRL78/G12はS2コアであったので上記通りの方法は使わなかった。
汎用レジスタバンクが搭載しているので、「SEL RB0」の削除はしない。
また多くの場合、S2コアのRL78はミラー領域を持つので削除しないのだが、今回はミラー領域はなかったので削除した。
他は上記資料と同じように削除した。すると200bytes近くのRAM要量削減に成功した。
これにより変数のアドレスの重複は回避され、プログラムは正常に動作するようになった。
上記の方法がよく分からなければ、他にも以下で容量を削減したRL78用のスタートアップルーチンが公開されているので、ご参照いただきたい。