Warning: include(/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/common_header.php) [function.include]: failed to open stream: Permission denied in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 39

Warning: include(/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/common_header.php) [function.include]: failed to open stream: Permission denied in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 39

Warning: include() [function.include]: Failed opening '/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/common_header.php' for inclusion (include_path='.:/usr/local/php/5.3/lib/php') in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 39

Warning: include(/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342_body.php) [function.include]: failed to open stream: Permission denied in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 81

Warning: include(/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342_body.php) [function.include]: failed to open stream: Permission denied in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 81

Warning: include() [function.include]: Failed opening '/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342_body.php' for inclusion (include_path='.:/usr/local/php/5.3/lib/php') in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 81

通常は制御装置が割り込みを検知すると、通常は割り込みの種類ごとに決められたアドレスに CPU の処理が飛ぶことになっています。その「割り込みの種類ごと決められたアドレス」のことを割り込みベクタと言います。

割り込みベクタは通常 0 番地から割り込みの数だけ並んでいて、それぞれのベクタにはジャンプ命令が書かれています。実際に以下のようになっていました。「アドレス: アセンブリ命令 ; コメント」という型式になっています。

0 番地は リセット割り込みのベクタですが、電源を ON にしたことでリセットが起こるとプログラムカウンタが 0 番地をさして、次のサイクルで 0 番地に書かれている「 jmp 0x68」という「0x68 番地にジャンプしなさい」命令が実行されるといった具合です。今回のプログラムでは他に 18 番(シリアル受信割り込み)と 20 番(シリアル送信完了割り込み)に具体的なジャンプ先が設定されていること分かります。使わない残りのベクタはすべて 0xa2 へのジャンプになっています。そこで 0xa2 番地を見てみると、

となっており 0 番地に戻っているだけということが分かります。つまり、なんらかの不具合で予期せぬ割り込みが発生した場合にはマイコンにリセットがかかった状態と同じ処理をするということです。 これは avr-gcc がそうするようにしているだけであって、別に CPU 停止命令でもいいわけですが、次のアドレスは他の割り込みベクタなので 1 命令で済ます必要があり、殆どの場合において割り込みベクタにはジャンプ命令が書かれます。また、このベクタテーブルは私が書いたわけではありません。私が書いたのは用意されたマクロを使って割り込み関数を定義しただけです。おそらくそのマクロを使う事で、その関数が割り込み関数であることが gcc に伝わり、gcc は対応するベクタにその関数のアドレスへのジャンプ命令を設定するようになっているものと考えられます。

以上が割り込みベクタの説明です。割り込みを更に細かく分けると要因がマイコンの内部なのか外部なのか、またその割り込みをユーザが無視することができるのかできないのか、などの軸で割り込みもいろいろな種類に分かれますが、割り込みベクタに関しては皆同じです。

次回は 0x00 番地から 0x68 番地にジャンプして以降の処理について説明してみたいと思います。 0x68 番地に付けられたラベルが __main ではないので、すぐに main 関数が実行されるわけではないということは何となく察しがつきますが、さてさて何をやっているのでしょうか。

トラックバック(0)

このブログ記事を参照しているブログ一覧: AVR 向けバイナリをアセンブラレベルで見てみる(2) - 割り込みベクタ

このブログ記事に対するトラックバックURL: http://tsuyuguchi.com/mt/mt-tb.cgi/438


Warning: include(/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/footer.php) [function.include]: failed to open stream: Permission denied in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 188

Warning: include(/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/footer.php) [function.include]: failed to open stream: Permission denied in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 188

Warning: include() [function.include]: Failed opening '/home/sites/lolipop.jp/users/lolipop.jp-dp52316278/web/masaaki/mt/footer.php' for inclusion (include_path='.:/usr/local/php/5.3/lib/php') in /home/users/1/lolipop.jp-dp52316278/web/masaaki/mt/archives/2009/06/12-2342.php on line 188