0

我正在使用带有 FreeRTOS 内核的 STM32f767zi。我有两个任务:

1-每100ms由来自中断的任务通知触发,并通过TCP接收一些数据。

2-另一个任务是处理来自用户的一些请求。

现在,如果 task-2 使用 API 请求系统重置NVIC_SystemReset,系统重置失败并且一切都挂起。当我运行调试器时,它似乎挂在vPortRaiseBASEPRI. 在反汇编中,那是几行,之后vTaskNotifyFromISR是我用于任务 1 的通知功能。

当我删除该任务通知并在中断中仅使用一个标志时,系统重置工作正常。但是,我认为这种方式会消耗处理器周期并且效率不高。

我试图禁用中断portDISABLE_INTERRUPT、任务vTaskSuspendAll或进入关键taskENTER_CRITICAL但没有任何工作。

我通过portDISABLE_INTERRUPT在一个独立的请求中请求(以便任何挂起的中断或“通知”可以完成),然后在另一个请求中发送系统重置来绕过方法。这个可行,但是,它不安全,因为用户可以(错误地)在禁用中断之前进行系统重置。

请注意,当我进行硬件重置(板上的按钮)时,它工作正常吗?!

那么,知道如何解决这个问题吗?如何在没有这个问题的情况下通过软件重置板?

4

2 回答 2

1

它不是系统重置,因为系统重置始终有效。

从症状来看 - 您设置了错误的中断优先级。所有使用的都必须低于 sysPENDV 中断。否则上下文切换不会发生(因为此中断不会抢占当前中断),结果如您所见。 https://www.freertos.org/RTOS-Cortex-M3-M4.html

在此处输入图像描述

我试图禁用中断端口DISABLE_INTERRUPT、任务vTaskSuspendAll 或输入关键任务ENTER_CRITICAL 但没有任何效果。

如果您不了解 RTOS 的工作原理及其后果,请不要禁用中断。

于 2020-06-30T22:02:13.420 回答
0

通过在禁用任务 1 中断后简单地添加一些延迟来解决问题:

NVIC_DisableIRQ(IRQn);
vTaskDelay(xTicksToDelay);
NVIC_SystemReset();

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

于 2020-07-02T19:26:34.730 回答