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();
我仍然不知道这是否解决了根本原因。
我正在使用带有 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();
我仍然不知道这是否解决了根本原因。