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.

[参考译文] TMS320F28375S:链接器文件运行不正常

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly

器件型号:TMS320F28375S

您好!

我正在使用 TMS320F28375S 卡。 它是具有此微控制器的定制构建板。 我使用的是 CCS 10.1.0.00010。  

问题:链接器文件中的一个微不足道(我认为)的更改会改变软件的行为。 我正在使用我的软件进行电机控制。 在以下设置中、一切都正常。

.cinit:> FLASHB PAGE = 0,ALIGN (4)
.pinit:> FLASHB,PAGE = 0,ALIGN (4)
.text:>> FLASHB | FLASHC | FLASHD | FLASHE   PAGE = 0,ALIG(4)

但是、如果我按如下方式进行更改(从.text 中删除了 FLASHB)、则电机相电流不平衡且值很高(大约为40安培)。 我反复这么做、这非常一致。 因此、我确信它在做一些我不理解的事情。

.cinit:> FLASHB PAGE = 0,ALIGN (4)
.pinit:> FLASHB,PAGE = 0,ALIGN (4)
.text:>> FLASHC | FLASHD | FLASHE   PAGE = 0、ALIGN (4)

可以有人对此提供帮助吗?

谢谢你。

Gobind Singh

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

    您好、Gobind、

    我们正在与专家进行咨询。 很快就会回来。

    此致、

    Veena

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

    您能否比较在每个配置中生成的.map 文件以查看有何差异? 它是更改了一些.text 的位置还是存在其他差异?

    惠特尼

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

    文本部分存在差异。 但不仅存储器地址、文件的顺序也不同。

    RAM 中的全局符号的地址也不同。

    我无法在此处附加或插入图片。

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

    e2e.ti.com/.../SVNv16_5F00_MapCompareWithFlashBmod.pdfThis是地图文件的文件比较报告。

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

    我在地图文件中看不到任何可疑内容。 正如预期的那样、看起来只是闪存内容的一些调整。 您是否注意到这两种配置之间存在任何其他差异? 变量初始化为不同的值?

    惠特尼

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

    尊敬的惠特尼:

    感谢你的答复。

    我看不到任何这样的变化、例如变量被初始化为不同的值。 但是、内容的随机播放与此变化非常一致、结果也是如此(不平衡的电流)。

    对于同一构建的不同版本(在添加/删除某些功能之后)、我们注意到创建两个未使用的全局浮点变量(具有初始值)会产生这种差异。 变量在任何函数之外声明为如下。  添加以下语句可使电流保持平衡、注释以下语句可使电流保持不平衡。

    float var1 = 1.0、var2 = 0.0;

    当我比较该编译的映射文件(使用和不使用未使用的变量)时、在这种情况下、我还可以看到闪存和 RAM 的内容发生了大的随机播放。 是否有理由在小幅变动的情况下进行进一步改组?  

    我不知道如何调试它、感谢您的帮助。  

    谢谢你。

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

    我实际上没有在您之前共享的 PDF 中看到任何 RAM 差异-只是闪存地址发生了变化。 我是俯瞰什么吗? 不过、对您在最近发布的文章中提到的全局变量的更改会更改 RAM 地址、这是有意义的。

    您是否启用了任何安全功能? 您是否在使用 CLA? 您能否再次检查您的 cmd 文件是否存在其他潜在的权限问题。 例如、如果您已将 RAM 配置为 CLA 程序 RAM、请确保您的 cmd 文件没有将 CPU 变量放置到内存块中的任何可能性? 同样,您也可以检查 AccessProtectionRegs 是否有任何问题迹象。

    您是否能够将此问题的影响缩小到代码的任何特定部分? 就像它会影响 ADC 结果的精度或电机的其他反馈一样、它在 PWM 寄存器更新的计算中是否会在变量获取错误值等时进行更新?

    惠特尼

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4155403 #4155403]\n 您之前共享的 PDF 中实际上没有看到任何 RAM 差异-仅限闪存地址的更改。 我是否忽略某些内容?[/引述]

    不、您说得对、它只是闪存内容。

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4155403 #4155403"]您是否启用了任何安全性?

    我不这么认为。 如果您能告诉我要检查哪些寄存器、我可以在我的寄存器中进行检查。

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4155403 #4155403)]您是否正在使用 CLA? 您能否再次检查您的 cmd 文件是否存在其他潜在的权限问题。 例如、如果您已将 RAM 配置为 CLA 程序 RAM、请确保您的 cmd 文件未将 CPU 变量放置到内存块中的任何可能性?

    是的、我们使用 CLA。 我配置存储器的方式是、CLA 使用所有 LS RAM、CPU 使用所有 GS RAM 位置。 因此、我认为这种可能性不存在。 我已将我的 cmd 文件附在此处:  

    e2e.ti.com/.../cmdFile.txt

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4155403 #4155403"]同样,您可以检查 AccessProtectionRegs 是否存在任何问题迹象。

    我没有使用过任何 AccessProtectionRegs。 我已经按照这个文件中的方式配置了 CLA 存储器:

    e2e.ti.com/.../claMemConfig.txt

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4155403 #4155403)]您是否能够将此问题的影响缩小到代码的任何特定部分? [/报价]

    很难缩小这一问题的影响,我们正在努力做到这一点,但尚未取得成功。

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

     在 Cla1ToCpuMsgRAM (CLA1_MSGRAMLOW 位置:0x001480)中声明了3个变量、如下所示:

    #pragma DATA_SECTION (resDataAvailableCla、"Cla1ToCpuMsgRAM")
    #pragma DATA_SECTION (rpsRawCla、"Cla1ToCpuMsgRAM")
    #pragma DATA_SECTION (posRawCla、"Cla1ToCpuMsgRAM")

    这些变量由 CPU 使用。 我认为这不应该是问题。  

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

    我将附加一个对正在运行和未运行的编译的映射文件的比较。  

    e2e.ti.com/.../SVNv16_5F00_withAndwithoutUnusedVariables.pdf

    左侧版本是具有额外未使用变量的有效构建。 右一个是没有额外未使用的变量。 这是唯一的区别。 但我看到闪存内容中有很多其他与此无关的内容重新出现。

    这种比较与前一种比较是否有相似之处、可以让我们找出问题的根源?

    谢谢你。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4156193 #4156193)]我不认为是这样。 如果您告诉我要检查哪些寄存器、我可以在我的寄存器中进行检查。

    在不意识到安全的情况下、您不太可能意外地配置安全、但 DcsmCommonRegs 应该包含 SECTSTAT 和 RAMSTAT 寄存器来告知您状态。 如果所有字段都为1、则意味着所有字段都是不安全的。

    [引用 userid="448206" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4156193 #4156193"]我没有使用任何 AccessProtectionRegs.

    即使您没有添加任何额外的保护、它仍会检测 CPU 尝试写入 CLA 程序 RAM 等内容、因此查看错误标志不会有任何影响。 我同意您对链接器命令文件的看法--所有内容完全分开,不会有此类问题的危险。

    我认为添加/删除全局变量会更改闪存、因为它需要将其初始化值存储在 cinit 中-因此 cinit 会变得更大一点、并且会发生变化以适应它。

    这是相当令人困惑的。 由于缓存/预取命中和缺失的发生方式、闪存中的位置可能会导致执行时间略有不同、但如果您的任何代码对计时非常敏感、我会感到惊讶。 我想您可以尝试向 ramfuncs 中添加一些附加函数、看看它是否起作用、 但是、很难确定问题是由于代码从 RAM 中执行而消失、还是由于 ramfuncs 的加载位置移动再次改组闪存。

    惠特尼

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

    您好、Whitney

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4157108 #4157108]DcsmCommonRegs 应包含 SECTSTAT 和 RAMSTAT 寄存器以告知您状态。 如果所有字段都为1、则表示所有字段都是不安全的。

    我检查了寄存器、所有字段都是1。

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4157108 #4157108"]即使您尚未添加任何额外的保护,它仍会检测 CPU 尝试写入 CLA 程序 RAM 的情况,因此查看错误标志不会受到影响。

    我已检查所有的访问保护寄存器。 它们都设置为0、这意味着没有发生访问冲突。

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4157108 #4157108"]我认为添加/删除全局变量会更改闪存、因为它需要将其初始化值存储在 cinit 中-因此 cinit 会更大一点、并且会发生变化以适应它。[/quote

    我同意这一点。

    我已经尝试过其他实验。 我采用的构建提供了不平衡的电流、并修改了可执行代码的不同部分、但所有这些都提供了不平衡的电流。 我已经检查了调度程序时序、我们完全处于75%带宽内。

    下面是正在运行和未在运行的编译的映射文件的另一个比较。 区别仅在于.text 段。 左侧内容对应于不平衡电流 构建、右侧内容用于平衡电流构建。 您能否检查是否有任何可疑情况?

    e2e.ti.com/.../SVNv16_5F00_FLASHA_5F00_B_5F00_C_5F00_Vs_5F00_FLASH_5F00_B_5F00_C.pdf

    只需再次确认、问题与这些变化非常一致。

    谢谢你。

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

    感谢您检查安全设置和错误标志。 没有问题。

    我仍然看不到您的地图文件中有任何可疑内容。 我也会邀请几位同事来看看。

    更改 cmd 文件中的 align()值是否会产生任何影响? 比如、如果您将其更改为8、行为是否会更加一致?

    惠特尼

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

    我尝试将其更改为8、映射文件与此更改保持完全相同、它显示了相同的不平衡电流行为。  

    [引用 userid="123578" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4159748 #4159748">我仍然看不到地图文件中任何看起来可疑的内容。 我也会邀请几位同事来看看。

    是的。 谢谢你。

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

    好的、谢谢您的尝试。 如果我的同事提出了一些其他想法、我会告诉您。 他们可能要在几天前有机会研究一下这个问题,但请告诉我,如果你在这段时间里有发现的话。

    惠特尼

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

    Gobind、

    要尝试了解预取/高速缓存可能产生的影响、您是否可以尝试在两种情况下禁用它们并查看行为是否发生变化?

    惠特尼

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

    我们已经拆除了我们的设置、以便进行一些更改。 我将在我们恢复正常工作后立即尝试它。 同时、如果您有任何其他想法、请提出建议。

    谢谢你。

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

    我很感谢这一更新。 如果我想其他一些东西、我会告诉您。

    惠特尼

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

    我们有另一个具有相同 TMS 器件型号的设置、并且我们观察到相同的行为。 我们已经看到调度程序没有超时运行、它有很多时间。 我们降低了任务速率、但仍然看到相同的行为。

    由于问题在于我们声明或删除变量声明、这会更改.cinit 段中分配的存储器、因此会重新排列程序段等。 我看到、在 COFF 格式中、已初始化和未初始化的变量都存储在.ebss 段中、是否有方法将这两者隔离? 除了手动将所有初始化的变量放在不同的段中? 我只想尝试添加/删除变量、而不接触内存中的任何其他部分。

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

    感谢您确认您可以在另一个部件上复制它。 您是否曾尝试禁用闪存预取和缓存以查看行为是否有任何变化?

    我需要向我们的编译器团队询问如何在 ebss 中隔离变量。 我唯一知道的是在代码中使用#pragma DATA_SECTION 手动将它们分隔。

    惠特尼

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

    进一步调试后、我们观察到电流的 ADC 采样不符合我们的预期。

    我们有2个电机、M1_PhaseA、B、C 和分别连接到 ADCA 的 SOC0、B 和 D、M2_PhaseA、B、C 分别连接到 ADCA 的 SOC1、B 和 D。  

    我们为等效为-1000A 至+1000A 的 ADC 提供了阶跃输入。 我们预期 M1相位超前、M2相位紧随其后。 但我们看到 M1_A、M1_B 和 M2_B 相位以一个样本作为前向。 采样时间为50us。

    ADC SOC 分配:

    ADC/SOC SoC_0 SOC1
    ADC_A M1_B M2_A
    ADC_B M1_A M2_B
    ADC_D M1_C M2_C

    我们预期转换时的数据是这样的(M1转换发生在 M2之前):

    M1_A M1_B M1_C M2_A M2_B M2_C
    -937.049 -937.256 -938.349 -940.201 -940.741 -940.072
    995.322 996.3361 994.0714. -940.201 -937.739 -939.462
    997.7634 998.7775 994.022 994.6119 996.5128 995.3509.

    我们实际看到的是(M1_A、M1_B、M2_B 引线-毫无意义):

    M1_A M1_B M1_C M2_A M2_B M2_C
    -937.049 -937.256 -938.349 -940.201 -940.741 -940.072
    995.322 996.3361 -937.739 -940.201 994.0714. -939.462
    997.7634 998.7775 994.022 994.6119 996.5128 995.3509.

    我们将有机会尝试在周一(2022年9月12日)进行闪存预取和缓存禁用更改、届时您将得到更新。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="448206" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1119654/tms320f28375s-linker-file-not-behaving-correctly/4203901 #4203901"]我发现、在 COFF 格式中、已初始化和未初始化的变量都存储在.ebss 段中、是否有方法将这两者隔离?

    没有一种简单而直接的方法来实现它。  即使有、它对.cinit 的影响也很小。  cinit 的长度受初始化的变量数量及其初始化所需的数据量的影响。  将其中一些变量放入具有自定义名称的段不会影响它。  

    .cinit 分配到未使用的闪存存储器范围可能会有所帮助、例如 FLASHJ。

    谢谢、此致、

    乔治

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

    尊敬的惠特尼:

    不平衡电流的问题似乎是由于 ADC 未同时对电流进行采样。 这是因为这些通道的 ADC 优先级设置不正确。  

    我仍然无法理解在添加/删除全局变量时、它的行为会有何不同、但现在我们似乎已经解决了这个问题。 感谢您的所有帮助和回答。