NVIC 系统重置失败
Posted
技术标签:
【中文标题】NVIC 系统重置失败【英文标题】:NVIC System Reset fails 【发布时间】: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
(以便任何挂起的中断或“通知”可以完成),然后在另一个请求中发送系统重置来绕过方法。这个可行,但是,它不安全,因为用户可以(错误地)在禁用中断之前进行系统重置。
请注意,当我进行硬件重置(板上的按钮)时它工作正常?!
那么,知道如何解决这个问题吗?如何通过软件重置板没有这个问题?
【问题讨论】:
【参考方案1】:它不是系统重置,因为系统重置总是起作用。
从症状来看 - 您设置了错误的中断优先级。所有使用的都必须低于 sysPENDV 中断。否则上下文切换不会发生(因为此中断不会抢占当前中断),结果如您所见。 https://www.freertos.org/RTOS-Cortex-M3-M4.html
我试图禁用中断端口DISABLE_INTERRUPT,任务 vTaskSuspendAll 或输入关键任务ENTER_CRITICAL 但没有任何效果。
如果您不了解 RTOS 的工作原理及其后果,请不要禁用中断。
【讨论】:
PendSV 由 FreeRTOS 设置为最低中断优先级。您不希望在 ISR 中发生上下文切换。 @P__J__ ISR 只会在您需要时(通过使用...fromISR
)函数被上下文切换抢占。如果您的优先级相反,您不得使用...fromISR
函数
我把 PendSV 设置为 0 优先级(最高),不起作用。 @P__J__
这样不行。阅读免费RTOS 文档。盲目地改变优先级是行不通的。
您在回答中“盲目地”说。【参考方案2】:
在禁用 task-1 中断后简单地添加一些延迟即可解决问题:
NVIC_DisableIRQ(IRQn);
vTaskDelay(xTicksToDelay);
NVIC_SystemReset();
我仍然不知道这是否解决了根本原因。
【讨论】:
以上是关于NVIC 系统重置失败的主要内容,如果未能解决你的问题,请参考以下文章
EBS并发管理器启动失败,系统暂挂,在重置计数器之前修复管理程序