主题中讨论的其他器件:SysConfig
工具与软件:
您好!
我对 这个 MCU 的 RAM 使用有疑问。
在.map 中、堆栈从0x20207E00开始、在0x20208000结束。
但是、我观察到0x20207E00下面的 RAM 空间中充满了一些内容。 这些内容是什么? 堆栈是否实际上扩展到这些地址?
谢谢!
起重机
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.
工具与软件:
您好!
我对 这个 MCU 的 RAM 使用有疑问。
在.map 中、堆栈从0x20207E00开始、在0x20208000结束。
但是、我观察到0x20207E00下面的 RAM 空间中充满了一些内容。 这些内容是什么? 堆栈是否实际上扩展到这些地址?
谢谢!
起重机
没有内置堆栈监控、因此不会收到明确的堆栈溢出通知。
您可能需要检查 Debug/ 查看是否在栈底部附近分配了任何变量的.map 文件。
也就是说、我在这里看到一些让我怀疑堆栈溢出的情况:
1) 1)指向该区域的多个地址字(已保存的 SP ->堆栈后链?)。 其中一些函数(例如0x20207C50->0x20207E8C)沿着原来的边界正确指向堆栈。
2) 220字节的字符串("27134"看起来很熟悉吗?),它本身就是堆栈大小的一半。 您的代码是否会在堆栈中放置任何字符串? 此库中的 printf()使用了相当多的堆栈(我记得超过256个字节--我不能在 C1系列设备上使用它)。
3)我模糊记得有些系统(IAR? FreeRTOS?) 将0x55用作其堆栈监视器中的 Sentinel
当然这可能是一种错觉、但可能值得快速审核和/或逐步完成。
Bruce、您好!
感谢您的答复。
我在.map 文件中没有看到靠近堆栈底部的任何内容。
1)。 我理解。 要从何处保存 SP 的代码? 他们是通过我的代码保存吗? 我在代码中没有特意这样做。
2)。 你在哪里看到"27134"?
我确实使用了许多 printf()。 移除它们后、堆栈的使用要小得多、如下所示:
但仍然溢出。 什么是"0x20202020"?
3.) 0x55是我特意写入这些地址以检查栈溢出的内容。
此外、我没有在 .map 文件中找到堆栈起始地址(0x207E00)的定义位置。 是否有可能更改它? 我在编译器选项或链接器选项中找不到它的设置位置。
谢谢!
起重机
如果你是把0x55放在那里的人、你已经在我前面了。 除非您缺少 RAM、否则答案可能是只从堆 栈顶部(0x20208000)中减去0x55s (0x20207C00)的末尾、然后得出0x400是堆栈所需的结果。 (为了以防万一、您可能需要添加更多的字节。)
如果不使用 SysConfig、可在"Build Settings->Build->Linker->Basic->Set System Stack Size"中设置堆栈大小。 这会导致"--stack_size= "。
如果您使用的是 SysConfig、我尚未了解如何设置它。 生成的链接器.cmd 文件包含"--stack_size= "(因此忽略了命令行选项)、但我 看不到它来自.syscfg 文件或 SysConfig 应用程序中的位置。 [也许有人知道?]
[编辑:显然你不能。 总结以下结果:关闭 SysConfig 中的 linker-file-generation、然后自行更改--stack_size。
[编辑:抱歉、我漏掉了您的另一个问题。 我从这个220字节的字符串得到"27134"。 0x20202020为四个空白("" )。 看起来 printf 出于任何原因、都会用空白预填充其缓冲区。 (我不知道。)]
我按照链接中的说明进行了操作、但堆栈大小仍然没有更改。 我提出了一个相关问题:
关于"27134"、您是说您从0x20202020年看到它? 但是,在我完全删除 printf()之后,仍然有很多这样的例子,尽管堆栈的使用要小得多。
谢谢!
起重机