久しぶりにわからんシリーズだ。
FM3基板のサンプルソースは144MHzで動作しているらしい。
動作クロックをなんとなくで調べてみよう。
GPIOを、HI→LO→HI→LO→HI、とさせた。
うーん?? 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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。