私は PIC32 MCU (MIPS M4K コア) を使用しています。MIPS で割り込みがどのように機能するかを理解しようとしています。「See MIPS Run」本、公式の MIPS リファレンス、および Google で武装しています。誰も私が次のことを理解するのを手伝ってくれません:
次のように割り込みを宣言しました。
void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)
逆アセンブルを見ると、それRDPGPR SP, SP
が ISR プロローグ (実際には最初の命令) で呼び出されていることがわかります。バランシングWRPGPR SR, SR
命令が ISR エピローグで呼び出されます (以前に保存されたStatus
レジスタを CP0 に書き込み、 を呼び出す前ERET
)。これらの命令の目的は、以前のシャドー レジスタ セットから読み取って保存することであることがわかります。そのため、シャドー レジスタ セットからRDPGPR SP, SP
読み取って書き戻すのですが、その理由がわかりません。この ISR はシャドウ レジスタ セットを使用しないことを意図しており、実際に逆アセンブルすると、コンテキストがスタックに保存されていることがわかります。しかし、何らかの理由で、シャドウから読み取られ、シャドウに書き込まれます。どうしてこれなの?$sp
WRPGPR SR, SR
$sp
$sp
また、関連する質問: MIPS アセンブリ言語に関する本当に包括的なリソース (書籍など) はありますか? 「See MIPS Run」はとても良さそうです。MIPS アーキテクチャを掘り下げるための出発点としては最適ですが、いくつかのトピックは十分にカバーされていません。
- EIC (外部割り込みコントローラー) モードに関する情報はほとんどありません: EIC モードではの代わりにある
Cause
ことを示すレジスタ付きの図がありますが、それがどのように機能するかについては何もありません (たとえば、. 何を意味するのか説明すらありません (「Requested Interrupt Priority Level」、まあ、Google が助けてくれました). EIC が実装に依存していることは理解していますが、今述べたことは一般的なものです。RIPL
IP7-2
Cause->RIPL
Status->IPL
RIPL
- アセンブリ言語は十分にカバーされていません: たとえば、マクロ (
.macro
、.endm
ディレクティブ) については何も、既存のコードで見たいくつかのアセンブラ ディレクティブについては何も見つかりませんでした (たとえば、.set mips32r2
など)。 - ISR での
rdpgpr
/の使用については何も見つかりません。これらの命令 (および一般的なシャドウ レジスタ セット) について非常に簡単に説明しています。wrpgpr
公式の MIPS リファレンスも、これらのトピックではあまり役に立ちません。考えられるすべてのアセンブリ ディレクティブなどを網羅した本当に優れた本はありますか?