2016-12-12 35 views
1

我使用带有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()语句。没有递归,whilefor或其他。在所有情况下,拆卸的总长度低于50条说明。

我正在寻找一个一般的解释(或文档链接),哪些功能在ISR中被认为是可以接受的,哪些不是。或者,如果我的信息有误,为什么我通常会遇到这种错误。

UPDATE

我的问题已经解决了,感谢保罗指着我吧。但我还不想结束这个问题。对于奖励积分,我很想了解CrossWorks如何检测阻塞函数,以及如何在运行时终止函数的执行,以及何时可能阻塞代码块。

我知道这是一个繁重的编辑,但现在还没有答案,它适合于关于文档和它背后的“如何”的一般问题。

+1

你可以发布myLibFunction吗? – LPs

+1

看起来图书馆认为你调用了一个函数,例如I/O,一种需要异步和等待中断(即阻塞)的动作。你不能从ISR调用这样的功能。 –

+0

@保罗奥吉尔维,你是真的。在myLibFunction()的子函数中,我有一个'debug_print'-调用。这是一个CrossWorks lib函数,它通过jtag接口输出调试消息。我忽略了这一点。我的错和我为浪费你的时间道歉。该功能是“阻止”功能。但是,我真的会发现它很有趣,当CrossWorks遇到这样的代码时,如何识别这些函数,或者它如何终止执行。我会更新这个问题,鼓励人们深入研究。 – jwsc

回答

1

您可以通过查看hw寄存器来确定您是否处于中断之内。例如:

if(__get_IPSR() & IPSR_THREADED_MODE) { 
    /* I am not in interrupt context */ 
} else { 
    /* I am in interrupt context */ 
} 

功能__get_IPSR()可以使用core_cmFunc.h CMSIS为STM32时被发现。我猜想你调用的函数将检查它正在运行的上下文并对其执行操作(即终止或其他)。

+0

所以这个“拒绝阻塞函数”只有在函数本身正在检查错误的上下文时才起作用?如果我写一个函数做一些邪恶的等待,但不检查上下文,这不会被捕获? – jwsc

+0

这是正确的。但是你会遇到严重的问题。如果你实施了一个,看门狗可能会吠叫。 – staringlizard

+0

你说得对。只是在中断时用一个无限的while循环尝试了它。没有CrossWorks的抱怨。哦,现在我很失望;) – jwsc