さて、とにかく実験を開始してみましょう。
とは言え、実験に必要な最低限のお話を最初に致します。
マイコン機能の中に「割り込み」と言うモノがあります。
いきなり「割り込み」に関して解説が行われることは通常あり得ないのですが、ここでは最初のテーマとして取り扱います。
「割り込み」とはどのような機能なのでしょうか?
ChatGPTに聞いてみましょう。
では、実際のマイコンで「割り込み機能」をどのように実装すればよいのでしょうか?
ここには「ベクターアドレス」「スタックポインタ」「プログラムカウンタ」と呼ばれるモノが威力を発揮致します。
続きは4月3日お昼に記述致します。少々お待ちください。
繰り返しますが「割り込み」は非常に難しい概念です。
通常のWebアプリケーションを作成している限りは、まず考える必要はありません。
しかし、様々な組み込み機器と呼ばれるモノやWindows、Linuxの心臓部ではバンバンに使用されています。
したがって、例えば、、、
Linuxを本当の意味で自由自在に操るためには絶対に必要な知識となります。
(自由自在に操る必要があるかどうかは分かりませんが。。。)
この概念が分からないと、Linuxシステムの本当の仕組みを知ることが出来ないと言っても過言ではありません。
仕組みが分からければ、自由自在に操れないという訳です。
お話を元に戻して「ベクターアドレス領域」とは何でしょうか?
「なんのこっちゃ」と思われること間違いなし!
簡単に言えば、プログラムと言うのはメモリに記録されています。
メモリは方式によっても異なりますが、番地により管理されています。
例えば、今回のメモリは0番地から始まると考えてみましょう。
皆さん、いきなり0番地からプログラム本体が記録されると思われますか?
「そりゃ、そうだろう!」「そんなのあたりまえやろ!!」
いやいや、そうとは限りません。
実は多くのマイコンでは、いきなり0番地からプログラムが実行されることは少ないと思います。
では、0番地には何が入っているのか?
謎ですよね。。。
実は0番地からしばらく続く番地には「ベクタアドレス」と呼ばれるものが入っていることが多いです。
例えば、プログラムを実行させたいと考えた時、「別に0番地以外からスタートしても何の問題もない」と言う考えがあります。
そうなんです。多くの場合0番地には「スタートアドレス」が記録されている場合が多いです。
「スタートアドレス」とは「一番最初のプログラム命令が実行される番地」を意味します。
この「スタートアドレス」に「1000」と記録すると「1000番地の命令が一番最初に実行される」仕掛けです。
では「何故そんなことをする必要があるのか」と言う考えが浮かぶと思います。
みんな!! ついてきているか!! 諦めるなよ!!
何だなんだ「割り込みベクタテーブル」ってのが出てきました。
いきなり、こんな難しい内容を取り扱ってよいのだろうか?
・・・
簡単に言えば、割り込みが発生した時、この「割り込みベクタテーブル」にそれぞれ記録されている「アドレス(番地)」にジャンプするという意味です。
時間によって割り込みを発生させた場合「タイマー割り込みベクタアドレス」
外部のピンからの信号により割り込みが発生させた場合「外部端子割り込みベクタアドレス」
実は割り込みには色々な種類があります。
それら各割り込みが発生した時、それぞれに応じた関数がある番地にジャンプするための番地がズラ~~と並んでいるメモリエリアがあるんです。
これが「割り込みベクタテーブル」と呼ばれているメモリ領域です。
メモリ領域ですので、0番地からしばらく続いています。
もし、0番地からプログラムをスタートさせてしまうと、これら「ベクタアドレス」の場所が無くなってしまいます。
これでは、割り込みが発生した時、どの番地に飛べばよいのか分かりません。
ですので、0番地からいきなりプログラムを書くことは基本しないことが多いのです。
・・・
でも、ジャンプしてしまったら、割り込み処理が終わった後、元の番地に戻ってこられないじゃないかと思われると想像致します。
これは困ります。どうすれはいいと思いますか?
・・・
ここで「スタックポインタ」と言うモノが出てまいります。
これで分かったら天才かも。。。
割り込みが起きた時、割り込みアドレスにジャンプしますよね。
その直前に、現在実行しているアドレスを、この「スタックポインタ」に乗っけるのです。
それから、割り込みアドレスにジャンプ!!
で、割り込み処理が終わったら、、、
再び「スタックポインタ」に戻って、乗っけていたアドレスを取り戻すのです。
そうすれば、、、
そうなんでよ。元のアドレス値が分かるわけです。
・・・
ところで、今実行中のアドレスってどうやって記録しているんでしょうか?
これが「プログラムカウンタ」です。
この「プログラムカウンタ」に実行したいアドレスを放り込むと、、、
そのアドレスの命令が順番に実行される仕掛けです。
解説ありがとう!ChatGPT!!
・・・
つまり、このプログラムカウンタに割り込みアドレスを入れれば、割り込み先命令が実行される。
そして、割り込み処理が終わって元のアドレスに戻りたいときには、スタックポインタの一番上に乗せてあるアドレスを取り出して、プログラムカウンタに入れる。
そうすれば、元のアドレスに戻って続きを実行できるって寸法さ。。。
「越後屋、そちも悪よのう。。。」
「お代官さまこそ、、、」
「わっはっはっはっ~~はぁ!!」
・・・
割り込み原理の解説はここで完了致します。
しかし、割り込みっていったい何に使用しているのでしょうか?
割り込みは例えば、、、
Linuxってマルチタスクなんです。
マルチタスクって知ってます?
・・・
明日に続く。