Arduinoのブートローダって何?(1)

このページをスマホなどでご覧になる場合は、画面を横長にする方が読みやすくなります。
目次へ  前のページへ (1) (2) 次のページへ
2014年01月31日 公開。
2016年05月19日 図3と図4を追加。
「フラッシュメモリライタ」と「ROMライタ」を「プログラムライタ」に書き換え、用語を統一した。

目次

1. はじめに … 1ページ
2. ブートローダの働き(一般論) … 1ページ
3. Arduinoのブートローダの仕組み … 1ページ
4. ブートローダが起動する条件 … 2ページ
5. スケッチ書き込み時のブートローダの動作 … 2ページ
6. 電源投入時あるいはリセットボタン押下時のブートローダの動作 … 2ページ

1.はじめに

Arduinoをある程度使い込んでくると、Arduino関係の本やサイトに、「ブートローダ」(あるいは「ブートローダー」)という言葉が良く出て来ることが気になってきます。ブートローダって一体なんでしょう。

2.ブートローダの働き(一般論)

「ブート」とはマイコンが起動することを意味します。「ローダ」とはプログラムやデータなどを、メモリに読み込むプログラムを意味します。それらが合わさった「ブートローダ」とは何を意味するのでしょうか?結論から言うと、マイコンの起動時に、外部からプログラムをメモリに読み込むプログラムの事をブートローダと言います。

Arduinoの話から離れてしまいますが、例えば、例えばSDカードに実行したいプログラム書かれているマイコンシステムの場合について考えます。SDカード中のプログラムはRAMに転送してからしか実行する事ができません。この場合、起動時にSDカードからRAMにプログラムを転送し、RAM上のプログラムに実行を移すための短いプログラムを、マイコン内蔵のROMに書き込んでおきます。これがブートローダです。(図1参照)

図1、SDカードに書き込まれたプログラムを実行する架空のマイコンシステム
図1、SDカードに書き込まれたプログラムを実行する架空のマイコンシステム

この場合、ブートローダの働きは、SDカードからRAMにプログラムを転送することと、RAM上のプログラムに実行を移す事だけですから、ブートローダのサイズは小さく、マイコンに内蔵するROMの容量もわずかで済むことが分かります。一方でRAMは、実行したいプログラムとそれが使うデータが入るだけの、大容量の物が必要です。

内蔵ROMが大容量のマイコンを使って、そこに実行したいプログラムを直接書き込む手もあります(図2参照)が、一般に内蔵ROMを書き換えるのは専用のプログラムライタが必要になるなど、手間が掛かります。一方で、図1の様に、ブートローダを使ってSDカード上のプログラムを読み込んで実行するようにしておくと、SDカードを差し替えるだけで、実行するプログラムの変更が出来るようになり便利です。

図2、SDカードを使ってプログラムを差し替えられない単純なマイコンシステム
図2、SDカードを使ってプログラムを差し替えられない単純なマイコンシステム

それでは、Arduinoのブートローダは、どんな働きをするのでしょうか?

広告

3.Arduinoのブートローダの仕組み

Arduinoにも色々種類があるので、Arduino Unoの場合を例に挙げて、ブートローダの働きを説明します。

Arduino Unoには、ATmega328Pというマイコンが使われています。このマイコンには32kバイトのフラッシュメモリ、1kバイトのEEPROM、2kバイトのRAMが内蔵されており、外部にメモリは増設できない設計になっています。(SPIやI2C接続のメモリを増設できますが、メモリ空間上には現れず、周辺機器扱いになる)また、プログラムを実行するには、フラッシュメモリに書き込む必要があり、RAMにプログラムを書き込んでも実行できない仕組みになっています。(ハーバードアーキテクチャ)

普通はATmega328Pのフラッシュメモリにプログラムを書き込むには、以下の2つの方法のいずれかを使います。

  1. ICソケットを装備したプログラムライタを使ってATmega328Pにプログラムを書き込み、そのATmega328Pをターゲット基板上のICソケットに差し込む (図3、Arduino Uno用ブートローダライタシールドの製作(2)を参照)
  2. ターゲット基板にATmega328Pを半田付けしておき、ICSP端子経由でプログラムライタからATmega328Pにプログラムを書き込む (図4、Arduino用122X32モノクログラフィックLCDシールド(Rev.B)の製作(2)を参照)
