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.
您好!
我使用 CPU1TOCM MsgRam 中的 RETAIN 段分配了一些变量。
我曾发现 CPU1和 CM 中的分配可能不匹配。
它是 .cmd 文件中的段组。
和.map 文件中的构建结果(下图):
在 CPU1中、MIII_LnkRbuffFiles 和 MIII_ReceiveErrorFiles 之间存在一个孔洞
2.在 CM 中 、MII_LnkRbuffFiles 和 MII_ReceiveErrorFiles 之间没有空位
如何 避免此问题?
我认为这是预期的、因为这是两个不同的.out 从不同的编译中生成的。 如果要将#pragma 分配给同一地址、则需要使用完全相同的地址。
我将把这一点提交给我们的编译器团队、以提供他们对此的专家意见。
此致、
Vivek Singh
我想了解有关本集团各节的更多详情。 ofd 实用程序 ofd2000与编译器 cl2000位于同一目录中。 对于 Arm 编译器、armofd 也是如此。 请使用这些实用程序来运行类似于...的命令。
% ofd2000 --verbose --obj_display=none,sections -o cpu1_ofd.txt cpu1.out % armofd --verbose --obj_display=none,sections -o cm_ofd.txt cm.out
这些命令的输出位于文本文件 cpu1_ofd.txt 和 cm_ofd.txt 中。 请将这些文件附加到您的下一个帖子。
谢谢、此致、
乔治
尊敬的 乔治:
这些是 附加 文件
/cfs-file/__key/communityserver-discussions-components-files/171/1200.cpu1_5F00_ofd.txt
/cfs-file/__key/communityserver-discussions-components-files/171/2287.cm_5F00_ofd.txt
谢谢你
感谢您提供 OFD 输出文件。
我认为 MII_ReceiveErrorFiles 部分被阻止。 在本例中、这意味着它与64字边界对齐。 不过,我不能肯定。 事实证明、这无法通过查看 OFD 输出或链接器映射文件来验证。 我需要查看编译器输出的汇编代码。
假设您知道哪个源文件会创建 MII_ReceiveErrorFiles 段 。 对于该源文件、 请按照文章 如何提交编译器测试用例中的说明进行操作。
谢谢、此致、
乔治
尊敬的乔治:
CCS 版本: 9.3.0.00012
CPU1 Comiler:v20.2.4
CM 编译器:v18.12.6
以下是 CPU 和 CM ppfiles:
/cfs-file/__key/communityserver-discussions-components-files/171/CPU1_5F00_pp.txt
/cfs-file/__key/communityserver-discussions-components-files/171/CM_5F00_pp.txt
"我认为 MII_ReceiveErrorFiles 部分 被阻止。" 如何为 该段设置块或解除阻止?
此外、
最初没有这个问题、CPU1和 CM 在 MIVI_LnkRbuffFiles 和 MII_ReceiveErrorFiles 之间是连续的
我刚刚在前面的其他部分(CPU1RefVariableCMFiles)中添加了一些变量、并且出现了问题。
你有其他想法吗?
谢谢你。
正是因为如此、这才是本组中各段之间出现空洞的原因。 当变量(在本例中为结构)被阻止时、这意味着它必须完全适合页面、或从页面开始。 PAGE 是从64字边界开始的存储器64字长的块。 MII_ReceiveErrorFiles 段的长度为8个字。 在您的特定情况下、当链接器开始分配此段时、当前页面中保留的字不到8个。 创建了一个孔洞、该段从下一页开始。
[引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3832368 #3832368"]如何为 该段设置块或解除阻止?此解决方案假定您使用较新的 EABI 而不是较旧的 COFF ABI 进行构建。 在这种情况下、使用变量属性 noblocked。 在您的特定情况下,它看起来是...
__attribute__((noblocked)) MIIIReceiveError MIIIReceiveError1;
这会将属性应用于结构的定义。 noblocked 属性也必须应用于声明。 声明通常出现在头文件中。 在您发送的预处理文件中、我没有找到结构 MIIIReceiveError1的声明。
请告诉我此建议是否解决了问题。
谢谢、此致、
乔治
尊敬的乔治:
它起作用、在添加"__attribute__((noblocked))"后没有空穴。
但它非常不方便。
1.我们可以在工程属性设置或.cmd 文件中设置"noblocked"、而不是将 __attribute__添加到每个声明中吗?
2. CPU 和 CM 对 属性是否具有相同的设置?
3. 为什么 CPU 和 CM 具有不同的规则,它们都是 EABI?
此外、
如果我 没有添加 "__attribute__((noblocked)",只需更改 CPU1RefablVariesCM 内容。 它在 CPU1中没有缝合块、有什么不同? 请参阅下图和.pp 文件
/cfs-file/__key/communityserver-discussions-components-files/171/CPU1_5F00_pp_5F00_2.txt
谢谢你
有关这种情况的一些背景信息、 请在 C28x 编译器手册中搜索 标题 为数据页(DP)指针负载优化的子章节。
[引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3833644 #3833644"]我们能否在项目属性设置或.cmd 文件中设置"noblocked"、而不是将 __attribute__添加到每个声明中?遗憾的是、唯一的其他解决方案是在汇编代码中定义这些结构变量。
[引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3833644 #3833644"] CPU 和 CM 对 该属性是否具有相同的设置?不幸的是、不 它们是用于不同 CPU 内核的两种不同的编译器。 ARM 编译器(对于 CM)不具有页或 DP 寄存器的概念。
[引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3833644 #3833644"]如果我 没有添加 "__attribute__((noblocked)",只需更改 CPU1RefVariablesCM 内容。 它在 CPU1中没有缝合块、有什么不同?在这种情况下、使用了分块、但对 MII_ReceivedErrorFiles 段没有影响。 这是因为它从距离下一个数据页开头超过8个字的地址开始。 在您之前的构建中、先前的部分会更长。 这会将 MII_ReceivedErrorFiles 段推出到强制阻止以创建孔洞的位置。
谢谢、此致、
乔治
尊敬的乔治:
为什么我的最新帖子中的 Host_CPU1ServoRspFiles 部分不从0x39480开始?
0x39476的页仍为0x0A、但 Host_CPU1ServoRspFiles 的大小 为0xe0、为什么不被阻止?
因为它仅包含一个数组。 阵列不会被阻止、因此此段不会被阻止。
谢谢、此致、
乔治
你(们)好
结构数组呢?
我们尝试修改到下面的声明、它们不 会被阻止。
MIIIReceiveError MIIIReceiveError1[2];
或
MIIIReceiveError MIIIReceiveError1[1];
所有阵列都不会被阻止。 即使是这个……
[引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3862459 #3862459"]MIIIReceiveError MIIIReceiveError1[1];谢谢、此致、
乔治
尊敬的 乔治:
很抱歉再问一个问题。
如果我们在 CPU1中将结构设置为"noblocked"、时间成本如何影响访问结构变量时与"blocked"的区别?
谢谢你。
弗雷德里克
乔治将要出去几天。 我将看到我是否可以找到其他人对最后一个问题发表评论。
此致、
John
当数据被阻止时、编译器可以应用优化来消除 DP reg 的冗余负载。 对于未阻止的数据、必须保留每个 DP 加载指令。 未阻止的 DP 加载指令可能多于阻止的数据。
谢谢
Greg