mbedのオフラインコンパイルについて(LPCxpresso)

健忘録として記載

mbedは有志によって提供されているライブラリが充実しており、非常に容易にSDカードなどのファイルシステムやLCDなどを利用できる。 しかし、mbedのオンラインコンパイラではコード補完やデバッグが難しく、printfなどによるデバッグはつらい。 これらを解決するために公開されているLPCxpressoを利用してオフラインコンパイル、開発環境を利用したい。 それを利用する上で自分がつまずいたところと解決方法を記載。 自分のmbedデバイスはLPCXpresso1549を利用している。

Quote:

mbedのライブラリはライブラリビルドとしたmbed.bldと完全にソースからのmbed-srcとどちらを利用すべきか?

自分の結論としてはmbed-srcを利用する。 スタートアップなどをデバッグしたい場合であったり、GPIOなどがどのように実装されているか?その実装が自分の求めている速度要求などを満たしているか?などの問題をソースから調べる必要が多々あったため。 しかし、この場合ダウンロードサイズがmbed-srcだけで45Mbyte程度となり大きい。 また別な問題が発生した。

Quote:

mbed-srcがLPCXpressoでコンパイルできない。

LPCXpressoでインポートを行うと、プロジェクトのデフォルトとして設定されているコンパイラのLanguage standardでは構文として使用できない記載があるからだった。 そのためProjectのPropertiesから設定を変更する必要がある。 ProjectのPropertiesを開き、 C/C++ Build->Settingsにある、MCU C++ Compiler及びMCU C CompilerのDialectを開く Language standardをCompiler defaultから変更 C++はISO C++11(-std=c++0x) CはISO C99(-std=c99) を指定した。 これで、エラーなくライブラリのコンパイルが通る

Quote:

LPCXpressoでコンパイルしたバイナリとオンラインコンパイラでのバイナリサイズがかなり違う。

先に書いた別な問題がこれ。 ちょっとしたLチカだと感じないが、SDカードなどを利用したようなプロジェクトだと如実である。 当然オフラインコンパイルの利点としてデバッグを行うことを想定しているので、Debug buildであることも原因だが、使用しているライブラリが異なっていることが原因であった。 LPCXpressoではNewLibNanoというコードサイズを小さくするライブラリを指定することができる。 これを指定してビルドするとかなりコードサイズが抑えられる。 LCPwareのサイトに指定方法、使用方法が記載されている。 https://www.lpcware.com/content/faq/lpcxpresso/newlib-nano-support

これを利用してみようとするが、Quick SettingsでSet library/header typeを開いてみても、ライブラリを選択できない。 原因はmbedでexportした際にリンカスクリプトが用意された状態でインポートされており、これに指定されているので変更できない状態だった。

リンカスクリプトは mbed-src->targets->cmsis->TARGET_NXP->TARGET_LPC15XX->TOOLCHAIN_GCC_CRにLPC1549.ldとして保存されている。 またPropertiesのC/C++ Build->Setting->MCU C++ Linker->Managed Linker Scriptにこれを使用するように指定されている。 ライブラリを変更するには、このリンカスクリプトを使用しないようにするか、リンカスクリプト自体を変更するかのどちらか。

リンカスクリプトを変更する場合は GROUP(libgcc.a libc.a libstdc++.a libm.a libcr_newlib_nohost.a crti.o crtn.o crtbegin.o crtend.o) を GROUP(libgcc.a libc_s.a libstdc++_s.a libm.a libcr_newlib_nohost.a crti.o crtn.o crtbegin.o crtend.o) に変更する

もしくはリンカスクリプトを使用しないようにするには、Manage Linker Scriptのチェックをオンにする。 この状態であればManaged Linker ScriptからLibraryを 自分はリンカスクリプトを使用しないようにした。 CRPなどの設定など、リリースする時に一々スクリプトを書き換えなくてはいけないのは面倒。Propertiesで設定できるようにしたかったから。

Quote:

Releaseに変更してコンパイルすると、エラー

先ほどまでの設定はDebugでの話で、Releaseに変更すると更におかしなことになっている。

Language standardはすべてCompiler defaultになってしまっているので、再度設定。 MCU C CompilerのIncludes->Include pathsが空。これはMCU C++ CompilerのIncludesのInclude pathsの設定をCtrl+C Ctrl+Vでコピーする。 MCU C++ LinkerのManaged Linker Scriptをもう一度Manage linker scriptをチェックへ。 LibraryをNewlibNano(semihost)へ。 MCU C++ Linker->Libraries->Librariesになぜかmbedと指定されているのでこれをdelete

これでやっとReleaseでもコンパイルできるようになる。 出来たコードサイズを比較してみると、Lチカで、 mbed オンライン 900バイト LPCXpresso オフライン リリース 1060バイト LPCXpresso オフライン デバッグ 1496バイト

Quote:

Flashメモリーのベースアドレスを変更できない

Cortex-M3は本来どのような場所にバイナリを置いても実行可能であり、割り込みベクターも任意に変更可能。 ISPを利用したFlashの書き換えもROMベースで実装されており非常に簡便ではあるが、ハードウェアやソフトウェアの用意が必要であり、いわゆるファームウェアの更新には若干敷居が高い。 SDカードなどのファイルシステムを実装するのであれば、Secondary Bootloaderを作成してメインのプログラムはSDカードなどから書き換え可能なものとしたい。 そのためにmbedのオフラインコンパイルで作成されたバイナリのベースアドレスを変更したい。 本来であれば、Properties->C/C++ Build->MCU settingでMemory detailsを変更すればよい。 具体的にはFlashのLocationを0x0からSecondary Bootloaderを作成した分をずらして0x2000などと指定し、その分のSizeを減らして0x40000を0x3e000などと指定すればよい。 しかし、このようにして出来たバイナリを見てみると(Hexで出力してアドレスを確認)0x0からスタートしている。 これも問題はリンカスクリプトでmemory regionが指定されていることが原因だった。

結果的に先のLibraryの問題でリンカスクリプトを使用しないようにすれば、propertiesでのメモリーの設定が反映されるようになった。 もしくはリンカスクリプトを書き換えるかであるが、これも面倒だと思う。


Please log in to post comments.