サイクルタイムを測定しよう (10) [FMx]
今回は、 Cypress の FM0+ MCU S6E1A シリーズに焦点をあてて、サイクルタイムを測定してみます。 CPU は、 Cortex-M0+ だから、 PSoC 4 と大きな違いはないでしょう。
Fast GPIO を使ったループ
今回のプロジェクトでも、ループを回るごとに GPIO をトグルさせて外部からループの周期を測定します。 PSoC 4 の場合、 Control Register コンポーネントを配置して、データを書き込むだけで出力がトグルするハードウェアを組みました。 FM0+ の場合、ハードウェアを組む事はできませんので、すべてソフトウェアで GPIO を操作します。
FM0+ には、ハードウェアを作成する機能は有りませんが、ソフトウェアから高速に GPIO を操作する機能を持っています。 それが、 Fast GPIO (FGPIO) です。 FGPIO は、 CPU に近いバスに接続されているため、 GPIO の操作に1クロックしか要しません。 こういった、高速に GPIO 出力を操作する用途には最適です。
Gpio1pin_InitOut(FGPIO1PIN_P61, Gpio1pin_InitVal(1)); FM_GPIO->FPOER6_f.P1 = 1; // Enable FGPIO
使用する端子は、評価ボードの LED が接続されている P61 です。 ディレイを入れると、 LED の明滅で動作を確認できます。 P61 を出力に設定するためには、上記のように Gpio1pin_InitOut() マクロを使用します。 このマクロは、 Peripheral Driver Library (PDL) と呼ばれる基本ライブラリで提供されています。
デフォルトの状態では、各端子は GPIO として機能します。 これを FPGIO で制御させるために FPOER6 レジスタの当該ビットを1に設定します。 これで、 P61 は、 FGPIO の出力端子として機能します。
func9(&bFM_GPIO_FPDOR6_P1, 0u, 2u);
実際に FGPIO をトグルさせる部分は、前回同様 func9() 関数にまとめました。 P61 の出力値を変更するためのレジスタが、 bFM_GPIO_FPDOR6_P1 にあります。 今回は、書き込み動作一回でトグルさせるのではなく、 set/clear の二回の書き込みでトグルさせます。 そのため、 clear するための値と set するための値を引数に与えています。
typedef volatile uint8_t reg8_t; void func9(reg8_t *reg, uint8_t val0, uint8_t val1) @ ".text.func9" { for (;;) { *reg = val0; *reg = val1; } }
func9() 関数は、上記のようになっています。 "@" で示されている名前は、セクション名です。 リンカのスクリプトで、このセクションを 32 バイト境界から配置するように指定しています。 bFM_GPIO_FPDOR6_P1 レジスタのアドレスと書き込む値を引数で与えると、それぞれ CPU のレジスタに値が保持されて、アクセス時間が最短になります。
83 for (;;) { 116 *reg = val0; \ ??func9_0: (+1) \ 00000002 0x7001 STRB R1,[R0, #+0] 117 *reg = val1; \ 00000004 0x7002 STRB R2,[R0, #+0] \ 00000006 0xE7FC B ??func9_0 118 }
コンパイラで生成されたコードは、3命令になりました。
実行サイクル数
このプログラムのループ周期を測定したところ、4サイクルで実行されることがわかりました。 CPU クロックを40MHzで操作させているので、10MHzのパルスで LED が駆動されたことになります。 さらに実験したところ、 STRB 命令が1サイクル、 B 命令が2サイクルで実行されるということがわかりました。
参考サイト
- FM0+ S6E1A Series 5V Robust ARM® Cortex®-M0+ MCU
- 今回実験に使用したのは、 FM0+ S6E1A というシリーズの MCU です。
- FM0-V48-S6E1A1 ARM® Cortex®-M0+ FM0+ MCU Evaluation Board
- 実験には、評価ボードを使用しました。 書き込みツールとして CMSIS-DAP として機能する FM3 が搭載されています。
- FM MCU Peripheral Driver Library (PDL)
- FM0+ の各種ペリフェラルを操作するための基本ライブラリです。 今回は、 FGPIO の初期化で使用しましたが、高速にアクセスするためには、レジスタを直接操作した方が良さそうです。
参考文書
- AN210985 - Getting Started with FM0+ Development
- FM0+ でプログラム開発を行うための手順が書かれています。 この文書では、 Peripheral Driver Library (PDL) の使用を前提としています。
コメント 0