FreeRTOS 无法将 isr 例程设置为临界区

FreeRTOS can't set isr routine as critical region

我是 运行 nrf52840 上的 FreeRTOS
我有 2 个中断 运行,如果我在另一个中断中进入一个中断,我的 RTOS 就会崩溃
为了避免这种情况,我添加了临界区函数,我还添加了调试引脚以查看在中断中花费的时间两个 irq

void my_irq (void)
{
    BaseType_t xHigherPriorityTaskWoken;
    UBaseType_t uxSavedInterruptStatus;
    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
    d_set_pin();
    xHigherPriorityTaskWoken = pdFALSE;
    
    /* some code */
    
    vTaskNotifyGiveFromISR(acq->task.handler, &xHigherPriorityTaskWoken);
    
    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
    
    d_clear_pin();
    taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus);
}

它不起作用,所以我尝试禁用中断:

void my_irq (void)
{
    BaseType_t xHigherPriorityTaskWoken;
    taskDISABLE_INTERRUPTS();
    d_set_pin();
    xHigherPriorityTaskWoken = pdFALSE;
    
    /* some code */
    
    vTaskNotifyGiveFromISR(acq->task.handler, &xHigherPriorityTaskWoken);

    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
    
    d_clear_pin();
    taskENABLE_INTERRUPTS();
}

但我还是明白了,但它崩溃了:

你知道我的 MCU 离开中断例程的原因吗?

您的 MCU 是围绕 ARM Cortex-M4F 内核构建的。对不起,你的问题中没有提到这个,你是否正确设置了中断优先级,根据这个:https://www.freertos.org/RTOS-Cortex-M3-M4.html ?

我还发现您无法从 ISR 的关键部分调用 FreeRTOS API 函数。看到这个:https://www.freertos.org/taskENTER_CRITICAL_FROM_ISR_taskEXIT_CRITICAL_FROM_ISR.html

如果您已经看过这些时刻,再次抱歉。