いろいろ試す10

あけましておめでとうございます。
今年もねむいさん(と虹裏メイドたち)を宜しくお願いします(ペコリ

と関係者向けのごあいさつを終えたところで今日のブログはおわ…ったら去年の
二の舞になってしまいますので、今年こそは本気を出して出来る限り前へ前へと
進んでいこうと心に誓う次第でございます。虹裏に投下する絵やコラももう少し
増やせるようにネタの回転力もあげたいなと。



さて、MentorGraphics社に買収されたCodeSourceryが去年暮れにリニューアル
して新バージョンがリリースされています。
やはりと思いましたが落とすのにメールでユーザーの登録を求めて
来るようになり、非常にかったるくなってしまいましたがこちらからフツーに
落とせますのでご活用ください。

今回の変更点はGCC4.5.1からGCC4.6.1にアップした点ですが、LinkTimeOptimization
の効果が少し変わっています。以前と同じままだと必要な部分まで削られてしまい
ますので以下のように変更しておいてください。細かい変更はGCCの本家丸投げ
-flto -fipa-sra

-flto-partition=none -fipa-sra
またデバッグ時にLTOを有効にしてるとブレークポイントが上手く張ることができない
ことがあるので無効にしておきましょう。
さらに最適化レベルに-Ofast(-ffast-mathを強制付与)が加わりました。

新しいSourceryでCMSISを含むコードをコンパイルしていると以下のような
エラーを吐いて

"Error: registers may not be the same -- `strexb r0,r0,[r1]"
というエラーメッセージを吐いてビルドが止まることがあります。
この対策は・・・
20170531追:
つべこべ言わずCMSISv5使いなさい!!!11!!!
20170532追:



"ことがある"と書いたのはコードの流れによってはエラーを回避できる機械語に落とし
込まれる場合もあり、発見が遅れるケースが出てきます。
この件についてはこちらのディスカッションにある内容が詳しいです。
回避方法は…
引っかからないようにレジスタ変数を強制的に割り当てるというベタベタ
なコードに置き換えるのが唯一の方法です…。_STREXBとか_STREXHとか使わないから
コメントアウトするというのは後で困ることになるのでなるべく避けましょう。
__STREXB関数の変更例。__STREXHも同じような感じで変更してください。
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;

__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}




uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
register uint32_t result asm ("r2");
register uint8_t value1 asm ("r0") = value;
register volatile uint8_t* addr1 asm ("r1") = addr;
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr1), "r" (value1) );
return(result);
}



audin氏のブログのコメントにてiruka氏によりスマートな回避方法が提示されています。
上にあるディスカッションにも記述されていますがインラインアセンブラに早期破壊
オペランドを示す修飾子"&"を付与することによって__STREXB、__STREXHをコンパイル
した時にオペランドが同一レジスタとなりエラーが出るのを回避するとのことです。

CMSIS1.x系はcore_cm*.cに記述されていますが、CMSIS2.0以降はcore_cmInstr.hに記述
されています。変更する内容はどちらも同じです。CMSISの方が修正されるまでこれで
回避しておきましょう。


20120529追:
CMSIS3.0x以降では早期破壊オペランドを使用する修正になっています。
おきぱにおいてあるサンプルはすべてCMSIS3.01にしておりますので安心して
お使いください。

これらは液晶表示デモも兼ねています。今回の更新にあたり、多数のSPI液晶を含め
た液晶モジュールのドライバも追加しています。少し前にaitendoさんより販売された
S95591-AAA(コントローラIC:S6D0129)TFT1P2797-E(コントローラIC:ILI9481)
のドライバももちろん作り込んでいますので参考にどうぞ。
あと業務連絡ですが、S95591-AAAとTFT1P2797-Eの初期化手順は全く違いますので
勘違いされないようご注意ください。




おまけ
もうキリがないからやめようと思ったのにまたやってしまった中華液晶モジュール
のコレクションたち…さらに詳しい詳細は私までご連絡を…





176x220サイズのQCIFなSPI専用液晶。コントローラICはHX8340Bなのですが…
なんとHX8340B(N)という細かい型番が存在しているようで初期化手順どころかレク
タングルの指定・GRAMの書き込みコマンドまで全く違う別物でした…以前紹介した
HX8340Bは本当はHX8340B(T)という型番だそうです。
しかもSPIは9bit固定でした!!!!orz
てわけでハードウエアで9bitシリアルがサポートされてるMARY(LPC1114)とかには
いかがでしょうか?ちょっと解像度的にきついと思いますけど…



Mouserで購入できるSDT018ATFTと言う液晶モジュール。コントローラICはILI9163C
だそうですがこいつも外に出てるピンの関係でシリアル接続は9bit固定でしたorz
てわけでハードウエアで9bitシリアルがサポートされてるMA(ry
(8-bit 8080,9-bitSerial接続)



これはセカンドソースがたくさんあり、ebayでも最安5USD前後で購入できるNOKIAの
液晶です。情報元はこちらの方のページです。
コントローラICはSPFD54124Bです…が案の定外に出てるピンの関係でシリアル接続は
9bit固定でしたorzてわけでハードウエアで9bitシリアルがサポ(ry


それとねむいさんのぶろぐ見てる人なら楽勝でしょうが、0.4mmピッチのハンダつけが
出来る人向けです。
(8-bit 8080,9-bitSerial接続)






最後に128x128以上の解像度がなかなか手に入らないアクティブマトリクスOLEDの中で
176x220のQCIFサイズなC0200QILC-Cを


視野角とか素晴らしいのですが、OLEDの弱点である焼きつきが起こるので同じ画像を
ずっと表示することはできず、フォトフレームとかに使うと泣きを見るでしょう。
ここ最近は広い視野角TFT液晶がどんどん出てきているので無理してOLEDを選択する
必要も無くなってきました。

クリスマスの時の頂き物を…。いなちゃんは性的すぎる…♥

Go to top of page