CTL_UNSUPPORTED_CALL_FROM_ISR与CrossWorks库

时间:2016-12-12 13:26:07

标签: c stm32 isr

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

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

更新

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

我知道这是一个繁重的编辑,但目前还没有答案,它适用于有关文档和"如何"的一般问题。背后。

1 个答案:

答案 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()。我猜你所调用的函数将检查它运行的上下文并对其进行操作(即终止或其他)。