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.
工具/软件:Code Composer Studio
尊敬的所有专家:
我正在学习 CCS 链接器通信文件编辑。
我已经从互联网上读取了一些指令、并且可以理解大多数命令。
我刚刚获得了一个命令文件示例、无法理解其中的一些语法?
您想知道 它的含义吗?
命令如下所示、感谢您的帮助
.stack {} > IRAM、fill=00c0ffeh、align (0x10) >> fill=00c0ffeh 和 align (0x10)是什么意思
以下哪一项意味着什么?
.IRAM_Heap:fill=00c0ffeeh{
_IRAMHEAP_BASE =.;
。 += 0x2000;
_IRAMHEAP_END =.;
}> SIRAM、ALIGN (0x10)
非常感谢!
有关链接器命令文件的介绍、请参阅文章 链接器命令文件入门。
关于...
[引用 user="Jason Liu4"]。stack {} > IRAM、fill=00c0ffeeh、align (0x10)
这会形成一个名为.stack 的输出段。 它由所有也称为.stack 的输入段组成。 在本例中、(几乎肯定的)只有一个名为.stack 的输入段。 它被分配给名为 IRAM 的存储器范围。 由于 ALIGN (0x10)、在 IRAM 中选择的地址是0x10的偶数倍。 通常、此段未初始化。 但是由于 fill=00c0ffeh、它是一个初始化段、其中每个32位宽的存储器位置都包含值0x00c0ffee。 通常、这样做是为了查看应用程序在运行时使用的堆栈大小。
关于...
[引用 USER="Jason Liu4"]。IRAM_Heap:fill=00c0ffeeh{
_IRAMHEAP_BASE =.;
。 += 0x2000;
_IRAMHEAP_END =.;
}> SIRAM、align (0x10)[/quot]
总体效果是创建一个名为 IRAM_Heap 的已初始化输出段、该输出段用0x00c0ffee 填充。 详细信息...
这会形成一个名为 IRAM_Heap 的输出段。 它由所有也称为 IRAM_Heap 的输入段组成。 但是、没有具有该名称的输入段。 。 += 0x2000表示在输出段中创建从该点开始的多个字节的空洞。 在本例中、该点是该段的开头。 它被分配给 SIRAM 存储器范围。 align (0x10)和 fill=00c0ffeh 的工作方式与.stack 相同。 两条赋值语句将输出段中该位置的地址分配给这些符号。 在这种情况下、这些符号捕获段的起始地址和结束地址。
谢谢、此致、
乔治
尊敬的乔治
非常感谢您的帮助!
阅读完您的答复后、我了解了有关链接器命令文件的更多概念。
打扰一下、我是否可以要求更多详细信息? 预期在 ALIGN (0x10)和 Fill 上
关于 ALIGN (0x10):
在什么情况下我们应该使用 align (...)、它是否用于特定用途?
如果原始链接器命令文件包含 align (0x10)、我是否可以将其删除? 如果我删除它而不考虑详细信息、会发生什么情况?
关于 fill=00c0ffeh、您说过它是一个初始化段、其中每个32位宽内存位置都包含值0x00c0ffee。
我想我没有抓住它、请您多解释一下? 您是不是说每个0xffffffff 字节的内存长度都包含值0x00c0ffee?
您说:“通常,这样做是为了查看应用程序在运行时使用的堆栈。”,我知道吗?
我是否可以使用 fill =…… 检查 Wheter 堆栈溢出是否发生? 同样、如果我删除它而不考虑详细信息、会发生什么情况?
非常感谢您的友好帮助!
[引用 user="Jason Liu4"]在哪种情况下,我们应该使用 align (...),这是出于某些目的吗?
对齐通常与 CPU 的某些要求相关。 从存储器读取的某些指令可能要求地址与特定边界对齐。 或者、可能需要将函数的开头与某个边界对齐。 或其他类似的东西。
[引用 user="Jason Liu4"]如果原始链接器命令文件包含 align (0x10)、我是否可以将其删除?
您需要了解为什么需要对齐、以及这种情况是否仍然适用于您的系统。
[引用用户="Jason Liu4"]如果删除它而不考虑详细信息,会发生什么情况?
系统在运行时可能会失败。 此类问题通常很难诊断。
[引用 USER="Jason Liu4"]您是不是说每个0xffffffff 字节内存长度都包含值0x00c0ffee?
是的
[引用 user="Jason Liu4"]您说:"通常,这样做是为了了解应用程序在运行时使用的堆栈大小。",我知道吗?
在调试器控制下运行代码时、打开堆栈内存中的视图。 请参阅显示0x00c0ffee 的停止位置。
注意填充堆栈只是一种调试技术。 不要在最终的生产构建中执行它。
谢谢、此致、
乔治
尊敬的乔治
非常感谢。
你的答复解决了我的问题。 我现在明白了。
感谢您的大力帮助! 谢谢!
此致、
Jason