我使用带有stm32f控制器的CrossWorks目标库。在我的项目中,我启用了一些外部引脚中断。到目前为止他们工作,并且因为我或多或少地从之前的项目中窃取了配置,我倾向于说它应该是正确的。 所有ISR处理程序看起来都是这样的:
void __attribute__((interrupt("IRQ"))) EXTI2_TSC_IRQHandler(void)
{
if ((EXTI_GetITStatus(BUTTON_6_INTERRUPT_LINE) != RESET)) {
ctl_enter_isr();
/* Clear the EXTI line 2 pending bit */
EXTI_ClearITPendingBit(BUTTON_6_INTERRUPT_LINE);
if(somecondition)
globalcounter++;
else
myLibFunction();
ctl_exit_isr();
}
}
一切都很完美,只要somecondition
为真。如果调用myLibFunction()
,则使用CTL_UNSUPPORTED_CALL_FROM_ISR参数调用ctl_handle_error函数并重新启动固件。到目前为止很清楚。
关于该错误的文档是不存在的(或者我太愚蠢了,无法找到它)。我只是在ctl_handle_error函数上面写了一条注释:
An interrupt service routine has called a tasking library function
that could block or is otherwise unsupported when called from inside
an interrupt service routine.
假设这些信息是正确的,那么什么被认为是"阻塞功能"通过CrossWorks?该函数没有任何循环。使用的唯一流控制是if()
语句。没有递归,while
,for
或其他任何内容。在所有情况下,拆卸的总长度低于50条指令。
我正在寻找一般性解释(或文档链接),这些功能在ISR中被认为是可接受的,而不是。或者,如果我的信息有误,为什么我一般都会收到这个错误。
更新
我的问题已经解决了,感谢Paul指点我。但我现在还不想关闭这个问题。对于奖励积分,我很想了解CrossWorks如何检测阻塞功能,以及在执行可能阻塞的代码块时如何在运行时终止函数的执行。
我知道这是一个繁重的编辑,但目前还没有答案,它适用于有关文档和"如何"的一般问题。背后。
答案 0 :(得分:1)
你可以通过查看hw寄存器来判断你是否在中断内。例如:
if(__get_IPSR() & IPSR_THREADED_MODE) {
/* I am not in interrupt context */
} else {
/* I am in interrupt context */
}
使用CMSIS for stm32时,可以在core_cmFunc.h中找到函数__get_IPSR()。我猜你所调用的函数将检查它运行的上下文并对其进行操作(即终止或其他)。