3

我在我的项目中使用 FreeRTOS 已经有一段时间了,我不得不说我喜欢它。

艰难的我正面临一个正在杀死我的错误。

我的代码包含大量代码,大约 80 个文件并使用几个微芯片堆栈并运行大约 10 个任务。

问题是每天大约有 2-3 次,芯片会进入地址错误中断,我还没有真正找出问题的根源。

我相信这个错误发生在中断的那一刻,因为我已经能够减少崩溃的发生,因为我在一个 UART 中使用 DMA 传输,从而将中断减少了 80 倍。

我已经阅读了很多关于它的示例和论坛帖子,但它似乎总是有不同的方法来处理中断,无论是否使用 taskYield,特别是在 PIC24EP 上。

另一点是中断嵌套。它目前已启用,我尚未测试禁用。我已经看到了一些关于它的线程,但没有真正回答是否应该保持启用。

这是我目前处理 DMA 中断的方式。对于以前的代码兼容性机器人,我使用队列而不是信号量,它执行相同的工作。

void attribute((interrupt, auto_psv)) _DMA1Interrupt(void)
{
char val = 55;
IFS0bits.DMA1IF = 0; // Clear the DMA1 Interrupt Flag
xQueueSendFromISR( RS485_Queue, &val, NULL );
}

RTOS 库中的一些示例显示中断后没有任务产生。

  • 我应该将产量添加到每个中断中吗?

    无效属性((中断,auto_psv))_DMA1中断(无效){char val = 55;portBASE_TYPE xTaskWoken;IFS0bits.DMA1IF = 0;// 清除 DMA1 中断标志​​ xQueueSendFromISR(RS485_Queue, &val, &xTaskWoken); 如果(xTaskWoken)任务YIELD();}

我应该禁用嵌套中断吗?

我应该在我的任务中添加更多的堆栈空间吗?

我不是处理器堆栈和 RTOS 在堆栈级别的工作方式的专家。如果两个中断同时发生,那么当前正在运行的任务需要更大的堆栈大小吗?我的问题可能与同时有两个(或更多)中断以及嵌套中断使用的任务空间比实际定义的更多有关吗?

谢谢!

编辑:问题解决了,实际上我并不是唯一一个遇到这个问题的人,因为不幸的是它似乎没有出现在文档或代码示例中,而只是出现在需要挖掘的一些 freertos 网页中. 使用 FreeRTOS 内核的中断的优先级不应高于默认值为 1 的 configKERNEL_INTERRUPT_PRIORITY,而微芯片上的中断的默认值为 3。这意味着使用默认优先级的中断会导致零星的陷阱错误。

4

0 回答 0