割り込み1
割り込みの種類
外部割込みと内部割込み
ハードウェア要因な割り込みを外部割込み、ソフトウェア要因の割り込みを内部割込み
と考えればいいかな。最近のマイコンは周辺デバイスもパッケージに集積されているから
DMACなんかもCPUの一部とか思っちゃうけど。DMACはあくまで周辺デバイスで分類するなら外部割込み。
内部割込みは、0割、オーバーフロー、禁止領域への書き込み、割り込み命令の実行がトリガーになって発生する。
禁止領域への書き込みってニュアンスがあれだけど、MC68000とかは奇数アドレスに対してワードアクセスしようとするとエラーが出たと思う、これって内部割込みが発生していたんじゃないかな。おいたをしたら怒られて割り込みが発生させてしまうのがMPUということで。
割り込み命令とは
これまたMS-DOSとか古いOSのシステムコール(プログラム終了とか)はこの仕組みを利用していた。
プログラムからOSに対して効率よくシステムコールをかけるのにこの仕組みが便利だったということかな。レジスタに機能の番号をセットして割り込み命令を実行するみたいな感じだったと思う。
NMI
ソフト的にマスクできない割り込み。
優先度も最も高い。
実際の使い方はNMIピンがあってそこにスイッチを付けてデバッグ用のNMIスイッチだったり
電圧の監視ICにつなげたりする。
優先度
たとえばIRQピンが3本あって同時に割り込みが発生したときどれが優先されるかという話。
このとき、一回の割り込み処理にめっちゃ時間が掛かる割り込み要因の優先度を上げたら
当然ながらシステム全体のリアルタイム性は下がる。
多重割り込み
多重割り込みが許可されていれば、優先度の低い割り込み処理の途中で優先度の高い割り込みが入ると後者が優先され、前者は後者の処理時間分だけ遅延させられる。
余談でマイコンが多重割り込みをサポートしてなくても割り込み処理の中で優先度処理してるケースも多いな。
多重割り込みがつかえるとき最大割り込み処理時間はもっとも優先度の低い割り込み処理が発生してから処理が完了するまでの時間となる
CPUとパイプライン
Fetch(取り込み)、Decode(解読)、Execute(実行)を平行作業して時間短縮したい!
というのがパイプラン処理
計算は式を覚えるがいいな。
(Depth+Instruction-1)*p
パイプラインバブル
パイプラインなんでジャンプ命令を実行しているときにはジャンプ命令の次の番地
に配置されている命令は取り込まれている、ジャンプしちゃうから使わないのに。。
その無駄がパイプラインバブル、無駄に実行される命令を遅延スロットという
しかたなくNOPをはさむとか??
1:add.w d0,d0
2:jmp HOGE
3:move.l a0,d0 ← 取り込んでも無駄!
パイプラインバブルを解消するアプローチ
<遅延分岐>
やってくれるのアセンブラの仕事になるけど?分岐命令の直前にある命令と
分岐命令の前後位置を入れ替えてアセンブルする。
そうするとjmp命令の実行時にはフェッチすべき命令が判明していることに
なるので無駄が発生しない。
上の例だと1と2を入れ替えてプログラムが作成される、つまり1の結果が
2に影響する場合はダメ。
ところで問題文の後続の命令を無条件に実行した後、実際の分岐が発生するって分かり難い
1を無条件実行したあと2による分岐が発生するということかな。
<投機的実行>
分岐しない方向の命令を先読みしておき、分岐するときには先読みしたものをキャンセルする。
分岐する方向を予測し,予測した方向の命令をあらかじめ実行しておく。
セグメント方式のアドレッシングとリロケータブルオブジェクト
この手の話は昔のパソコンを調べるといい気がする。
まずリロケータブルだけど
きょうびの仮想アドレスを使ってメモリアクセスするコンピュータではリロケータブル処理する必要がないようだ。
リロケータブルなプログラムとは?
アセンブラでプログラムを書いてたとえば無限ループするプログラムを書いたとして
プログラム中で指定するジャンプ先は自分のプログラムが置かれた場所になるわけだけど、これを決め打ちで0x1000番地としちゃうと、このプログラムは0x1000番地に置かれたときにしか成り立たなくなる。
これが、どこの番地においても成り立つプログラムはリロケータブルであるといえる。
リロケータブルなプログラムを作れるコンピュータは?
要は相対的なアクセスが必要になるわけだけど、設問ではセグメント方式のメモリアクセスと絡めて出題されている。
セグメント方式とは?
むかーしのインテルの8086というプロセッサ、この子の汎用レジスタは16bitだった。
でもICのアドレスバス用の足は20本生えていて1MB(メガビット)のメモリが接続できた。
でも汎用レジスタで表現できるのは64kb(キロビット)の空間だけ。
どうしよう。。
ならアドレスの指定を2段階でやりましょう!と
ベースになるアドレスとオフセットになるアドレスを組み合わせてアドレス指定を行う。
これによってめでたく大容量のメモリを扱うことができるようになった。
でリロケータブルとの関係は?
セグメント式は実メモリを細切れにして使うイメージになる。
プログラムからのメモリの参照はオフセット(相対)なのでリロケータブルなオブジェクト
になるという。