2012/05/01

[fm3]GPIOアクセス速度がよくわからん

久しぶりにわからんシリーズだ。

FM3基板のサンプルソースは144MHzで動作しているらしい。
動作クロックをなんとなくで調べてみよう。

GPIOを、HI→LO→HI→LO→HI、とさせた。

image

うーん?? 10MHzくらいしか出てないぞ?

説明を読むと、マスタークロックが144MHzで、GPIOがつながっているAPB2は分周して72MHzになっているらしい。
しかしそれでも、この速度は遅いような。

うちのロジアナはサンプリングが100MHzなので、確かに72MHzはうまく取れないかもしれない。
しかしエイリアシングを起こしているなら、もっとぼろぼろの波形になってもいいような気がする。

うーむ。


GPIOアクセスには、こんなコードを書いた。

FM3_GPIO->PDORF_f.P2 = 1;        /* HI */
FM3_GPIO->PDORF_f.P2 = 0;        /* LO */
FM3_GPIO->PDORF_f.P2 = 1;        /* HI */
FM3_GPIO->PDORF_f.P2 = 0;        /* LO */
FM3_GPIO->PDORF_f.P2 = 1;        /* HI */

そういえば、これってビットフィールドだった・・・。

よく考えると、私が仕事で使っているマイコンはビットアクセス命令があって、1クロックで制御できるようになっているのだ。
上記のソースだと、値を取得して、特定のビットにAND/ORして、書き込む、というステップを踏んでいるはずだ。
そりゃ遅くなるだろう。

 

よく読むと「ビット・バンド・エイリアス」というしくみがある。
これはWORDアクセスしてもビットアクセスと同じ効果が得られるようになっているらしい。
ほほぅ。

mb9b610t.hには、このマクロ定義がずらーーーっとある。
このヘッダファイルは大きいのだけれど、ファイルの半分はビットバンドエイリアスの定義になっている。

私が今回アクセスしたいのは、ポートFのbit2。
bFM3_GPIO_PDORF_P2、という定義名のようだ。
やってみよう。

bFM3_GPIO_PDORF_P2 = 1;
bFM3_GPIO_PDORF_P2 = 0;
bFM3_GPIO_PDORF_P2 = 1;
bFM3_GPIO_PDORF_P2 = 0;
bFM3_GPIO_PDORF_P2 = 1;

計測すると・・・80ns。。。
変わらんなあ。

最適化が必要なのか?
とりあえずコンパイルした結果で確認を・・・。

Keilの評価版ではアセンブルリストを出力してくれないらしい。
CodeSourceryが入っているので、AXFファイルをobjdumpすればいいようだ(BINARY HACKSを読みながら)。

$ arm-none-eabi-objdump -d cqfm3_felicaplug.axf  > asm.lst

402:    4911          ldr    r1, [pc, #68]    ; (448 <_init+0x9c>)
404:    2201          movs    r2, #1
406:    600a          str    r2, [r1, #0]
408:    2300          movs    r3, #0
40a:    600b          str    r3, [r1, #0]
40c:    600a          str    r2, [r1, #0]
40e:    600b          str    r3, [r1, #0]
410:    600a          str    r2, [r1, #0]

STR命令でアクセスしているな。
Interface誌の説明だと、これでよさそうだ。
STR命令が遅いのか?とも思ったけど、ここには1サイクルと書かれている。

なんか間違ってるのか、こういうものなのかなんだけど、ようわからんですわ。

とりあえずビットバンドエイリアスを使うようにしておこう。
GPIOの出力なら、こんなマクロで済みそうだ。

#define GPIO_PDOR(p,b)    bFM3_GPIO_PDOR##p##_P##b

いや、いっそのことこうか。

#define GPIO_BBA_BIT(r,p,b)        bFM3_GPIO_##r##p##_P##b

GPIO_BBA_BIT(PDOR, F, 2) = 1;

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。