ハードウェアの仕組みとソフトウェア処理 ―― マイコンの動作を理解する
tag: 組み込み 半導体 ディジタル・デザイン
技術解説 2009年11月27日
3. ソフトウェアの基本動作を理解する
マイコンのハードウェアには,メモリに置かれた命令コードをアドレス順に取り出して実行する仕組みが備わっています.これが,ソフトウェアの逐次実行です.さらに,不要な命令を飛び越したり,ある命令だけを選択して実行したり,同じ命令を繰り返して実行するために,別のアドレスに分岐する仕組みを持っています.これによって,分岐やループのソフトウェア構造が実現できます.
● ソフトウェアの基本は逐次実行
コンピュータのソフトウェアは,基本的には書いてある順に上から下に向かって実行されます(図7).ソフトウェア開発者としては,実行したい順にソフトウェア・コードを記述していけばよいわけです.
図7 ソフトウェアの基本は逐次実行
メモリに並べられた命令を自動的に順番に実行していく.
コンピュータのハードウェアや,ハードウェアの動きと1対1に対応した機械語やアセンブリ言語は,命令を順番に取り出して実行する逐次実行の働きを持っています.高級言語でもこの働きを用いて,命令を順番に実行していきます.
ところで,命令コードの中には,実行する順番が重要な部分とそうでない部分があります.例えば,
Z = A×X + B×Y
を計算するようなソフトウェアでは,A×XとB×Yの乗算を先に行い,その後で加算を実行しなければなりません.しかし,A×XとB×Yはどちらを先に計算しても構いません.
できることなら,A×XとB×Yは並列化して同時に実行して処理時間を短縮したいと考えます.しかし,マイコンの命令では直列化して逐次実行しなければなりません.
● 分岐とループで処理を制御
ソフトウェアには,複数の処理の中から一つを選んで実行する構造(分岐)や,同一の処理を何度も繰り返す構造(ループ)があります.ハードウェアや機械語,アセンブリ言語では,実行アドレスを書き換える分岐命令によって,これを実行します.
分岐命令によって実行アドレスを書き換えれば,それ以降は新しいアドレスから逐次実行が行われます.すでに通過してきたアドレスに戻るように分岐することによって,同じ処理を繰り返し実行することができます(図8).
図8 無条件分岐による無限ループ構造
分岐命令によって実行アドレスを書き換えれば,それ以降は新しいアドレスから逐次実行が行われる.すでに通過してきたアドレスに戻るように分岐することによって,同じ処理を繰り返し実行することができる.ループを抜け出す方法がなければ,無限ループになる.組み込みソフトウェアでは,機器の電源をOFFしない限り処理を続けるため,全体を無限ループ構造にすることが多い.
処理の中では,何らかの条件を判断して,どの処理に分岐するかを決めたい場合があります.そのため,ハードウェアや機械語,アセンブリ言語では,直前に行った演算の結果に応じて分岐するかどうかを決める仕組みが用意されています(図9).例えば,演算結果の値が正のときだけ分岐するとか,演算によってけた上がりが起きたときだけ分岐するというように,さまざまな条件に対してきめ細かく分岐命令が用意されています.このような仕組みを,条件分岐と呼びます.
図9 条件分岐によるif構造
演算結果の値が正のときだけ分岐するとか,演算によってけた上がりが起きたときだけ分岐するというように,さまざまな条件に対してきめ細かく分岐命令がある.
条件分岐と無条件分岐を組み合わせることで,二者択一の分岐構造を作ることができます(図10).
図10 条件分岐と無条件分岐によるif~else構造
条件分岐と無条件分岐を組み合わせることで,二者択一の分岐構造を作ることができる.
さらに,ループと条件分岐を用いれば,ループ処理の回数をカウントして,n回ループしたらループから抜けるというような処理を容易に実現できます(図11).
図11 条件分岐と無条件分岐による前判定のループ構造
無条件分岐によるループ構造に条件分岐を組み合わせると,ループ処理の回数をカウントして,n回ループしたらループから抜けるというような処理を作ることができる.
● 同じ処理を効率良く記述できるサブルーチン
マイコンでは,逐次実行,分岐,ループによって,ソフトウェアの基本的な構造を実現できます.さらに,ソフトウェアのあちこちで同じ処理を効率良く実行する仕組みとして,サブルーチンがあります.
一つのソフトウェアの中には,同じ処理がいろいろな場所で行われている場合がしばしばあります.このような処理を1カ所にだけ記述しておき,ほかの部分からはそれを呼び出して利用する仕組みがサブルーチンです(図12).
図12 同じ処理を効率的に記述できるサブルーチン
一つのソフトウェアの中には,同じ処理が繰り返し出てくることが多い.そこで同じ記述は一つにして,自由に呼び出せるようにする.呼び出し時には戻りアドレスを特別なメモリに保持しておく.サブルーチン終了後は,保持しておいた戻りアドレスから実行を再開する.
例えばC言語では,関数という形でサブルーチンを利用することができます.サブルーチンを用いれば,ソフトウェアを簡潔に分かりやすく書くことができます.
サブルーチンを呼び出すときは,呼び出し位置からサブルーチンの先頭アドレスに分岐し,サブルーチンの実行が終了したら,また呼び出し位置に戻ってこなければなりません.これを実現するために,マイコンには特別な分岐命令としてサブルーチン・コール命令と戻り命令が用意されています.
サブルーチン・コール命令を実行すると,指定したサブルーチンの先頭アドレスに分岐します.そのときサブルーチン・コール命令の次の命令のアドレス(戻りアドレス)が特別なメモリ(スタック)に自動的に記憶されます.
サブルーチンの末尾には,必ず戻り命令を置くことになっています.戻り命令は,特別なメモリ(スタック)から戻りアドレスを取り出して,そのアドレスに分岐する命令です.これによって,サブルーチンを終了したら呼び出し位置に戻って,その次の命令に進むことができます.