コンピュータは通常、記憶装置(メモリ)に記録されたプログラムを実行する装置です。多くのコンピュータは一般にノイマン方式と呼ばれ、メモリに書かれたプログラムを逐次実行する機械です。このプログラム実行部分をCPU(Central Processing Unit:中央処理装置)と呼びます。
CPUは途中必要があれば、入出力回路を介して外部からデータを取得したり、逆にデータを書き出したりします。
ここでは、組み込み型コンピュータとして、家電製品や自動車などに組み込まれる小型コンピュータの構造を紹介します。
組込用コンピュータはワンチップコントローラとかマイクロコンピュータとも呼ばれます。1つのチップ(IC:集積素子)にコンピュータの多くの機能が組み込まれています。
命令を実行するプロセッサ、
命令を記憶するROM(読み出し専用で、電源を切っても記憶が失われないメモリ)、
データを記録するRAM(読み書きできるメモリ)、
簡単な入出力制御用の回路、
等が一つまたは数個のチップに組み込まれています。
(画像は http://www.picfun.com/cpuframe.html )
プログラムは複数の「命令」を組み合わせて、作成します。命令は、データメモリにアクセスしたり、演算や条件判断、次に実行する命令の決定、等を行います。小型のプロセッサの処理単位はバイト(8ビット)で、演算も加減算や論理演算子かできません。
コンピュータは通常 PC と呼ばれるレジスタ(プロセッサ内部の記憶回路)に実行する番地を記録します。命令を実行すると、PCは自動的に増加し次の番地の命令を実行します。しかし、特殊な命令(制御命令)では、先の命令の実行結果により、次に実行する番地を変更することができます。この制御命令で条件付の実行や、繰り返し処理が可能になります。
多くの計算機では、プログラムを計算機の命令とは独立した いわゆる 「高級言語」で記述し、コンパイラと呼ばれるソフトで、機械語と呼ばれる命令に変換し、実行します。CやJavaは高級言語の仲間です。
しかし、組込用コンピュータでは命令に対応するアセンブリ言語で直接プログラムすることもあります。アセンブリ言語はアセンブラと呼ばれるソフトで命令に変換されます。
組み込み型計算機では、複数の端子(ピン)を通して、ディジタル信号を入力したり、出力します。外部のスイッチやアナログ信号を入力し、結果を端子に出力して、ランプの点灯やモータの制御をします。ただし、組込用コンピュータの出力する端子では、数十m(ミリ)W(ワット)程度ですから、大きな電力を使用する装置を駆動するには、ドライバと呼ばれる高電力の制御回路を外付けする必要があります。
組込用コンピュータには、ディジタルインターフェース以外にアナログインターフェースも必要です。
音や映像の物理的信号は、人の感覚器官で時間的に変化する信号として知覚されます。この信号をアナログ信号といいます。計算機で処理する場合、物理的信号をセンサーで電気的なアナログ信号に変え、このアナログ信号を一定時間間隔でディジタルな数値に変換し、この数値を計算機で記録し、処理します。このアナログ信号からディジタル信号への変換装置を AD(Analog-Digital)変換といいます。この処理は、音声の場合ディジタル録音、画像の場合ディジタル録画とかキャプチャとも呼ばれます。
処理(あるいは)記録したディジタル信号を元のアナログ信号に戻す処理を DA(Digital-Analog)変換といいます。このアナログ変換した信号を、スピーカやディスプレイで人に知覚できる物理現象に変換します。
組込用コンピュータは固有の数十の「命令」を組み合わせたプログラムを実行します。命令は演算命令、制御命令、入出力命令、に大別されます。
演算命令は加減算と論理演算などがあり、データメモリや入力したデータの間で演算処理をします。
制御命令は次に実行する命令を指定する命令です。プログラムは通常0番地の命令から、1,2,3と順番に命令を実行していきます。しかし、制御命令を実行すると、直前に実行した演算命令の結果によって、次に実行する命令の番地を変更することができます。
入力命令は計算機に接続された機器からディジタル信号を取り込みます。出力命令は、計算機が処理した値を機器に出力します。
計算機にはメモリが組み込まれています。メモリは番地(address)とデータ信号を持ち、指定した番地のデータを読み出したり、番地とデータを指定して、データを記憶することができます。
また、計算機のCPUにはレジスタと呼ばれる高速なメモリが組み込まれています。演算は、通常レジスタ間、または、レジスタとメモリの間で行われます。
C言語で、以下のプログラムを作成した場合を考えます。
int A,B;
A=B+10;
このプログラムは、Cコンパイラで次のようなプログラムに変換されます。
変数 A,B をデータメモリの100番地と101番地に割り当てる。
100番地の内容(変数A)を CPUのレジスタWに読み出す。
Wに定数10を加える
Wの値を101番地(変数B)に記憶する
このプログラムを次のような記号で表現します。
MOV W,100
ADDL W,10
MOV 101,W
MOVは値を「移動」する意味です。MOV W,100 は100番地を読みとりそれをレジスタWに記憶する意味です。ADDL W,10 は定数10をWに加える意味です。ADDLの最後のLは、「リテラル:定数」を意味します。MOV 101,W はWを101番地に記憶することを意味します。各行は「命令」で、プログラムメモリの10番地から記憶されているモノとします。
CPUの制御回路は、10,11,12番地の命令を順に読み出し、命令にデータメモリの番地が指定されている場合、データメモリを読み書きしながら命令を順に実行をします。
実行する命令の番地を記憶するため、制御回路は PC と呼ぶレジスタを内蔵しています。このPCを利用すると、制御回路の動作は
PC番地の命令を読み出す
読み出した命令を実行する
PCに1を加える
を繰返し実行することになります。以上を説明する図をご覧下さい。
演算命令だけでは、計算機は次々と命令を実行するだけで、繰返し(C言語のforやwhile)や分岐処理(C言語の if、else)のような、実行の流れを変える処理はできません。計算機の命令には、制御命令があります。その代表的な命令が ジャンプ命令とスキップ命令です。ジャンプ命令は記号では
GOTO 番地
と書きます。この命令を実行するには、CPUは次のように GOTO 命令の番地を、PCに記憶します。
PC <- 番地
CPUは、次の命令を PC 番地から取り出しますから、CPUは次の命令を PC 番地から実行します。これが、ジャンプ命令と呼ばれる理由です。
スキップ命令は、直前の演算結果により次の命令をスキップして、「次の次」の命令を実行することを指示する命令です。例えば、以下のように 100番地 の内容を1減らし、結果が0なら次の命令をスキップし、「次の次」の命令を実行します。
DEC 100 ;100番地の内容を1減らす
SKIPZ ;結果が0なら、次のGOTO命令をスキップする
GOTO 10 ;0でなければ、10番地へジャンプする
このように、スキップとジャンプを組み合わせると、以下の例のように 繰返しや条件分岐を実行できます。
GOTO命令は、GOTO命令を示す命令のコード部と番地を示す番地部から構成されます。GOTO命令を実行するには、下のように GOTO 命令の番地部の値を、PCに記憶することで実行できます。
また、SKIP命令は条件を満たした場合、PCを1つ余分に増やすことで実現できます。
プログラムの例として、繰返し制御を紹介します。Cはある番地のデータメモリの内容とします。
最初Cの値を10にします。
繰返し処理をするプログラムをAを実行します。
Cを1減らします。
減らした結果、0になった場合次のジャンプ命令をスキップします。
そうでないとき、次のジャンプ命令に進みます
これを次のような記号命令で表記します。
9 MOVL 100,10 ;定数10を100番地の保存 10 <処理A> 。。。 18 DEC 100 ;100番地の内容を1減らす 19 SKIPZ ;その結果が0なら次の命令をスキップする 20 GOTO 10 ;10番地に戻る 21 |
ここで、MOVL命令:「Cの値を10にする」、や DEC命令:「Cを減らす」は演算命令です。SKIP命令は制御命令の仲間で、スキップ命令と呼ばれます。Cを減らした結果0になった場合、次の命令を飛ばして(スキップする)ジャンプ命令の次の命令に進みます。結果が0でない場合、次のジャンプ命令に進みます。
GOTO:ジャンプ命令は、次に実行する命令の番地を指定することができます。この場合、処理Aの先頭の命令(10番地)に 「ジャンプ」します。
このプログラムを実行すると、処理Aを10回繰り返して実行することができます。ただし、処理Aの中でCの値を変更しないものとします。
次は、条件付の実行をするプログラムの例です。AとBの値が等しいときだけ、処理Aを実行したいとします。
最初に C=AーB の計算をします。 この結果でスキップ命令を実行します。 結果が0の場合次の命令をスキップして、 処理Aのプログラムを開始します。 スキップしないと、ジャンプ命令を実行し、 処理Aのプログラムの次に(18番地)ジャンプします。 この場合、処理Aを実行しないことになります。 10 MOV W,A 11 SUB W,B 12 SKIPZ 13 GOTO 18 14 処理A 15 。。。 18 |
これで、大小比較による条件判断ができます。
繰返しと条件判断を繰り返すと、最大温度を計測することができます。外部に温度に対応した電圧を発生する温度センサがあり、PICのアナログ端子に接続されているモノとします。データメモリの番地Tに最大温度を記録します。
次のようにプログラムします。 最初Tを-100とします (小さな値ならなんでもかまいません)。 温度を読み、その値をメモリのP番地に読み込みます。 TからPを引き算し、結果が正なら Tの方が大きいので次の命令をスキッ プします。 そうでなければ、Tの値をPに書き換えます。 これを繰り返します。 |
このままでは、結果を表示できませんが、小さな数字表示回路を付加すると、結果を表示できます。あるいは、シリアル通信でパソコンにデータを送ります。この場合、測定したデータを送るようにすると、温度のグラフ表示ができます。
CPUの基本は、以下の処理を行うことです。
命令の取り出し
命令の実行(演算命令の場合)
PCの値の更新
通常は1を増す、
GOTO命令の場合はPCの値を番地部で置き換える
SKIP命令の場合、条件を満たせば、PCに1を加える
これで、プログラムメモリのプログラムによって処理を行う、「万能コンピュータ」が実現できます。ただし、最近の計算機には、他の制御機能(命令)が含まれています。
制御命令には、スキップ、ジャンプ命令以外に、戻り番地を記録して指定番地にジャンプするCALL命令と、記録した番地に戻る RETURN 命令があります。
例えば、PICには乗算命令がありません。それで、乗算を行うプログラムを作成し、最後に RETURN 命令を付けておきます。乗算プログラムの先頭番地を MULT とすると、乗算は
CALL MULT
で実行できます。CALL 命令で乗算の番地にジャンプしますが、乗算が終了すると RETURN命令で CALL 命令の次の命令の戻ることができます。
CALL 番地 命令では、指定番地にジャンプする以外に、戻り番地を記憶する必要があります。これには通常、スタックを利用します。スタックへの記憶をPUSH,スタックからの取り出しをPOPとすると、CALL 番地 命令は
PUSH
PC
GOTO 番地
で実行することができます。また、RETRUN命令は
POP PC
で実現できます。ここで、POP PC は、スタックから取り出した番地データを PC に記録することを意味します。
これまでの計算機のプログラム実行の方式では、計算機はあるプログラムの実行を始めると、それが終了するまで、別のプログラムの実行を始めることはできません。でも、最近のパソコンは一度に多くのプログラムを実行しているように見えます。これは、どんな「からくり」を利用しているのでしょうか?
実は計算機には、ハードウエアの信号により特定のプログラムを呼び出す仕掛け、があります。この仕掛けを「割り込み」機能といいます。
例えば、10m秒毎に発生する信号で、実行するプログラムを切替えるプログラムを呼び出す「割り込み」機能を設定しておきます。この機能はタイマー割り込みと呼ばれます。メモリ中にある複数のプログラムを同時に実行できるのは、このタイマー割り込みによる「プログラム切替え」が行われるからです。
割り込み機能は、ハードウエア信号によるサブルーティン呼び出しです。割り込み処理が終了し、元のプログラムに戻れば、実行を「再開」できます。割り込み信号として、データ到着に伴う受信回路からの信号を利用すれば、他のプログラム実行中に、ネットワークからのデータを受信することができます。
「割り込み」を実現するには、割り込みを有効、無効にする機能と、サブルーティンの「呼び出し」と「戻る」機能が必要です。
最高と最低温度を記録するプログラムのフローチャートを書いて下さい。