2010年2月9日火曜日

LM3S8962 Evaluation Kit プログラム作成 3 (GNU gcc)


 Texas Instruments(LUMINARY MICRO)社  Cortex-M3 MCU LM3S8962 マクロプロセッサ評価ボード EKI-LM3S8962 を、あいも変わらずいじっています。

 今回、評価ボードのOLED(グラフィクディスプレイ128 x 96)の表示を試しました。
1.表示データの解析
 1)ディスプレイ関数 RIT128x96x4ImageDraw(rit128x96x4.c)のデモプログラムでの使用を調べた。
  デモプログラム: FreeRTOSデモ
   =>bitmap.hのpucBasicBitmap(FreeRTOSのロゴ表示)3201バイトのイメージデータがあり、4ビット1画素が確認された。(16階調のグレースケール)
2.表示データの作成
 1)ペイントブラシ等で作成されたビットマップを表示データに変換することを考える。
  ①テストパターン(24ビット ビットマップ)をペイントブラシで作成し、データを調べた。
  ②od -cx bitmap.bmp 等でファイルのダンプを行った 
    =>テストパターンのデータで、バイトの反転があった。(白地に黒点)
    表示データは 0xFFFF 0xFFFF 0x00FF 0x0000 0xFFFF であったが、本来、0xFFFF 0xFFFF 0xFF00 0x0000 0xFFFF であるべき。リトルエンディアン的なバイト反転が起こっているのでしょうか?
    C言語で、ビットマップファイルをバイナリで開け、各画素のRGB要素の平均をとって16階調の数値データとし、テキストファイルに落とすことを考えていたのですが、このバイト反転、ファイルヘッダーの呼び飛ばしなどを考えると、面倒に思い、C言語による変換プログラムの作成は見送りました。
 2)Visual C++ 2008 による変換プログラムの作成
  前述の理由の他、画像ファイルの制限を外すことを考えるとVC++を使うのが良いと判断しました、プログラムの要点は、
    ①Bitmapクラスを画像ファイル割当てで初期化する。(ビットマップ、JPEG、GIF等の画像ファイルが一様に扱える)
    ②pictureBoxクラスのImageプロパティに ①のBitmapクラスを設定する。(表示用)
    ③ ①のBitmapクラスのGetPixelメソッドを使って画像の各画素を取得する(Colorクラス)。
    ④各画素のRGB要素の平均を求める。(この時点で256階調のグレースケール)
    ⑤求めた平均を1/16する。(OLEDで使える16階調のグレースケールになります。)
    ⑥この値をテキストファイルに出力する。一応Hex表示形式
 3)デモプログラムへの組み込み。
    デモプログラムに RIT128x96x4ImageDraw 関数を追加し、2)で作成したグレースケールデータ(出力テキストファイル)をイメージデータとして使いました。
   
 ※Visual C++ 2008 メモ
  久々のVC++で、戸惑った点
 ・二次元配列が使えなかった。
  データWK用に private: unsigned char imgdtT[128][96];を使おうとしたのですが。
    ....のメンバとして定義できません。混合型はサポートされていません。のエラー発生、Arrayクラスを使用するようです。
  宣言は    private:array< unsigned char, 2 >^ imgdtT;  
  初期化は   imgdtT= gcnew array< unsigned char, 2 >( 128,96);
  代入は    imgdtT[i,j] = iBrite /16; 
  参照は    iGray16 = imgdtT[i,j]; 
(一部訂正 3/9 初期化は の array が表示しきれていなかった。実は、<Unsigned....が隠れてしまっていた。)
3.OLED(グラフィクディスプレイ128 x 96)の表示
 鉄道模型(Nゲージ)の表示は128x50(4ビット)ドットで行っています。今まで128x64(1ビット)ドットのグラフィックLCDを主に扱ってきたので、このOLEDの表示はあまり期待していませんでした。しかし16階調(4ビット)のグレースケール表示ができることで表現力が格段に上がることは以外でした。
 HondaのHPより、バイクの画像をパクリ、16階調のグレースケールに変換し表示させました。結構きれいな表示でした。この解像度では表示しきれない細部まで見えるような錯覚を覚えました。

--------------------------------------------------------------------
--------------------------------------------------------------------
 試行錯誤を始めて、3ヶ月、暇を見つけてはの趣味の範囲では、超えられない壁が幾つかでてきました。

1.IARサンプルプログラムのGNU GCCへのコンバート
 ・Ethernetの割り込みがハンドリング出来ない。
   DHCPからのIPアドレスの割当が受けられない状況 
2.FreeRTOS上の開発環境(GNU GCC)の整備
 1)FreeRTOSからVre.6.0.2をダウンロードして試しました。
  ・IAR用のデモプロジェクト(CORTEX_LM3Sxxxx_IAR_Keil)を試す。(IARの環境)
    =>デモプログラムの動作を確認・・・容易に確認
  ・Eclipse用のデモプロジェクト(CORTEX_LM3Sxxxx_Eclipse)を参考にGNU GCCの開発環境を整える。
    =>FreeRTOSのデバイスドライバ等のライブラリ(libdriver.a、libgr.a)は、arm-elf-系の開発環境では利用できません。
     =>CODESOURCERYよりSoucery G++ Liteをインストールする。arm-none-eabi-系の開発環境が整い、ライブラリ(libdriver.a、libgr.a)の使用が可能になります。
      =>main.cのvSetupHighFrequencyTimer()のCallで止まってしまいます。タイマ関連のレジストリの設定で止まってしまうようです。