mbedでベアメタルプログラミングを行うメリットは、バイナリサイズの縮小だけではなく、直接制御によって高速なI/Oを実現可能です。Lチカを例に、ベアメタルプログラミングによる高速I/O制御を試します。
本連載ではARMマイコン「LPC1114」に内蔵されたデバイスについて、mbedが提供するクラウド開発環境のクラスライブラリを介して利用する方法について説明してきましたが、mbedのクラスライブラリを使わないプログラミング、いわゆるベアメタルプログラミングも可能です。
前回は発光ダイオードの点滅プログラムを例に、mbedクラスライブラリを使う場合とベアメタルプログラミングのそれぞれのメリットをご紹介しました。
mbedクラスライブラリを使うとで内蔵デバイスを簡単に利用でき、また、各種mbedボード間でのポータビリティが保障されるなどのメリットがありました。一方、前回はベアメタルプログラミングでは実行形式のバイナリサイズが小さくなるという利点しか、お伝えすることができませんでした。
そこで今回はクラスライブラリを使った場合とベアメタルプログラミングでGPIOのスピードについて比較検討してみたいと思います。べメタルといえどもクラスライブラリを使わないだけなので、mbedのコンパイル環境はそのまま使えます。
今回も前回と同様、LPC1114のペリフェラルの1つであるGPIOを使うのですが、おさらいも兼ねてGPIOがCPUとどう接続されているのか、ブロックダイヤグラムで見てみましょう。
GPIOを制御するブロックは赤丸で示したところにあります。注目して頂きたいのはGPIOはAHB(Advanced High-performance Bus)で直接つながっている点です。他のUARTやSPI、I2Cなどの周辺デバイスはAHB TO APBブリッジを介してつながっていますので、これらのデバイスは他のデバイスとの兼ね合いでウエイトが入ることがあります。
それに対してGPIOは他のメモリと同じバスに直接つながっていますから、メモリと同等のアクセススピードが保障されています。言い換えればCPUが実行する命令セットに同期して、I/Oを制御することが可能なのです。
それではまず、いつものLチカのプログラムから見てみましょう。元のプログラムでは発光ダイオードはLED1につなぎますが、この後のプログラムとの比較でLED2に変更します。
1: #include "mbed.h" 2: DigitalOut myled(LED2); 3: int main() { 4: while(1) { 5: myled = 1; 6: wait(0.2); 7: myled = 0; 8: wait(0.2); 9: } 10: }
これは6行目と8行目にwait命令があるので、人が見ても発光ダイオードの点滅が認識できますね。それでは、この6行目と8行目のコメントアウトしてみましょう。
1: #include "mbed.h" 2: DigitalOut myled(LED2); 3: int main() { 4: while(1) { 5: myled = 1; 6: // wait(0.2); 7: myled = 0; 8: // wait(0.2); 9: } 10: }
このプログラムをマイコンで実行させると人の目には常に点灯しているとしか見えませんよね。ある程度組み込みに興味があって、手元にオシロスコープか周波数カウンターかロジアナを持ちの読者なら必ず試してみたことがあるプログラムだと思います。
それでは実際にどのくらいの速さで点滅しているかオシロスコープで見てみましょう。
グラフから見てとれる通り1秒間に約74万回の点滅を繰り返していることが分かります。これでもLチカとしては十分に速いのですが、先に説明したようにGPIOはCPUにバスで直接つながっているので、その限界に挑戦してみたいと思います。
Copyright © ITmedia, Inc. All Rights Reserved.