您需要测试中断控制状态寄存器的VECTACTIVE字段。
我使用以下内容:
//! Test if in interrupt mode
inline bool isInterrupt()
{
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0 ;
}
SCM 和 SCB_ICSR_VECTACTIVE_Msk 是在 CMSIS (core_cm3.h) 中定义的,我想它会间接包含在您的部分特定标头中(我猜是 lpc17xx.h 或类似的)。我正在使用 C++,包括 C 中的 stdbool.h 将为您提供 bool 类型,或更改为您自己的 int 或 typedef。
然后使用它,例如:
void somefunction( char ch )
{
if( isInterrupt() )
{
// Do not block if ISR
send( ch, NO_WAIT ) ;
}
else
{
send( ch, TIMEOUT ) ;
}
}
如果需要假设不了解架构的解决方案,请考虑以下事项:
volatile int interrupt_nest_count = 0 ;
#define ENTER_ISR() interrupt_nest_count++
#define EXIT_ISR() interrupt_nest_count--
#define IN_ISR() (interrupt_nest_count != 0)
void isrA()
{
ENTER_ISR() ;
somefunction( 'a' ) ;
EXIT_ISR() ;
}
void isrB()
{
ENTER_ISR() ;
somefunction( 'b' ) ;
EXIT_ISR() ;
}
void somefunction( char ch )
{
if( IN_ISR() )
{
// Do not block if ISR
send( ch, NO_WAIT ) ;
}
else
{
send( ch, TIMEOUT ) ;
}
}
然而,问题是指安全检测中断上下文,这依赖于添加到所有ISR 的进入/退出宏。