前回通販で注文した「初心者スタータキット」の到着を待つ間、Arduino UNO R3と、搭載されているMCU(Micro Controller Unit)、ATmega328について、理解を深めてみようと思います。
元々は、Atmelという会社のMCUでしたが、会社ごと買収されて、現在は違う会社になっていたはずです。まずは、データシートを検索してみます。
検索:別ウインドウが開いて検索します
とりあえず、データシートをインターネットで見つけました。ざっとした特徴は以下の様に読み取りました。
データシートには、プログラマモデル(レジスタセット)やメモリマップが載っていなかったので、その辺りは不明。命令セットの要約(一覧表)が載っていたので、そこから類推すると、
アセンブラでプログラムするつもりはなく、Cを使うので、一部不明なままでも特に実害ないと思われます。このMCUが得意/不得意とする処理がどういうものなのか?どの程度のことができるのか?ざっくり掴むことが目的です。
汎用レジスタが32本ということは、オペコードの内5ビットはレジスタフィールドだということです。基本的な演算命令は、以下の様に2レジスタの指定が必要です。
ADD Rd, Rr …… Rd ← Rd+Rr (Add two Registers without Carry)
このような命令の場合、オペコードの内10ビット=5ビット×2は、2つのレジスタを指定するためのレジスタフィールドに割り当たってしまいます。しかしながら、この命令の実行サイクル数は1クロックです。10ビット以上のオペコードを1サイクルでフェッチできるということは、少なくとも、フェッチバスは16ビット以上のバンド幅のはずです。
と言って、このクラスのMCUで、16ビットを超えて24ビットとか32ビット幅のフェッチバスを持っているとは考え難いので、おそらく、命令長は16ビットの固定長が基本になり、16ビットフェッチバスから1クロックでフェッチしているのでしょう。それが1MIPS/1MHzの処理能力を支えている模様。
ATmega328の姿がおぼろげに見えたところで、今度は、Arduinoのホームページから、Arduinoの理解を深めてみます。
トップページから、「RESOURCES ⇒ REFERENCE」と進むと、「Language Reference(言語仕様)」に到達します。まずは、データタイプ(intのサイズ、大切✨)から確認しておきましょう。
int : 整数型。Arduino UNOでは16ビット、DueとSAMDベースのボードでは32ビット
筆者が購入したのはUNOですので、16ビットですね。longはMCUによらず32ビット。
floatも使えるようですね、サイズは32ビット。記載が無いのでわかりませんが、IEEEの32ビット単精度フォーマットでしょうか?ボードが届いたら確認してみましょう。
さらに精度の高いdoubleもありますが、「Language Reference」によると、UNOを含め、ATmega搭載の機体ではdoubleの実装はfloatと全く同じだと書いてあります。Arduino Dueという機体では、64ビットの倍精度が実装されている模様。まあ、floatがあれば十分。
ああ、太古の昔を思い出しました。FM-7(8ビット、6809 @4MHz)でC言語を動かしていたころを。intは16ビットだったし、確か、ギリギリfloatが実装されていたような……。データタイプの仕様はArduinoと似てますね。6809だと、汎用レジスタという概念はなくて、アキュムレータが2つしかなかったし、1命令辺り数クロックかけて実行していた時代ですので、今回のATmegaの方が10数倍高速になっていると思われます。
6809 @4MHz ⇒ ATmega328 @16MHz
動作周波数が×4倍速
サイクル当たりの実行命令数が×2〜4倍(?、6809の記憶が定かではない……)
比べる相手が数10年前のパソコンでは、意味がないですね……、スミマセン。
何にせよ、久々にOSの呪縛から逃れて、「すべてのCPUタイムは僕のもの!」という環境が楽しみです(1^−^)b。誰にも(OSやら他の並列実行中ソフトウェア等々)気兼ねせずに、ゴリゴリコーディングしていきたいと思いますっ。
Arduino UNO本体の回路図も確認しておきましょう。Arduinoのホームページトップから、「RESOURCES ⇒ PRODUCTS」と進み、「UNO」をクリックします。そのページから、更に、「DOCUMENTATION」 ⇒ 「SCHEMATICS」と辿ると、回路図にたどり着きます。
USBと電源周りがごちゃっとしていて難しいですが、ATmega周りは、クロック、リセット、電源周りが接続されて、必要な端子がそのままボードの端子に引き出されているだけのシンプルな作りです。ROM/RAM等のメモリはオンチップなので、「Arduinoボード」と言いながらも、ほぼ、ATmegaの端子が生で引き出されているだけという感じです。
外から5Vの電源がもらえて、USBが要らない用途だとしたら、この回路図からUSBチップ(ATmega16U2-MU)と電源回路が消え去りますので、残るのはCPU(ATmega328P-PU)のみですよ。
ブレッドボードで全体の動きを確認できたら、基板を起こし、面実装タイプのATmegaを買って実装したら、すぐ商業用(量産用)に転換できてしまう感じですね。
そういう状況ですので、CPUオンチップの周辺回路(シリアル、AD変換器、EEPROM等)の仕様について知りたいなら、ATmega328のデータシートにアクセスすればOKです。
インターネット上で集められた情報から、推測を含めた考察になっていますので、「正確なところ」を知りたい方は、その筋の文献等を参照ください。
今回の目的は、「どの程度の物なのか?」ざっくり理解することでしたので、以上の考察程度で目的は果たせたと考えています。
Amazonから「今日届きます」メールが届きました。次回は到着後、セットアップです。