1

私の質問に最も近いスレッドは、#defineマクロで#記号をエスケープすることですか?Cプリプロセッサを介してポンド/ハッシュを印刷する方法は?、しかし彼らは私の質問に正確に答えていません。より明確に言えば、2番目はarmccコンパイラでは機能しないようです。hashで定義されたシンボルではなく、hash4を出力するだけです。Chris Lutzは、2番目の投稿でこの機能にマクロを使用しようとすることを特に軽蔑していたので、おそらくこれはすべて一緒に間違った方法です。ただ一人よりももっと考えてほしいです。

問題は次のとおりです。マクロを利用して組み込みasmC関数を定義するマクロを作成しようとしています。私は、1つの問題を除いて、基本的にそれを実装しました...即時の価値を表現します。イミディエイト値の構文には、プリプロセッサの「文字列化」記号でもあるポンド記号が必要です(私は信じています)。では、Cマクロで#記号をエスケープすることは可能ですか?

この背後にある主な目的は、isrをpicoカーネルスレッドコンテキスト管理プロシージャでラップすることであり、その新しいプロシージャの関数ポインタは、最終的にはベクトル化された割り込みコントローラに渡されます。

コードは次のとおりです。

#define ISR_THREAD_MGMT(ISR_FUNC,FUNC_NAME) \
__asm void FUNC_NAME ( void ); \
__asm void FUNC_NAME (void ) \
{ \
    STMDB sp!, {r0-r3}; \
    MRS   r0, SPSR; \
    SUB   lr, lr, #4; \        <----- Heres the problem
    STMDB sp!, {r0, r10, r12, lr}; \
    bl _thread_vectored_context_save; \
    bl ISR_FUNC; \
    b _thread_context_restore; \
}

私はすべてを十分に詳細に説明したと思います。そうでない場合は、遠慮なく詳細をお尋ねください。

4

1 に答える 1

1

参照されている質問の2番目は、その方法を示しています。

#define hash #
#define mash(x) x
#define immediate(a) mash(hash)a
#define ISR_THREAD_MGMT(ISR_FUNC,FUNC_NAME) \
__asm void FUNC_NAME ( void ); \
__asm void FUNC_NAME ( void ) \
{ \
    STMDB sp!, {r0-r3}; \
    MRS   r0, SPSR; \
    SUB   lr, lr, immediate(4); \
    STMDB sp!, {r0, r10, r12, lr}; \
    bl _thread_vectored_context_save; \
    bl ISR_FUNC; \
    b _thread_context_restore; \
}

ISR_THREAD_MGMT(abc,def)

出力:

# 1 "x.c"
# 1 "<command-line>"
# 1 "x.c"
# 17 "x.c"
__asm void def ( void ); __asm void def ( void ) { STMDB sp!, {r0-r3}; MRS r0, SPSR; SUB lr, lr, #4; STMDB sp!, {r0, r10, r12, lr}; bl _thread_vectored_context_save; bl abc; b _thread_context_restore; }

再フォーマットされた出力:

# 1 "x.c"
# 1 "<command-line>"
# 1 "x.c"
# 17 "x.c"
__asm void def ( void );
__asm void def ( void )
{
    STMDB sp!, {r0-r3};
    MRS r0, SPSR;
    SUB lr, lr, #4;
    STMDB sp!, {r0, r10, r12, lr};
    bl _thread_vectored_context_save;
    bl abc;
    b _thread_context_restore;
}

それが良い考えだとは思いませんが、少なくともうまくいきます。

于 2013-01-31T01:57:45.767 に答える