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