作成日:2013-7-30

LPCXpresso IDEでコードサイズを圧縮する その1
〜 CRPを無効して300-400バイト節約する 〜

LPCXpresso IDEのCRPを無効して300-400バイト節約する

CRPとは
Flash内蔵のLPCマイコンにはCRP(Code Read Protection)という機能があります。このCRP設定のアドレスが LPCのCortex-Mマイコンでは"0x000002FC"番地です。 この番地に特定の値を設定することでFlashへのアクセスを制限します。
LPCXpresso IDEはデフォルトで、このCRPの設定をサポートしています("Enable")。この設定が"Enable"だと「割り込みハンドラの終わり」から「CRPの設定番地:"0x000002FC"」を約300-400Bを"1"で埋めます。
デバッガへの接続 や ISP(In-System Programming:UARTからFlashへの書き込み/消去)を制限/無効にしたい場合はこのCRPを"Enable"にして、CRPの設定番地に特定の値を入れる必要がありますが、SWD/ISPを無効にする必要が無い場合は CRPを"Disable"にして300-400Bを節約することができます。
Flashサイズに余裕がある場合は問題はありませんが、LPC810(Flash:4KB)などFlashサイズが小さい場合はこの300-400Bを使いたいと思います。
<注意>
  • CRP設定を「CRP3 = 0x43218765」に設定するとデバイスへのアクセスが全くできなくなる、この設定にしてダメ。
  • CRP設定を「NO_ISP = 0x4E697370」に設定するとISPモードに入らなくなる。ユーザープログラムでデバッガピンを他のFunctionへ割り当てている場合、これもデバイスへのアクセスが全くできなくなる。
  • CRP1/CRP2でもデバッガが繋がらなくなります。
※CRPの詳細はユーザーマニュアルで確認ください。

LPCXPresso IDEのCRP設定を"Desable"にして300-400Bを節約する方法
LPCXpresso IDE v5.2 で LPCXpresso LPC812 の「Blinky」プロジェクトで CRP設定の "Enable", "Desable" のコードサイズをを比較します。
まず、LPCXpresso IDEのインストールされているフォルダの lpcxpresso/Examples/NXP/LPC800/NXP_LPC8xx_SampleCodeBundle.zipの中のプロジェクト一式インポートします。ここではその中の「Blinky」Lチカプロジェクトを使います。 「Blinky」プロジェクトをビルド、プログラムサイズは 2,548バイト(=2,554 + 4)(図1)。Flah/RAMサイズの見かたはこちらを参照。
このプロジェクトは "map"ファイルが生成される設定になっているので、ビルドするとプロジェクトの「Debug」フォルダー内に「Blinky.map」ができます。 "map"ファイルを生成するLinker設定はこちら

「Blinky.map」ファイルを開きます、160-166行目を見るとCRPによって "0x154" から "0x2fc"番地まで "0x1a8"の空間を"FF"で埋めているのが分かります(図2)。
この"FF"で埋めている部分にもプログラムが書かれる様にCRPを"Disable"にします。
Brinkyプロジェクトを選択した状態で上部メニューバー「Project」->「Properties」、Propertiesを図3の様に、「C/C++ Build」->「Settings」->「Tool Settings」->「MCU Linker」の「Enable Code Read Protect」のチェックボックスを外す「OK」。
次にプログラムの中で、CRPを設定している部分をコメントアウトします。この「Blinky」プロジェクトでは「crp.c」ファイル内の
  • 7行目: #include <NXP/crp.h>
  • 12行目: __CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
です(図4)。
  • #include <cr_section_macros.h>
がある場合は、これもコメントアウトして問題ありません。
"cr_section_macros.h" や CRPに関しては、こちらも参照。

「Brinky」プロジェクトをビルド、プログラムサイズは2,120バイト(=2,116 + 4)(図5)で 328バイト Flashサイズが削減されました。
                 
/*
 * crp.c
 * Source file to create CRP word expected by Code Red linker
 */

#ifdef __CODE_RED
//#include <NXP/crp.h>

// Variable to store CRP value in. Will be placed automatically
// by the linker when "Enable Code Read Protect" selected.
// See crp.h header for more information
//__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

#endif
図4


LPCXpresso IDEで CRPをDisableにする場合の注意
上記で書いた様にCRP設定が「CRP3」「NO_ISP」になってしまうとデバイスにアクセスできなくなります。
確率的にはまず無いですが、デバイスが使えなくなると困る場合は、書き込む前に必ず確認しましょう!

バイナリ確認のために Eclipse Hex Editor Plugin (EHEP) をインストールする
LPCXpresso IDEはEclipseベースですので、Eclipseのプラグインをインストールできます。 <インストール方法>
    1. メニューバーの「Help」->「Install New Software」
    2. 図6の「Add」を押すと図7が現れるので、Nameに「EHEP」、Locationに「http://ehep.sourceforge.net/update」と記入、「OK」
    3. 図6に現れた"Hex Editor Plugin for Eclipse"を選択し、「Next」
    4. インストール後、メニューバーの「Windows」->「Preference」
    5. 図8の"General" -> "Editor" ->「File Associations」を選択、"*.hex"を選択し、「Add」
    6. 図9から"Hex Editor"を選択し ->「OK」、図8も「OK」


バイナリファイルを生成する設定にする
"Blinky"プロジェクトを選択した状態で、メニューバーの「Project」->「Properties」、図10 "C/C++ Buld" ->「Settings」、「Build Steps」タグ。
"Post-build steps Commad" は次の様になっている

arm-none-eabi-size "${BuildArtifactFileName}"; # arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" ; checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin";

この"arm-none-eabi-objcopy -O binary"の前の"#"を削除し、バイナリファイルを生成する様に変更してビルド。
バイナリファイルの生成はこちらを参照。 ビルドマクロはこちら


バイナリファイル(.bin)が"Blinky"プロジェクトの"Debug"フォルダー(Release buildの場合は"Release"フォルダー)の中に出できています。これを開きます。
「CRPの設定番地:"0x000002FC"」を確認します、図11。この番地の値が「CRP3 = 0x43218765」でもNO_ISP = 0x4E697370」でもないので、このプログラムをデバイスに書き込んでもISPからプログラム消去できないという事態にはありません。


ちなみに、LPCXPresso IDEのCRP設定を"Enable"に戻した場合、図12の様に「CRPの設定番地:"0x000002FC"」まで"1"で埋めて、CRPの設定番地にプログラムで指定したCRP設定を書き込む様子が分かります。


次回は、コンパイラオプションでコードサイズを圧縮する方法を書きます。
作成日:2013-7-30