我正在使用带有 FreeRTOS 内核的 STM32f767zi。我有两个任务:
1-每100ms由来自中断的任务通知触发,并通过TCP接收一些数据。
2-另一个任务是处理来自用户的一些请求。
现在,如果 task-2 使用 API 请求系统重置NVIC_SystemReset
,系统重置失败并且一切都挂起。当我运行调试器时,它似乎挂在vPortRaiseBASEPRI
. 在反汇编中,那是几行,之后vTaskNotifyFromISR
是我用于任务 1 的通知功能。
当我删除该任务通知并在中断中仅使用一个标志时,系统重置工作正常。但是,我认为这种方式会消耗处理器周期并且效率不高。
我试图禁用中断portDISABLE_INTERRUPT
、任务vTaskSuspendAll
或进入关键taskENTER_CRITICAL
但没有任何工作。
我通过portDISABLE_INTERRUPT
在一个独立的请求中请求(以便任何挂起的中断或“通知”可以完成),然后在另一个请求中发送系统重置来绕过方法。这个可行,但是,它不安全,因为用户可以(错误地)在禁用中断之前进行系统重置。
请注意,当我进行硬件重置(板上的按钮)时,它工作正常吗?!
那么,知道如何解决这个问题吗?如何在没有这个问题的情况下通过软件重置板?