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.

[参考译文] TMS320F2812:TI-RTOS 堆栈数量使用问题

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1324335/tms320f2812-ti-rtos-number-of-stack-usage-problem

器件型号:TMS320F2812

我确实会在调试期间使用 ROV Classic、或 在代码中使用 RTOS API 来测量固件中的堆栈使用量。

我有12个任务、几乎所有任务都 显示为 #of StackUsed =总堆栈大小-1。 例如、如果我分配了256个字节、则显示为255。 即使我将堆栈大小增加到512以查看将发生的变化、 ROV 也会显示511、即 StackUsed 的#。

这不像以前那样。

我的代码可能有什么问题?  

 到目前为止、我还没有遇到任何层叠溢出问题。

即使我将任务的堆栈大小从512更改为384 (我知道该函数以前使用的是那个堆栈大小)、它仍然可以工作、但仍然显示%99的用法。

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

    您正在使用哪些版本的 CCS 和 SYS/BIOS?

    您是否已在存储器浏览器中查看任何堆栈的实际用法? ROV 应该为您提供可用于查找它们的堆栈基地址、BIOS 会使用独特的模式来填充堆栈、以便轻松查看已使用的堆栈数量。

    如果你为有问题的任务调用 Task_stat(),它是否会返回任何意外的结果?

    惠特尼

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

    您好  
    感谢您发送消息
    我使用 CCS V12。

    它看起来以某种方式填充堆栈。  
    这真的很奇怪。 增加或减少堆栈大小不会产生影响。

    或者是否存在使用00BE00BE 填充栈存储器的函数以某种方式不起作用的可能性?



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

    这似乎很奇怪、但我通过将任务的堆栈大小降低到128而篡改了该任务的堆栈大小、该值会触发内核的堆栈溢出函数、因此发生了这种情况。 然后、我将堆栈大小恢复为256、即其值。 然后、此问题得到解决、值恢复正常。 我不知道有什么东西破坏了这种使用监控。
    因此、我们也不知道它是否会在运行时的任何时候出现相同的故障。

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

    这非常奇怪。 根据我的说法,BIOS 在任务创建时填充了堆栈,因此如果你是静态创建任务(在你的 cfg 文件中),它们应该是从 main ()开始处的0x00BE,如果你是动态创建它们,它们应该在 Task_create ()之后填充。 如果它再次发生、有趣的是确认它们至少是0x00BE、然后使用设置一些断点并尝试缩小覆盖它们的范围

    ROV 似乎正在使用0x00BE 标记来确定堆栈峰值。 奇怪的是、在您的屏幕截图中、所有堆栈的最后一个字仍为0x00BE。 如果一些溢出缓冲区覆盖了堆栈内存、我不知道最终字为什么会保持不变。

    惠特尼

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

    当断点位于 main 的开头或位于启动部分的"_c_int00"函数中时、我已经检查了存储器区域。

    记忆是"异常"在每一个情况下,就像我在上面分享的。

    为了让您知道_c_int00在哪里、 请参阅下方内容。

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

    c_int00的开始为时尚早、无法看到它。 我认为堆栈已经作为 Startup_firstFxns 调用的一部分进行了初始化(请参阅 这里的 BIOS 引导流程)。 下面显示了我的空闲任务堆栈在 main ()开始处的样子。 开始时使用了几个词、但它仍然主要是0x00BE。

    同样地、上述操作只适用于.cfg 文件任务。 如果你在调用 Task_create (),那是检查的地方。

    惠特尼