gpt4 book ai didi

在嵌入式 arm asm - armcc 中使用立即值的 C 宏

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:07 26 4
gpt4 key购买 nike

最接近我的问题的线程是这些 Escaping a # symbol in a #define macro?How to print a pound / hash via C preprocessor? ,但他们并没有完全回答我的问题。更明确地说,第二个似乎不适用于 armcc 编译器;它只打印 hash4 而不是 hash 定义的符号。 Chris Lutz 在第二篇文章中特别反对尝试使用宏来实现此功能,因此这可能是不正确的方法。不过,我想要更多的想法,而不仅仅是一个人。

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

这背后的主要目的是用 pico 内核线程上下文管理程序包装一个 isr,并且新程序的函数指针最终将传递给 vector 中断 Controller 。

代码如下:

#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; \
}

我希望我已经足够详细地解释了所有内容。如果没有,请随时询问更多详细信息。

最佳答案

你提到的第二个问题告诉你如何去做:

#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;
}

我不认为这是个好主意,但至少它确实有效。

关于在嵌入式 arm asm - armcc 中使用立即值的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14616896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com