2017-06-21 253 views
-1

我正在读取dsPIC30F6014A上ADC通道的一些数据。 为此,我为每个ADC实现了一项单独的任务(比如说7个通道-7个任务)。
我已经在开始时创建了所有任务,我的堆大小为5120,我使用heap_4.c,并且我为每个任务分配了堆栈configMINIMAL_Stack(即115)。
这些任务正在连续和定期运行(只是vTaskSuspend()vTaskResume()是我在做什么)
在开始时,所有任务工作正常,但经过一段时间vApplicationStackOverflowHook()发生,即堆栈溢出。freertos中的堆栈溢出

是否有任何错误处理内存的可能性?

+1

显示您的代码。 https://stackoverflow.com/help/how-to-ask – Tschallacka

回答

3

根据ADC输入创建任务似乎很浪费。除阅读ADC之外还有什么其他任务呢?

我猜你的任务非常接近它的堆栈边缘,并且在某个时刻,恰好当你处于最大堆栈深度并导致溢出时,恰好会发生中断。您可以定期致电uxTaskGetStackHighWaterMark()以确定您到达堆栈的末端有多接近。

+0

该应用程序是一种安全应用程序。而对于PIC中的ADC采样,我正在轮询DONE位,所以控制器在轮询时存在轻微的可能性。这就是为什么我实施了不同的任务。如果我在需要时创建并删除任务,该怎么办呢?它是否释放了任务占用的内存,以便我可以将该内存分配给另一个任务????谢谢 –

+0

在“安全应用程序”中动态分配内存不推荐!正如理查德所说,它可能是一个中断发生并将堆栈超过极限,或者存在一个通过任务代码的路径,它比平常使用更多的堆栈。无论如何,简单的解决方案是增加堆栈大小(每个ADC任务的大小)。最小堆栈大小可能不足以满足您的要求。这就是说,如果你可以在一个任务中完成这一切,那么你可以有一个更大的堆栈,并仍然使用更少的内存(和更好的性能) –

+0

谢谢,前段时间我通过打印pcTaskName来检查哪个任务进入hook液晶显示器,它显示“IDL”,所以现在我有点困惑,如何理想的任务使用多少堆栈(纠正我,如果我错了)?除此之外,我的堆是5120,所以我可以创建多少个任务,以及最小堆栈大小?每次当我暂停任务并恢复另一个任务时,每次都会占用新的内存?????谢谢。 –