与我的问题最接近的主题是这些Escaping a # symbol in a #define macro?和How to print a pound / hash via C preprocessor?,但它们并没有完全回答我的问题。更明确地说,第二个似乎不适用于armcc编译器;它只打印hash4而不是hash定义的符号。 Chris Lutz特别贬低在第二篇文章中尝试使用宏来实现此功能,所以这可能是一起使用不正确的方法。不过,我想要的想法不仅仅是一个人。
问题如下:我正在尝试编写一个使用宏定义嵌入式asm C函数的宏。我基本上实现了它,除了一个问题......表达了一个直接的价值。立即值的语法需要(我相信)一个英镑符号,它也是预处理器的“stringify”符号。那么,是否可以转义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; \
}
我希望我已经详细解释了所有内容。如果没有,请不要犹豫,询问任何更多细节。
答案 0 :(得分: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;
}
我不相信这是一个好主意,但它确实起作用。