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
如果您已经看过这些时刻,再次抱歉。
我是 运行 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
如果您已经看过这些时刻,再次抱歉。