1

与我的问题最接近的线程是这些在#define 宏中转义 # 符号?以及如何通过 C 预处理器打印磅/哈希?,但他们并没有完全回答我的问题。更明确地说,第二个似乎不适用于 armcc 编译器。它只打印 hash4 而不是 hash 定义的符号。Chris Lutz 在第二篇文章中特别贬低了尝试使用宏来实现此功能,所以这可能是错误的方法。不过,我想要更多的想法,而不仅仅是一个人。

问题如下:我正在尝试编写一个使用宏定义嵌入式 asm C 函数的宏。我基本上已经实现了它,除了一个问题......表达了一个直接的价值。立即值的语法需要(我相信)一个磅符号,它也是预处理器的“字符串化”符号。那么,是否可以在 C 宏中转义 # 符号?

这背后的主要目的是用 pico 内核线程上下文管理过程包装 isr,并且新过程的函数指针最终将传递给向量中断控制器。

这是代码:

#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

您引用的第二个问题向您展示了如何做到这一点:

#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 回答