gpt4 book ai didi

embedded - 安全检测,是否从 ISR 调用函数?

转载 作者:行者123 更新时间:2023-12-03 13:42:53 25 4
gpt4 key购买 nike

我正在为 ARM Cortex M3 (NXP LPC1769) 微 Controller 开发软件。目前我正在寻找一种机制来检测我的函数是否在 ISR 中被调用。我想我必须检查登记册。基于这些信息,我想调用困难的函数。

如果有包含必要信息的寄存器,我已经检查了引用手册。

例如,我尝试根据“中断事件位寄存器”(IABR)寄存器检测是否从 ISR(我使用 SysTick-ISR)调用了我。如果 ISR 处于事件状态,则该寄存器应为 != 0。但值是 0x00000000。这意味着没有中断处于事件状态。除了这个测试,我在引用手册中检查了 NVIC 和 SC 寄存器,寻找包含必要标志的寄存器,但我没有找到。

有人知道适合我的问题的寄存器/机制吗?

最佳答案

您需要测试中断控制状态寄存器的 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) 中定义的,我想它会间接包含在您的部分特定 header 中(我猜是 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 的进入/退出宏。

关于embedded - 安全检测,是否从 ISR 调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16656489/

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