NVIC 系统重置失败

NVIC System Reset fails

我正在使用带有 FreeRTOS 内核的 STM32f767zi。我有两个任务:

1- 一个是每100ms一个中断的任务通知触发的,通过TCP接收一些数据。

2- 其他任务正在处理来自用户的一些请求。

现在,如果 task-2 使用 NVIC_SystemReset API 请求系统重置,系统重置失败并且所有东西都挂起。当我 运行 调试器时,它似乎挂在 vPortRaiseBASEPRI 中。在反汇编中,vTaskNotifyFromISR 之后的几行是我用于任务 1 的通知函数。

当我删除该任务通知并在中断中仅使用一个标志时,系统重置工作正常。但是,我认为这种方式会消耗处理器周期并且效率不高。

我尝试禁用中断 portDISABLE_INTERRUPT、任务 vTaskSuspendAll 或进入关键 taskENTER_CRITICAL,但没有任何效果。

我通过在独立请求中请求 portDISABLE_INTERRUPT(以便任何挂起的中断或“通知”可以完成)来绕过方法,然后在另一个请求中发送系统重置。这个可行,但是,它不安全,因为用户可以(错误地)在禁用中断之前重置系统。

请注意,当我进行硬件重置(板上的按钮)时它工作正常吗?!

那么,知道如何解决这个问题吗?如何通过软件重置电路板而不出现该问题?

这不是系统重置,因为系统重置有效总是

从症状来看 - 您设置了错误的中断优先级。所有使用的都必须降低 sysPENDV 中断。否则上下文切换不会发生(因为此中断不会抢占当前中断)并且结果如您所见。 https://www.freertos.org/RTOS-Cortex-M3-M4.html

I tried to disable interrupts portDISABLE_INTERRUPT, tasks vTaskSuspendAll or enter critical taskENTER_CRITICAL but nothing work.

如果您不了解 RTOS 的工作原理及其后果,请不要禁用中断。

通过在禁用任务 1 中断后简单地添加一些延迟解决的问题:

NVIC_DisableIRQ(IRQn);
vTaskDelay(xTicksToDelay);
NVIC_SystemReset();

我仍然不知道这是否解决了根本原因。