【问题标题】:NVIC System Reset failsNVIC 系统重置失败
【发布时间】: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


    【解决方案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();
    

    我仍然不知道这是否解决了根本原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多