ベアメタルで高速I/Oに挑戦、LPC1114の実力に迫る:「mbed」で始めるARMマイコン開発入門(12)(2/4 ページ)
mbedでベアメタルプログラミングを行うメリットは、バイナリサイズの縮小だけではなく、直接制御によって高速なI/Oを実現可能です。Lチカを例に、ベアメタルプログラミングによる高速I/O制御を試します。
ベアメタルでFastI/O
それでは、クラスライブラリを使わないベアメタルでプログラムを書いてみたいと思います。
内容としては前ページのプログラムと同じなのですが、ベアメタルとなるとLPC1114固有ペリフェラルのレジスタアドレスを意識する必要があります。今回の場合mbed.hがインクルードするヘッダファイル(またこれからインクルードされるファイル)に定義されているので、そのシンボルを使うだけでよいのですが、実際にはGPIOの入出力を設定するLPC_GPIO0->DIRやGPIOに対して値をやりとりするLPC_GPIO0->DATAなどはLPC1114のアドレス空間である0x5000-00000台にマッピングされています。
それでは簡単にプログラムを見ていきましょう。3行目でGPIOの入出力を設定するレジスタの7bit目のみを1としています。よってPort0の7番目のピンのみ出力に設定しています。ベアメタルではピンの指定の仕方がmbedとは異なりますので注意が必要です。次にベアメタルで使うピン配置図を示します。
Port0だけですが、レジスタのビットとLPC1114のピンの対応を表にしておきました。Bit7に対応するのはLPC1114の28番ピンになります。mbedでいうところのdp28あるいはLED2にあたります。
次に永久ループの中では交互にGPIO0DATAにマッピングされているレジスタへ、0x80と0x00を書き込みます。0x80が書き込まれた時には、28番ピンがhighになり0x00の場合はLowとなります。これをノーウエイトで繰り返すことになります。
1:#include "mbed.h" 2:int main(void){ 3: LPC_GPIO0->DIR =0x00000080; //Port0-7のみ出力ポート 4: while(1){ 5: LPC_GPIO0->DATA=0x0000080; 6: LPC_GPIO0->DATA=0x0000000; 7: } 8:}
このプログラム(List3)を実行した時の、LPC1114のピンに出力される波形を見てみましょう。
測定の結果グラフから波形の周波数は6.87MHzでした。これは1秒間に約687万回ループを繰り返していることになります。ベアメタルにすることによりクラスライブラリーを使ったものより9倍以上高速化することができました。
Copyright © ITmedia, Inc. All Rights Reserved.