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.

[参考译文] TMS320F28386D:CPU1TOCM MsgRam 分配未对齐

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align

器件型号:TMS320F28386D

您好!

我使用 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 也是如此。  请使用这些实用程序来运行类似于...的命令。

    Fullscreen
    1
    2
    % ofd2000 --verbose --obj_display=none,sections -o cpu1_ofd.txt cpu1.out
    % armofd --verbose --obj_display=none,sections -o cm_ofd.txt cm.out
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这些命令的输出位于文本文件 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)中添加了一些变量、并且出现了问题。

    你有其他想法吗?

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3832368 #3832368"]"我认为  MII_ReceiveErrorFiles 部分 被阻止。"

    正是因为如此、这才是本组中各段之间出现空洞的原因。  当变量(在本例中为结构)被阻止时、这意味着它必须完全适合页面、或从页面开始。  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。  在您的特定情况下,它看起来是...

    Fullscreen
    1
    2
    __attribute__((noblocked))
    MIIIReceiveError MIIIReceiveError1;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    这会将属性应用于结构的定义。  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、为什么不被阻止?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="464815" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1035287/tms320f28386d-cpu1tocm-msgram-allocation-not-align/3839421 #3839421"] Host_CPU1ServoRspFiles 的大小 为0xe0,为什么不阻止它?[/quot]

    因为它仅包含一个数组。  阵列不会被阻止、因此此段不会被阻止。

    谢谢、此致、

    乔治

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

    你(们)好  

     结构数组呢?

    我们尝试修改到下面的声明、它们不 会被阻止

    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