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)になっていました。あらら。
てわけでこちらは修正。
un
この時点でARMモードでFreeRTOSのLED点滅のみの簡単なプログラムは動くようになりま
したが、FreeRTOS上で割り込みがいまだ動かない・・・。


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

un
↑UART0を例にとるとUART0の割り込みハンドラのwrapperを作り
 割り込みがかかるとまずwrapperに飛ぶようにします。
un
↑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に成功しました!
un
58MByteのファイルを読み出し
un
58MByteのファイルを書き込み
以前は0.1MB/s、がんばっても0.2MB/sくらいだったのですが書き込み0.4MB/s、
読み出し0.5MB/sに!さらにArai氏のLPC1768向けLPCUSBの改修例を参考に最大4GByte
までしか認識できなかった容量も私の手持ちのSDカードで最大容量16GByteのものが認識
できるようになりました。
un

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

STM32F2シリーズを使ってみる3

4月から本当に少しずつ使い始めたSTM32F207ですが、公式の方もやっとこ資料が出そ
ろってきてだいぶ扱い方が理解できるようになってきました。

とりあえず一つの通過点ということでいつものchan氏のLPC2388向けのFatFs+OLED表
示プログラムの移植をしました(ほとんど原形とどめてませんが…)。いろいろやってきた
中でjpegデコーダ乗せたり(デコードが1.8倍速くなってる!)FONTX2の使い方覚えたりで
今回はM+フォント(FONTX2)を使いFilerの日本語表示を可能にしてみました。
un
↑やっとここまでこれた…
なんと当のchan氏も6/11更新のLPC2368向けFatFsサンプルでFilerの日本語化をされていた
ようで今度はこちらを元にしておりぢなるなFilerの構想を練っていきたいと思います。

そうそう、気になるFatFsの読み取り速度ですが、SDIOが出せる最高速度の48MHzまで
クロックを引き上げた場合、最大21MB/Secを叩き出すことができました!
un
↑てかいつも比較に使ってるATP製のmicroSDカードもすごい…class6なのに。
しかし、48MHz動作は8bitモードしか保証していない(rm0033.pdfより)のでsdカードで
使うときは実際は24MHzで動かすことになるのですが…それでも十分早いですね。



おきばにはすでに上記で紹介したSTM32F207ZGT6向けのプログラムを公開しています。
これはPowerAVR製の紅牛(もとはSTM32F103ZET6)というボードの回路互換となっています。
ねむいさんSTM32F2向けに備えてかなり前にtaobaoで部品未実装の基板"だけ"超安価で
購入していました。てわけでホントに最低限のことしかできないのですがF2を試すに当た
ってはこっちの方が幾分都合がよいのです。
un
un
ここからどんどん付け足していきます

またmakeファイル内の定義の書き換えによって以前使っていたSTM32F207VGT6向けにも
対応できます。STM32F207VGT6の方はこちらの(STM32F103VET6)ボードの回路互換です。
両者に共通するのはFSMCのピンが引き出されていて出来合いのLCDボードが直結できる
という点に尽きます(←TFT-LCDマニアな人には超重要なファクター)。
まぁデータシートで1xx系とのピンの処理方法の違いとかとか詳しく解説されていますん
日頃ねむいさんのぶろぐ読んでる人なら簡単に乗せ換え可能でしょう。

あと開発環境のtipsとして、前回も説明しましたがCodeSourceryG++等のポピュラーな
GCC開発環境はそのまま使用できます。Cortex-M3対応なら何でもよいでしょう。
問題は書き込み環境ですが…20110619現在はシステムメモリ上のブートローダから使用で
きるフリーのツールがまだ整わず、よってJTAG/SWDからしか書き込む方法がありません。
幸いOpenOCDの0.5.x系とVersaloonはすでにSTM32F2系のフラッシュの書き込みに対応し
ています。私もフラッシュ書き込み用のOpenOCDコンフィグを公開していますのでJTAGな
いしはSWDでつなげられるアダプタ持ってる人は開発に際して問題はないです。

最後に、次回予定のLPC2388関連の記事で詳しく解説しますが、64bit版Windows7環境下
のビルドにもmakefileの設定で対応できるようにしてあります。副業先のポジションと
PC環境がガラッと変わったのでねむいさんも必要に迫られてというのもあったりしてます。
ねむいさんとうとうすっぴんの従業員Bから晴れてエンジニアにじょぶちぇんぢ!
(やってること相変わらず雑用だが)






おまけ:
aitendoさんからついにあの扱いやすいSPI液晶が販売されましたね。
以前私が説明した奴です。これ使ったシールドとかも海外ではもうすでに販売されてい
ますが、TFT-LCD Shieldを開発した時の生基板を利用して無理やり乗っけてみました!
un
次はこれで行こう。

そしてaitendoさんからはもう一つQCIFサイズのタッチパッドつきの液晶が発売されま
した。これ確かtaobaoで捨て値で売られてて私も10枚くらいまとめて買って動かして
(飽きて放置)してました。これ8/16bit選択できるのは良いのですが、ピン間隔が0.7mm
なので手配線ではきつい人がいるかもしれないですね。専用の変換ボード出るの待った
方が良いと思います。どちらかというとこっちとかこっちとかこっちの方がピン間広
いし8bit固定で小難しいこと考えなくて良くてよいと思います。思いますよぅ!!(重文)
un
↑AS021350DをXMEGAで動かしてみたところ。
実はATXMEGA128A1にもchanさんのFilerを日本語対応して移植に成功してます。
しかしXMEGAはFatFsを結局DMA化できないまま白旗降ってクローズします…。

Go to top of page