gpt4 book ai didi

C如何定义一个可以被预处理器检查的上下文

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:50 25 4
gpt4 key购买 nike

在嵌入式系统上,我有一个函数,不能从中断上下文中调用。我想确保它在编译时得到检查。我想,如果预处理器可以检查这个就好了。我想到了这样的事情:

/* function that shall not be called from interrupt-context */
void function_not_to_call_from_isr(void)
{
#ifdef INTERRUPT_CONTEXT
#error This shall not be called from interrupt context!
#endif
// ... stuff ...
}

void someISRfunction(void)
{
#define INTERRUPT_CONTEXT
// here, the check can be performed
function_not_to_call_from_isr();
#undef INTERRUPT_CONTEXT
}

我的问题是,是否可以做一些魔术,这样我就不必手动定义/取消定义 INTERRUPT_CONTEXT?喜欢:

#define INTERRUPT_SERVICE_ROUTINE(funcName) void funcName(void) // magic needed here...

有什么想法吗?

最佳答案

你不能,因为所有的 #define 在实际编译之前都会展开。你需要一个变量

#define INTERRUPT_CONTEXT_ENTRY do {frominterrupt++;} while(0)
#define INTERRUPT_CONTEXT_EXIT do {frominterrupt--;} while(0)
#define FROM_INTERRUPT (frominterrupt > 0)
#define ISR_PANIC (frominterrupt < 0)

volatile int frominterrupt = 0;


void interrupt_handler()
{
INTERRUPT_CONTEXT_ENTRY;
/* do something*/
INTERRUPT_CONTEXT_EXIT;
}

void function_not_to_call_from_isr(void)
{
if(ISR_PANIC)
{
/* start the suicide procedure */
/* your program is dead anyway */
}

if(FROM_INTERRUPT)
{
/* do something - illegal call */
}
else
{
/* do normall stuff */
}
}

关于C如何定义一个可以被预处理器检查的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45940698/

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