LPC810を使っての感想他
トラ技の付録マイコンとしても付いていたNXPのLPC810(通商どんぐり?)で最近遊んでいます。
プログラムの開発には、LPCXpressoを利用し、デバッガは秋月で購入したLPC-Link2(2,100円)を利用しています。
トラ技のデバッガもあるようですが、部品の調達が面倒そうなので、LPC-Link2を利用しています。
トラ技のデバッガもあるようですが、部品の調達が面倒そうなので、LPC-Link2を利用しています。
LPC-Link2とマイコンの接続は全部で4線(3.3V/GND/SWDIO/SWCLK)を直接接続すればOKです。
■たまにデバッガが動かなくなる。
LPCXpressoでプログラムを転送しようとしたときに、下記のようなメッセージが急に出力される場合があります。
「02:Failed on connect Priority 0 connection to thiscore already taken. 31: No connection to emulator device」更に、裏側のエラーメッセージ「Failed to execute MI command:-target-select extended-remote | crt_emu_cm_redlink Remote communication error. Target disconnected.: No error」
LPCXpressoでプログラムを転送しようとしたときに、下記のようなメッセージが急に出力される場合があります。
「02:Failed on connect Priority 0 connection to thiscore already taken. 31: No connection to emulator device」更に、裏側のエラーメッセージ「Failed to execute MI command:-target-select extended-remote | crt_emu_cm_redlink Remote communication error. Target disconnected.: No error」
解決策としては、『PCを再起動』すれば私の場合復旧します。重要なのはPCの再起動であって、開発環境のLPCXpressoの再起動や、デバッガLPC-Link2の電源On/Offでは復旧しません。
詳しくはわかりませんが、RedLink Server?と呼ばれる、バックグラウンド用のプロセスがなんか残っているのかか?と思っています。
おとなしく、PCを再起動するのが一番早い解決法でした。
※これに気づくまで丸一日四苦八苦した。orz
詳しくはわかりませんが、RedLink Server?と呼ばれる、バックグラウンド用のプロセスがなんか残っているのかか?と思っています。
おとなしく、PCを再起動するのが一番早い解決法でした。
※これに気づくまで丸一日四苦八苦した。orz
■LPC810のプログラムサイズは、4KByte
プログラムできるサイズが、4K(4096)Byteということで、私的には結構プログラムできるサイズだな~と思っていました。そもそもLPC810は、足が8本で、電源を除くと、コントロールできるのは6本です。それらをコントロールするのにサイズ4Kは、打倒なサイズです。
プログラムできるサイズが、4K(4096)Byteということで、私的には結構プログラムできるサイズだな~と思っていました。そもそもLPC810は、足が8本で、電源を除くと、コントロールできるのは6本です。それらをコントロールするのにサイズ4Kは、打倒なサイズです。
あまり効率を気にせずにプログラムしていたら、見たことのないエラーが出力されてしまいました。
影響しそうな関数をコメントアウトしていったら、浮動小数点やdoubleを使っている関数が問題のようでした。
そんなに精度必要ないので整数型にしたらあっさり解決しました。
影響しそうな関数をコメントアウトしていったら、浮動小数点やdoubleを使っている関数が問題のようでした。
そんなに精度必要ないので整数型にしたらあっさり解決しました。
細かく検証はしてませんが、急にサイズが膨れたらその辺を見直ししたらよいかもしれません。
■特定の関数は最適化したくない。
プログラムをどんどん進めて行くと、やっぱり4Kで収まらない状況になってきました。
賢いコンパイラの最適化機能が頼りになります。
Optimization Level に-O0/-O1/-O2/-O3/-Osの4種類があり、-Osがサイズ最適化です。
よって、開発環境で-Osを指定し使ってサイズを最適化します。
プログラムをどんどん進めて行くと、やっぱり4Kで収まらない状況になってきました。
賢いコンパイラの最適化機能が頼りになります。
Optimization Level に-O0/-O1/-O2/-O3/-Osの4種類があり、-Osがサイズ最適化です。
よって、開発環境で-Osを指定し使ってサイズを最適化します。
ここで問題が起こりました。とある関数は、厳密なタイミングで作られているので、最適化したくないのです。
そこで、最適化の対象外とする方法を#pragmaで探していましたが、見つかりませんでした。
そこで、最適化の対象外とする方法を#pragmaで探していましたが、見つかりませんでした。
たどり着いたのは、以下のようにすることで関数レベルで最適化方法を選べるようです。
__attribute__((optimize("O0" ) ) ) void func(void)
{
{
// プログラム
}つまり、関数の手前に__attribute__で最適化レベルを指定してあげます。
※この辺の書き方は、使いなれないと最初は覚えるのが大変ですね。
※この辺の書き方は、使いなれないと最初は覚えるのが大変ですね。
■結局ギリギリな感じに・・・
あれこれやって、下記のようなサイズになりました。
残り20Byteということで、とりあえず収まりました。というか、これで収めるしかないね。
残り20Byteということで、とりあえず収まりました。というか、これで収めるしかないね。
何を作ったかは、後日紹介する予定です。(*´ω`*)