ARM ベースのマイクロコントローラーで SVC 呼び出しを記述する適切な方法を知りたいです。
これまでの私の理解では、ARM には例外ベクトル テーブルがあります。つまり、プログラムの最初の命令は、適切なハンドラーへの分岐でなければなりません。
RESET ;Handles reset
UNDEFINED ;Undefined instructions
SVC BL SVC_Entry
PRE_ABORT ;Prefetch abort
DAT_ABORT ;Data abort
次に、SVC 命令が実行されるたびに、モードがスーパーバイザーに切り替えられ、SVC で提供された番号が R0 に格納され、プログラムは適切なハンドラーに分岐します。
;== Handling SVC calls ========================================================
Max_SVC EQU 1
SVC_Entry CMP R0, #Max_SVC ;Check upper limit
BHI SVC_end ;Does nothing if unknown
ADD R0, PC, R0, LSL #2 ;Calculate table address
LDR PC, [R0, #0]
Jump_table DEFW SVC_0 ;Halt
DEFW SVC_1 ;Print string
;== SVC calls ================================================================
SVC_1 B SVC_end
SVC_end MOVS PC, LR ;Exiting
したがって、これらの指示がある場合:
ADR R1, string ;R1 points to the string
SVC 1 ;SVC_1 handles the printing
プログラムは、スーパバイザ モードに切り替え、番号「1」を R0 に格納し、SVC_1 へのジャンプ テーブル分岐に続いて、コードを実行し、ユーザー モードに戻す必要があります。
これは正しいです?私はそれを正しくやっていますか?
私がこれまでに抱えている問題は、コンパイラがこの行に対して「演算子が必要です」と言っているということです:
SVC BL SVC_Entry
このトピックに関する情報はインターネット上で見つけるのが難しいため、ARM マイクロコントローラーで SVC 呼び出しを適切に使用する方法を知りたいだけです。
どうもありがとうございました。
編集:基礎となるプロセッサは、約 240 MHz の ARM9 クロッキングです。これは AT91 マイクロコントローラーに含まれています。それが常駐するラボボードは、私の大学のニーズに合わせて変更されています。
コードは、シリアル ポートを介してカスタムメイドのプログラムを使用してボードにロードされます。このプログラムはデバッグも可能です。