【问题标题】:stack overflow in freertosfreertos中的堆栈溢出
【发布时间】:2017-06-21 11:51:21
【问题描述】:

我正在读取 dsPIC30F6014A 上 ADC 通道的一些数据。 为此,我为每个 ADC 实现了一个单独的任务(比如 7 个通道 - 7 个任务)。
我只在开始时创建了所有任务,我的堆大小是 5120,我使用的是 heap_4.c,我为每个任务分配的堆栈是 configMINIMAL_Stack(即 115)。
这些任务连续且周期性地运行(只是vTaskSuspend()vTaskResume() 是我正在做的)
开始时所有任务都运行良好,但一段时间后出现vApplicationStackOverflowHook(),即堆栈溢出。

有没有可能错误处理内存?

【问题讨论】:

标签: c stack embedded freertos


【解决方案1】:

为每个 ADC 输入创建一个任务似乎很浪费。除了读取 ADC 之外,还有什么任务?

我猜你的任务非常接近它的堆栈边缘,并且在某些时候你碰巧在你处于最大堆栈深度时得到一个中断,这会导致溢出。您可以定期调用uxTaskGetStackHighWaterMark() 以确定您已到达堆栈末尾的距离。

【讨论】:

  • 该应用程序是一种安全应用程序。至于 PIC 中的 ADC 采样,我正在轮询 DONE 位,因此控制器卡在轮询中的可能性很小。这就是为什么我实施了不同的任务。如果我只是在需要时创建和删除任务怎么办?它会释放任务占用的内存,以便我可以将该内存分配给另一个任务????谢谢
  • 不推荐在“安全应用程序”中动态分配内存!正如理查德所说,这可能是一个中断发生并将堆栈推到了极限,或者有一条通过任务代码的路径使用了比平时更多的堆栈。在任何情况下,简单的解决方案是增加(每个 ADC 任务的)堆栈大小。最小堆栈大小可能不足以满足您的要求。也就是说,如果您可以在一项任务中完成所有这些操作,那么您可以拥有更大的堆栈并且仍然使用更少的内存(以及更好的性能)
  • 谢谢,我前段时间通过在 lcd 上打印 pcTaskName 检查了哪个任务正在进入 hook() 并且它显示“IDL”,所以现在我有点困惑,理想的任务如何使用这么多的堆栈(如果错了请纠正我)???除此之外,我的堆是 5120,所以我可以用多少最小堆栈大小创建多少任务????每次我暂停一项任务并恢复另一项任务时,每次都会占用新的内存吗??????谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-05-02
  • 2020-05-17
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2016-06-12
  • 2014-12-28
相关资源
最近更新 更多