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.

[参考译文] TMS320F2.8069万M:打印问题和堆栈溢出

Guru**** 2587345 points
Other Parts Discussed in Thread: MOTORWARE, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/657115/tms320f28069m-printf-issues-and-stack-overflow

线程中讨论的其他部件:TMS320F2.8069万MMOTORWAREcontrolSUITE

部件号:TMS320F2.8069万M

您好,

有时,当我使用过多的printf指令时,尝试运行我的代码(从RAM)会导致ISR或调试器在不属于任何源文件的内存位置中停止(甚至在到达起始符号之前)。 我认为这可能是由于超出堆栈范围造成的-事实上,增加堆栈大小通常会有所帮助。 但是,检测堆栈溢出的方法在此处不会发现任何错误!

1) 首先,当出现问题时,我在内存浏览器中找到stack_end大小,但仍有大量可用空间(链接程序文件中填充了0xDEAD)。 通常整个.stack部分似乎未被触及。

这是否意味着我可以确定堆栈没有损坏?

2) 接下来,我决定实施联机堆栈溢出检测(spra820)文档中描述的方法。 我实施了模范源代码,以便不返回任何错误,然后添加了尽可能简单的中断例程:

extern interrupt void Stackmonitor_ovfISR(void){

ASM(" ESTOP0");
} 

...我在 HAL_initIntVectorTable()函数中链接到PIE:

PIE->RTOSINT =&Stackmonitor_ovfISR; 

有趣的是,在实现此功能后,问题发生了变化:调试器在启动符号处正确停止,并且执行容易受到攻击的代码。 但是,它会在代码的其他部分停止(在正常执行几秒钟后),并显示“No source available for "0x3ff4fa"”(没有可用的源代码)。  我评论说我的更改试图再次唤起最初的情况,但这一次代码运行正常-直到代码开始反复重新启动。

这种行为可能是什么原因造成的? 增加堆大小不会更改任何内容,但增加堆栈可以使程序正常运行。

3) 为确保中断正确触发,我重新设置了堆栈大小,尝试强制执行其溢出。 但是,使用低于默认值0x1000的任何值都会导致以下问题:调试器甚至不能正常启动,“暂停”按钮变灰,大多数视图保持空白(寄存器,内存浏览器等)。

如何测试此功能以确保中断将触发以保存堆栈?

4) 我还有一个奖励问题。 在内存浏览器中,我可以看到两个现有符号:"_stack"和"_stack_end"。 但我无法在项目中的任何位置找到它们(绝对不在链接程序文件中)! 它们仅存在于地图文件中的"全局数据符号"(双下划线)下。

它们的定义在哪里?

5) 一些附加信息:

-我正在根据其中一个motorWare实验室示例开发代码,目前仅为RAM版本。

-我正在使用的栈大小为0x1000,堆大小为0x400。 尝试通过更改我的代码(使用更少的printf)来解决问题 ,而不是在每次出现堆栈时盲目增加堆栈。

-我使用的命令链接器文件附加在此处(我已 定义stack_end_X以将其与现有 stack_end区分开来): https://ufile.io/kl6g5 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1)听起来可能不是堆栈损坏/溢出,但我不会完全排除它。

    2)我认为0x3ff4fa在引导ROM中的某个位置。 您可以尝试加载ROM符号以查看具体位置。 lib及源代码位于controlSUITE中的libs\utilities\boot_rom\2806x下。 它可以给你一个提示,说明为什么它最终出现在那里。

    3)我目前无法确认,因为我没有硬件,但我相信要在“内存浏览器”,“寄存器”窗口等中看到任何内容,您需要在“调试”窗口中选择一个内核。 您的屏幕截图仅显示所选的设备会话。 确认您在选择C28x时可以看到它们。

    4)符号__stack在RTS库模块boot28.obj中定义。 源代码可在类似的位置找到

    C:\ti\ccsv7\tools\compiler\ti-CGT-C2000_C2000<xmt-block0>2000 16.9 .2.LTS\lib\src

    关键行包括:

    *****************
    *声明堆栈。 大小由链接程序选项-stack确定。 *
    *默认值为1K字。 *
    *****************
    堆栈: .usect ".stack",0

    当您使用常用选项链接C/C++代码--ram_model或--rom_model时,链接程序会自动定义符号__stack_end。 在C28x装配体工具手册中搜索__stack_end。

    5)您是否可以使用论坛的附件功能共享.cmd文件? 如果它抱怨文件格式,您可以将其重命名为.txt。 我只是在使用ufile.io链接和我们的防火墙时遇到了问题。 如果您不介意共享.map文件,查看它也可能很有帮助。

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

    感谢您的快速回答,

    1)为什么 stack_size会有如此大的影响? 增加IT (最好增加两次)可以解决问题,减少IT会使IT每次都失败。  0x1000的值似乎位于边缘。 我还注意到一件事:当程序运行时,使用了部分堆栈,部分是 0xDEAD。 但是当我编译错误的版本时,堆栈在崩溃发生之前都是空的(0xDEAD)!

    2)我现在不能想起这种行为-今天,程序在同样的情况下继续重新启动(可以通过初始 打印看到它)。 下次我遇到这种奇怪的停止时,会更新此帖子。 但我想这也是由于计划外重启,我如何找到原因? 不幸的是,所有这些影响都是随机的,其他时候它会在pie_illegalIsr()...停止。  

    3)您说的没错,就是调试器会在正常操作期间自动选择内核。 在我手动选择C28xx后,我可以看到窗口, 并且在第一个地址设置了Disassembly content:

    0万:0040E284磅 $XXXsw/drivers/CU/src/32b/F28x/f2806x/CodeStartBranch.ASM:95:106 

    下面是我在随机暂停程序后看到的内容:

    dafs

    另一次尝试让我:

    还有一个...我想我将在此结束:

    5)这是问题所在,下面是  扩展名为*。txt的文件:

    链接程序命令文件: /CFS文件/__key/communityserver-discussions-components文件/171/8666.F28069F_5F00_ram_5F00_lnk.txt</s>2.8069万

    MAP文件(1)-导致此自动重新启动问题的编译: /fs-file/__key/communityserver-discussions-components文件/171/1-Program-restarts_5F00_map.txt

    MAP文件(2)-程序甚至无法启动时使用的编译: /CFS-file/__key/communityserver-discussions-components文件/171/2-Program-doesnt-start_5F00_map.txt

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

    地图文件显示的堆栈位于0x1万之上,但堆栈指针仅为16位指针。 调整链接器文件,将堆栈放置在其中一个RAM段中,其地址在其范围内。 希望这能照顾到你所看到的怪异行为。

    Whitney

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

    谢谢,确实是问题所在!

    我将 .stack部分分配给 RAML0-L8内存范围,这是正常的,直到我的程序变得足够大,可以将堆栈推入0x1万地址之上。 我现在做的是:我将RAML0-L8内存范围更改为 RAML1-L8,并专门为 堆栈分离RAML0 (大小设置为0x800,应该有足够的空间)。 您认为这是一个好的解决方案,还是 RAML0中有什么特别之处,我不应该更改其中分配的内容?

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

    很高兴他们把它照顾得很好! 使用RAML0没问题。

    Whitney