最大4つのパラメーターを簡単に渡すことができます。C関数を記述し、インラインアセンブラを使用してスーパーバイザを呼び出すだけです。
#define svc(code) asm volatile ("svc %[immediate]"::[immediate] "I" (code))
#define SVC_WRITE_DATA 1
void sv_call_write_data(char *string, int length)
{
svc(SVC_WRITE_DATA);
}
スーパーバイザコールハンドラでこれらのパラメータを抽出する方法については、ポイント3を参照してください。
ユーザーモードスタックから直接値を取得できます。インラインアセンブラを使用して、呼び出し元が使用するスタックを判別します。
asm volatile(
"tst lr, #4\t\n" /* Check EXC_RETURN[2] */
"ite eq\t\n"
"mrseq r0, msp\t\n"
"mrsne r0, psp\t\n"
"b %[sv_call_handler_main]\t\n"
: /* no output */
: [sv_call_handler_main] "i" (sv_call_handler_main) /* input */
: "r0" /* clobber */
);
私も現在これに悩んでいるので、ブログに投稿しました。IDEはGCCを使用しているため、これも当てはまるはずです:http: //falstaff.agner.ch/2013/02/18/cortex-m3-supervisor-call-svc-using-gcc/
于 2013-02-18T22:40:41.367 に答える