This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS570LC4357:FreeRTOS +自定义代码=堆栈溢出、即使堆栈是内联的也是如此。 什么可以告诉我溢出的起源以及我是否在增加正确的堆栈?

Guru**** 2481675 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/696056/ccs-tms570lc4357-freertos-custom-code-stack-overflow-even-though-the-stack-is-inmense-what-can-tell-me-the-origin-of-the-overflow-and-am-i-increasing-the-correct-stack

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

工具/软件:Code Composer Studio

您好!

MI 名为 Julian、我已经与 TMS570LC4357合作了很长时间。 简而言之、我有一个设置、在该设置中、我将使用一个具有 FreeRTOS 的 TMS570LC4357和一个自定义代码来处理串行端口作为输入提供的任何内容、然后通过 EMAC 将其输出发送到另一个电路板。 我将通过带有终端的串行端口向第一个板馈送数据。

总之、我在没有任何处理输入的自定义代码的情况下尝试了此设置。 我已连接两个板(杂费、两个相同型号)、它们与通过 EMAC 发送的定期生成的帧通信良好。 现在、当我介绍处理代码后、我可以执行几次(完全随机)执行、而不会出现任何问题。 但是、在执行一定数量的执行后、由于堆栈溢出发生、电路板停止运行。 我使用 FreeRTOS 中的堆栈溢出挂钩任务来管理溢出。

现在、直到这里、它看起来相当正常。 我在一个正常工作的系统中引入了一个新函数、现在它出现了溢出问题、那么该函数出错了。 但代码在 RAM 中应有足够的空间、以避免导致堆栈溢出。 即使这样、我也已将用户堆栈长度增加到0x1A000 (106496)、这已经是我的 RAM 的五分之一(这已经非常重要!)。 即使这样、也会发生相同的错误。

这将使我进入我的问题:如何确定溢出的原因? 似乎很明显、故障是我的处理功能、但是... 我如何跟踪它? 简单地说、堆栈溢出发生、我被发送到数据输入中断(基本上是一个错误!) 然后我将通过 LR 进行查找。 LR 会将我发送到"portSAVE_CONTEXT "(将当前任务的上下文保存在操作系统中)、这对我来说并不意味着太多(为什么保存任务时会出现溢出 ocurr?)。

最后:有几种不同类型的堆栈、如 Halcogen (总堆栈、用户堆栈、监控器堆栈、FIQ 堆栈、IRQ 堆栈、 中止堆栈、未定义的堆栈)。 我是否增加了错误堆栈的大小?  

我非常抱歉,这个制度含糊不清,因为它有很多不同的内容。 但我认为、将其缩小到有效的操作系统+自定义代码、可以解决这个问题。 但是、我不确定堆栈的类型以及导致溢出的原因(当然、在我的职能范围内)、这显然已经将我带到了这里。

此致、感谢您阅读、

Julian

编辑:措辞。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Julian、

    很抱歉,我对这个问题不是很熟悉。 我将向我们的软件工程师介绍。 BTW、此链接可能会有所帮助:
    www.freertos.org/a00111.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以从我们开发工具的 e2e 支持论坛中考虑此帖子中提到的工具:
    e2e.ti.com/.../417534
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、社区

    我找到了问题。 在对内存和堆栈大小进行了一些调整之后、我们得出结论、增加用户堆栈大小是不正确的。 问题是函数栈大小非常低!

    为了纠正这些问题、我们将用户堆栈大小减小到了"正常"值、增加了 FreeRTOS 堆、然后增加了函数堆栈大小。 由于我们的软件需要大量数据、因此我们将堆和堆栈大小增加了4倍以适应该函数。

    这基本上就是 LR 寄存器将我链接回看似任意的 OS 操作点的原因、因为我们的任务将在测试台的同一个点(始终)失败 但同时、OS 不会与 testBench 的任何其他执行处于同一个点。 基本上、在任务导致的堆栈溢出期间、操作系统可能在每个测试台执行了其他操作。

    再次感谢阅读此内容的人! 这比预期的简单得多。

    此致、
    Julian
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Julian:

    我在同一电路板上遇到过载类似的问题。 我有一个关于您如何实施解决方案的新问题。 一个 set 函数栈大小在哪里? 我提出这一问题是因为我没有找到对该确切名称的引用。

    谢谢!
    Alex
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alex:

    函数栈大小在任务创建期间指定。 FreeRTOS 示例通常创建堆栈大小等于最小值的任务。 就我所记得的、我的 Halcogen 项目具有128个字的最小堆栈大小。 这是128 * 4字节= 512字节。 您可以设置任何其他最小值、但我建议您使用所需的值创建一个任务。  

    从 FreeRTOS 示例:

    xReturned = xTaskCreate (

    vTaskCode、//实现任务的函数。 *

    "名称"、/*任务的文本名称。 *

    STACK_SIZE、/*以字表示的栈大小、而不是以字节为单位。 *

    (void *) 1,/*参数传递到任务中。 *

    tskIDLE_PRIORITY、/*创建任务时的优先级。 *

    &xHandle);/*用于传递已创建任务的句柄。 *

    谢谢、

    Julian

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Julian。