「ルネサスの本気」、SH-2Aセミナーに行ってきました。LESSON1 SH-2とSH-2Aの比較5 [RX&SH&H8]
詳細はありません(笑)。
「最近のマイコンは!」と言えるほど色々知っている訳ではないので、ここでは最近ちょっと触っているCortex M3マイコンに関して言えば、割り込みの応答性の向上としてハードウエアがレジスタの一部を保存するようになっています。
ARMの場合AAPCSでしたっけ、C/C++言語標準のプロシージャ・コール規約で関数内で保証されるレジスタ、非保証のレジスタが決められており、それに準拠してハードウエアも作られている為に、割込み処理ルーチンが呼ばれる前にハードウエアが非保証のレジスタをスタックに退避してしまいます。
※資料によると次のレジスタが対象です。
PC、PSR、R0~R3、R12、LR
これ以外にもテールチェインや後着と言うなかなか良く考えられた方法での割込みの応答性の向上を計っています。
が、結局のところ保存先はRAMとなる訳です。
その為1クロックで保存可能なレジスタ数は1と言う事になりますので、上記8個のレジスタを保存する為には最低8サイクル必要となりますね。勿論スタックに使用しているRAMのアクセス速度が遅ければ更に時間が掛かる事となります。
更にこの先でソフトウエアによる割込み関数内部で使用するレジスタの退避が行われます。
なんだか割込みに応答するまでに随分時間が掛かっている様に思えますが、これでもSH-2のそれよりは随分進んでいるのも事実です。
今後発表されるマイコンでは、この割込み処理の高速化をハードウエア支援で行う方法が主流になる様な気がします。
さて、SH-2Aはどうなっているかと言えば、従来通りのSH-2方式、つまり必要なレジスタの退避はソフトウエアで行う方式も継続していますが、ここが多分ユニークなところなんだと思いますが、汎用レジスタ全部を特殊な領域に保存する方法も選択する事ができます。
この特殊な領域の事をバンクレジスタレジスタバンクと呼んでいる訳です。説明では15段のバンクレジスタレジスタバンク(群)があるとの事です。
この15と言う数字は一般的な割り込みの優先度の数である15と一致しているので、それぞれの優先度に対応したレジスタなのかと言えばそうではないみたいで、容量的に最大15の割込みでレジスタをバンクに保存可能と言った感じです。
ちなみにレジスタと言っているので本当にレジスタなのかと言えば、セミナーではメモリだと説明していました。うーん、ちょっと微妙な理解ですいません。
バンクレジスタレジスタバンクの動作はFILO、最初に入って来たデータは一番最後に出される、つまりスタックされているイメージですね。但し保存先は内蔵RAMでもなければ外部RAMでもなく専用のメモリであると。
バンクレジスタレジスタバンクに保存されるレジスタとその手順は、
1.ベクターテーブルオフセット、GBR、MACLを保存
2.R12、R13、R14、MACHを保存
3.R8、R9、R10、R11を保存
4.R4、R5、R6、R7を保存
5.R0、R1、R2、R3を保存
※プログラムカウンタやステータスレジスタは従来通りスタックに保存。
1~5まではそれぞれ1サイクルで実行されていますので、汎用レジスタの退避は5サイクルで完了しています。
しかもこれの保存先はRAMではないのでMバスを使わずに保存可能。その為前回解説した割込み処理ルーチンが開始するまでの間に全て完了していると言う事です。
この用にチート(笑)なバンクレジスタレジスタバンクですが、勿論欠点もあります。
それは最大でも15割込みしか有効ではないと言う事です。この為この15を超える、超えないをチェックするオーバーフロー検出機能も利用できる様になっています。「検出する/検出しない」で前回の割込み処理に入るまでのサイクル数に若干の違いが有るようです。
しかし割込みの優先度は15なので、通常の使い方であればオーバーフローする事は考え難いのですが、割り込み内部で現在の割込みレベル以下の割込みを許可するようにIbitを操作してしまった場合はその限りではありませんので、そう言った操作を行い且つレジスタバンクを利用するなら、チェックを有効として置いた方が良いのでしょう。
ちなみにセミナーでは同一レベルの割込みをレジスタバンクに保存する事は可能だが、あまりお勧めはしないとの事でした。
なお前回のベクターアドレスの読み込みが先に来ている云々の話は、例えばSH7216のハードウエアマニュアルの164ページの図6.4を見ていただければ判りますが、m3のメモリアクセス(PCの退避)と平行して割込み処理ルーチンのフェッチが開始されています。割込み処理ルーチンの開始アドレスはm1のメモリアクセスで読み込んでいますので、それ以降ならフェッチが可能であるのですが、まさにここではハーバードアーキテクチャの恩恵に与っても居る訳です。
レジスタバンクを利用する事で割込み処理の応答速度を向上出来る事は判りましたが、これ、RTOSのディスパッチャーを作る時は悩んじゃいそうですね。
※ついついバンクレジスタと書いてしまうし、、、。
「最近のマイコンは!」と言えるほど色々知っている訳ではないので、ここでは最近ちょっと触っているCortex M3マイコンに関して言えば、割り込みの応答性の向上としてハードウエアがレジスタの一部を保存するようになっています。
ARMの場合AAPCSでしたっけ、C/C++言語標準のプロシージャ・コール規約で関数内で保証されるレジスタ、非保証のレジスタが決められており、それに準拠してハードウエアも作られている為に、割込み処理ルーチンが呼ばれる前にハードウエアが非保証のレジスタをスタックに退避してしまいます。
※資料によると次のレジスタが対象です。
PC、PSR、R0~R3、R12、LR
これ以外にもテールチェインや後着と言うなかなか良く考えられた方法での割込みの応答性の向上を計っています。
が、結局のところ保存先はRAMとなる訳です。
その為1クロックで保存可能なレジスタ数は1と言う事になりますので、上記8個のレジスタを保存する為には最低8サイクル必要となりますね。勿論スタックに使用しているRAMのアクセス速度が遅ければ更に時間が掛かる事となります。
更にこの先でソフトウエアによる割込み関数内部で使用するレジスタの退避が行われます。
なんだか割込みに応答するまでに随分時間が掛かっている様に思えますが、これでもSH-2のそれよりは随分進んでいるのも事実です。
今後発表されるマイコンでは、この割込み処理の高速化をハードウエア支援で行う方法が主流になる様な気がします。
さて、SH-2Aはどうなっているかと言えば、従来通りのSH-2方式、つまり必要なレジスタの退避はソフトウエアで行う方式も継続していますが、ここが多分ユニークなところなんだと思いますが、汎用レジスタ全部を特殊な領域に保存する方法も選択する事ができます。
この特殊な領域の事を
この15と言う数字は一般的な割り込みの優先度の数である15と一致しているので、それぞれの優先度に対応したレジスタなのかと言えばそうではないみたいで、容量的に最大15の割込みでレジスタをバンクに保存可能と言った感じです。
ちなみにレジスタと言っているので本当にレジスタなのかと言えば、セミナーではメモリだと説明していました。うーん、ちょっと微妙な理解ですいません。
1.ベクターテーブルオフセット、GBR、MACLを保存
2.R12、R13、R14、MACHを保存
3.R8、R9、R10、R11を保存
4.R4、R5、R6、R7を保存
5.R0、R1、R2、R3を保存
※プログラムカウンタやステータスレジスタは従来通りスタックに保存。
1~5まではそれぞれ1サイクルで実行されていますので、汎用レジスタの退避は5サイクルで完了しています。
しかもこれの保存先はRAMではないのでMバスを使わずに保存可能。その為前回解説した割込み処理ルーチンが開始するまでの間に全て完了していると言う事です。
この用にチート(笑)な
それは最大でも15割込みしか有効ではないと言う事です。この為この15を超える、超えないをチェックするオーバーフロー検出機能も利用できる様になっています。「検出する/検出しない」で前回の割込み処理に入るまでのサイクル数に若干の違いが有るようです。
しかし割込みの優先度は15なので、通常の使い方であればオーバーフローする事は考え難いのですが、割り込み内部で現在の割込みレベル以下の割込みを許可するようにIbitを操作してしまった場合はその限りではありませんので、そう言った操作を行い且つレジスタバンクを利用するなら、チェックを有効として置いた方が良いのでしょう。
ちなみにセミナーでは同一レベルの割込みをレジスタバンクに保存する事は可能だが、あまりお勧めはしないとの事でした。
なお前回のベクターアドレスの読み込みが先に来ている云々の話は、例えばSH7216のハードウエアマニュアルの164ページの図6.4を見ていただければ判りますが、m3のメモリアクセス(PCの退避)と平行して割込み処理ルーチンのフェッチが開始されています。割込み処理ルーチンの開始アドレスはm1のメモリアクセスで読み込んでいますので、それ以降ならフェッチが可能であるのですが、まさにここではハーバードアーキテクチャの恩恵に与っても居る訳です。
レジスタバンクを利用する事で割込み処理の応答速度を向上出来る事は判りましたが、これ、RTOSのディスパッチャーを作る時は悩んじゃいそうですね。
※ついついバンクレジスタと書いてしまうし、、、。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
2010-01-30 22:48
nice!(0)
コメント(2)
トラックバック(0)
レジスタバンク,利子はつきますか?
要するに,スレッドごとに一組ずつレジスタファイルを持っていれば,コンテキストスイッチングの悩みはなくなるので,128セットぐらいのバンクが欲しいな.ついでに,タスク管理もハードウェアに任せてしまいたい.
by noritan (2010-02-02 10:23)
> レジスタバンク,利子はつきますか?
低金利時代なので、申し訳ない。
> ついでに,タスク管理もハードウェアに任せてしまいたい.
TRONチップ?。
タスク間の同期の必要が無ければ、256個位の割込み優先度を用意して究極のリアルタイム割込みマシーンとか。
それかプロペラーみたいに並列にするとか。
by hamayan (2010-02-02 10:37)