図3、ブートローダを使わずにプログラムを書き込む方法(1)
↑ 画像をクリックすると拡大
図3、ブートローダを使わずにプログラムを書き込む方法(1)
ターゲット基板からマイコンを外して、プログラムライタに装着し、プログラムを書き込む。その後、プログラムを書き込んだマイコンをターゲット基板に戻す。
図4、ブートローダを使わずにプログラムを書き込む方法(2)
↑ 画像をクリックすると拡大
図4、ブートローダを使わずにプログラムを書き込む方法(2)
ターゲット基板にマイコンを装着したまま、ICSP端子にプログラムライタを接続し、プログラムを書き込む。

ここではこれらの方法について詳しくは説明しませんが、いずれも専用のプログラムライタ(書き込み器)が必要になります。プログラムライタは数千円以上と比較的高価です。最近では秋月電子などでAVRISPmkIIというICSP端子専用のライタが3千円台で発売されていますので、以前と比べると安価にプログラムが書き込めるようにはなりましたが、それでもプログラムを書き込むライタだけでArduino Uno本体と同じくらいの値段になってしまいます。

マイコンを初心者が試しに使ってみようと思っても、プログラムライタの値段が一つのハードルになる可能性があります。また、マイコンボードとプログラムライタの2種類の道具を使いこなさなければならないのも、初心者には分かりにくいです。そこで、Arduino Unoでは、もっと安くスケッチ(プログラム)を書き込める方法を採用し、かつ、そのための書き込み器もArduino Unoの基板上に搭載してしまいました。(Arduino Proでは書き込み器の大半を外付けにしたため価格が安い)

Arduino Unoが採用したスケッチの書き込み方法は、フラッシュメモリに小さなブートローダを書きこんでおき、パソコンのUSBポートから送られてくるスケッチの情報を、シリアルインターフェースで取り込み、ブートローダがフラッシュメモリにスケッチを転送してから実行するというものです。最初にフラッシュメモリにブートローダを書きこむ際には、先ほど紹介したAVRISPmkIIの様な専用のライタが必要ですが、ブートローダの書きこみ作業はArduino Unoの製造時に行われるので、ユーザーは高価なライタを買うことなく、スケッチの書き込みができます。

図5、ブートローダを使ったスケッチ書き込みの概念図
図5、ブートローダを使ったスケッチ書き込みの概念図

図5は、ブートローダを用いてパソコンからATmega328Pのフラッシュメモリにスケッチを書き込む際の概念図です。

Arduino UnoにはATmega328Pというマイコンが内蔵されていますが、このマイコンにはリセット回路、シリアルインターフェース(USART)、フラッシュメモリ、CPU(図中には書いていない)などが内蔵されています。また、Arduino Unoには、USB-シリアル変換回路も内蔵されており、シリアル通信線を介してマイコン内のシリアルインターフェースにつながっています。またUSB-シリアル変換回路はリセット信号線を介してマイコン内のリセット回路へもつながっています。

一方で、スケッチを開発したパソコン内のハードディスクには、コンパイル済みのスケッチが書き込まれています。そのスケッチはUSBポートとUSBケーブルを介してArduino Uno内蔵のUSB-シリアル変換回路に送られます。その後、シリアル通信線、マイコン内のシリアルインターフェースと順に通ったスケッチの情報は、CPUにより、内蔵フラッシュメモリに書き込まれます。

ここで、USB-シリアル変換回路について ちょっと説明します。USBというのは、今ではどのパソコンにも内蔵されている、便利なバス(情報伝達の経路)ですが、その仕組みは複雑であり、USBインターフェースを内蔵しているマイコンは少数派です。ATmega328PにもUSBインターフェースが内蔵されておらず、USBの信号を扱うことができません。そこでUSB-シリアル変換回路を用いて、USBの信号をシリアルの信号に変換します。この変換回路に使うICは数百円であり、プログラムライタよりかなり安い点がポイントです。

シリアル信号というのは、RX(受信信号線)とTX(送信信号線)の2本の信号線を使った単純な情報伝達信号で、ATmega328Pを含む、ほとんどのマイコンにシリアルインターフェースが内蔵されています。

このようにして、USB-シリアル変換回路のお陰で、パソコンのUSBポートから送られてきたスケッチをマイコンが受け取る事ができるのです。

マイコンから受け取ったスケッチをフラッシュメモリに書き込むためのプログラムが必要ですが、それがブートローダというわけです。またブートローダが起動するにはマイコンがリセットされる必要があるのですが、リセットを掛ける合図が、スケッチ書き込みの前にパソコンから送られてきて、USB-シリアル変換回路でリセット信号に変換され、マイコンのリセット回路に入力されます。

このページではブートローダの働きの概略を説明しましたが、次のページでは、時間順に、もう少し細かくブートローダの動作について説明します。

目次へ  前のページへ (1) (2) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1440円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
Arduino 電子工作
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。