2
  1. lpc 1769(cortex m3)でコンテキストスイッチを実行しようとしています。数値の指数を計算し、それをユーザーモードでサブルーチンとして実行するルーチンを作成しようとしていますが、SVC呼び出しと割り込みハンドラーを使用して、SVCプロセスに端末との対話を要求します。印刷する値は、レジスタ引数としてSVCに渡す必要があります。

  2. ユーザーモードからメインモードにモードを切り替える場合、ユーザーモードのスタックに保存されている値をメインモードにするにはどうすればよいですか?

  3. 誰かが上記のクエリのための小さなプログラムを書いてくれませんか?

前もって感謝します。

4

1 に答える 1

2
  1. 最大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を参照してください。

  1. ユーザーモードスタックから直接値を取得できます。インラインアセンブラを使用して、呼び出し元が使用するスタックを判別します。

        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 */
        );
    
  2. 私も現在これに悩んでいるので、ブログに投稿しました。IDEはGCCを使用しているため、これも当てはまるはずです:http: //falstaff.agner.ch/2013/02/18/cortex-m3-supervisor-call-svc-using-gcc/

于 2013-02-18T22:40:41.367 に答える