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并发管理器启动失败,系统暂挂,在重置计数器之前修复管理程序

如何重置 STM32 HAL UART 驱动程序 (HAL) 状态?

电脑上出现软件正在初始化,请稍等?

接收失败:连接已重置 git

Laravel 迁移重置失败

非接触式“重置”失败