我使用带有stm32f控制器的CrossWorks目标库。在我的项目中,我启用了一些外部引脚中断。到目前为止他们工作,并且因为我或多或少偷了以前项目的配置,我倾向于说它应该是正确的。 所有ISR处理器看起来类似的东西:带有CrossWorks库的CTL_UNSUPPORTED_CALL_FROM_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中被认为是可以接受的,哪些不是。或者,如果我的信息有误,为什么我通常会遇到这种错误。
UPDATE
我的问题已经解决了,感谢保罗指着我吧。但我还不想结束这个问题。对于奖励积分,我很想了解CrossWorks如何检测阻塞函数,以及如何在运行时终止函数的执行,以及何时可能阻塞代码块。
我知道这是一个繁重的编辑,但现在还没有答案,它适合于关于文档和它背后的“如何”的一般问题。
你可以发布myLibFunction吗? – LPs
看起来图书馆认为你调用了一个函数,例如I/O,一种需要异步和等待中断(即阻塞)的动作。你不能从ISR调用这样的功能。 –
@保罗奥吉尔维,你是真的。在myLibFunction()的子函数中,我有一个'debug_print'-调用。这是一个CrossWorks lib函数,它通过jtag接口输出调试消息。我忽略了这一点。我的错和我为浪费你的时间道歉。该功能是“阻止”功能。但是,我真的会发现它很有趣,当CrossWorks遇到这样的代码时,如何识别这些函数,或者它如何终止执行。我会更新这个问题,鼓励人们深入研究。 – jwsc