LPC2388向けのデモを整備しました

5月末、STM32F207V/ZGT6を夢中でいじっていた折に、がた老氏からLPC2388
向けのプログラム、とくに割り込み動作について質問をいただきました。
LPC2388については、TFT液晶表示プログラムだけは更新を続けていてそのほかは
去年の1月以来放置状態でしたので、動作チェックがてら更新してみようかと
おもっていたらおもいくそはまったので顛末を記録しておくことにします。


起:Thumbモードで割り込みが動かなくなっていたことに気づいた
まずおかしいと気づいたのがこれで、FreeRTOSとは関係なしに最新の
CodesourceryG++ではThumbモードでコンパイルした場合、ユーザーモードから
割り込み許可するためにSWIかましたら先に進まなくなっていたことが判明。
ARMモードでビルドしたり動作確認した1年くらい前のCodesourceryG++の
Verでは正しく動いていたのでこのときはコンパイラのバグかとおもって
放置していました・・・。


承:FreeRTOSのデモもうごかなくなっ(ry
がた老氏はFreeRTOSからRTC(と割り込み)を動かすこと画策されていて、
私の公開していたFreeRTOSV6.0.1向けのデモとBare-Metalなprintfの
プログラムを参考にされていました。
しかしビルドが通らなかったとのことで、どのファイルをインクルード
もしくは定義すべきかを伝えて私もちょっくら確認しますかとおもって
最新のCodesourceryG++を使用しARMモードでビルドして書き込んでみると
なんと動かなかった・・・。
そもそも公開した当初は「とりあえずこれなら動く」状態だったため、
KeilのデモやMarthin'thomas氏やChan氏のプログラムやらが全部まぜこぜに
なっていて一年放置後の私が見ても何がどうなってるのかよく分からない
代物になっていました。
実はほかの方からもちらほらそういう質問いただいていたのですが、
これはまずいと思い立ちこの時点でやっとこ大規模な回収改修を
することにしました。


転:スタック領域のアラインメントを8バイトずつにあわせる
動いていたころのVerは"Sourcery G++ Lite 2009q3-68"でしたが
20110630時点で手に入る最新のものは"Sourcery G++ Lite 2011.03-42"です。
このVerはGCC4.5.2になっていてLinkTimeOptimizationというリンク時に
最適化を行う機能が利用可能となっています。またどちらもどちらもABI
(Application Binary Interface)はEABI(Embedded ABI)となっていますが・・・。

調べてみるとEABIはスタック領域のアラインメントを8バイトにそろえるべし。
と記述されていました。audin氏もこの件について触れています。さらに
FreeRTOSのフォーラムにもこの件についてのやり取りがありました。
audin氏は.ARM.exidxと.eh_frameにも触れられていましたがそちらは幸い
回避済でした。私のリンカスクリプトを調べてみると.stackがalign(4)に
なっていました。あらら。てわけでこちらは修正。

この時点でARMモードでFreeRTOSのLED点滅のみの簡単なプログラムは
動くようになりましたが、FreeRTOS上で割り込みがいまだ動かない・・・。


結1:FreeRTOS上においての割り込みを正しく記述する
Sourcery G++ Lite 2009q3-68では割り込みまわりは結構いい加減でも
問題なかったのですが、Sourcery G++ Lite 2011.03-42だと以下のように
しないといきなり動かなかったり、また動いてるように見えても10sec
程度で止まったりでまともに機能しません。


↑UART0を例にとるとUART0の割り込みハンドラのwrapperを作り
 割り込みがかかるとまずwrapperに飛ぶようにします。

↑UART0のヘッダファイル内で上記画像のように定義してやる必要がある
みたいです。

がた老氏は最終的に自力で上記の解決方法を見つけられたようで、私ももう少し
調べてから的確な返事をすべきだったと反省してます。同じくおきばやリンク
張ってるけど放置状態のものも最新のコンパイラでビルド/動作できるように
しておくかもしくはばっさり削除することをしないと後に続く人を混乱させて
無駄な時間を喰わせてしまうことになってしまうのでこれから先はこまめに
対処していきますね。


結2:Thumbモードでふたたび割り込みをうごかす
"Sourcery G++ Lite 2009q3-68"では問題なかったので気づかなかった
のですが、本来ならばタイマやUART等の割り込みのハンドラがある
Cのファイルは必ずARMモードでコンパイルすべき
だそうで、それを守ってmakefile内でARMモードでコンパイルする
ファイルを明示してやるだけでよかった。・・・はずでしたが-fltoの
オプション効かせてるとやっぱりエラー吐いてビルドがとまったり
ビルドできても動かなかったりでmakefile内でThumbモードを指定して
いる時は-fltoのオプションを除外するようにしました。
これで"Sourcery G++ Lite 2011.03-42"でビルドしても大丈夫と
なりましためでたしめでたし。
ていうか自分で注意書きかいててすっかり忘れていましたorz


結3:ほかのLPC2388向けのプログラムもレストアする
て言うわけでコンパイラじゃなくてねむいさんが悪いのが分かったので最低限
おきばで公開してるのは最新化しておきました。
特にLPCUSBを使用したMassStorageClassはChan氏のMCIドライバを連結し、
転送速度UPに成功しました!

58MByteのファイルを読み出し

58MByteのファイルを書き込み
以前は0.1MB/s、がんばっても0.2MB/sくらいだったのですが書き込み
0.4MB/s、読み出し0.5MB/sに!さらにArai氏のLPC1768向けLPCUSBの改修例
参考に最大4GByteまでしか認識できなかった容量も私の手持ちの
SDカードで最大容量16GByteのものが認識できるようになりました。



STM32Primer2のデモも同じような理由で最大4GB制限があり、
今回対処法が分かったので修正しました。

Comments

Post a Comment








Go to top of page