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.

[参考译文] CCS/TMS320F28379D:从站协议栈代码映射对象浮动

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/674276/ccs-tms320f28379d-slave-stack-code-mapping-objects-float

器件型号:TMS320F28379D

工具/软件:Code Composer Studio

您好!

我在使用浮点值时遇到问题。 在从站堆栈代码(SSC)中、我将对象定义为浮点型->在 SSC 中、它们具有32位实数数据类型。

它如下所示:

那么、我有浮点变量和一个浮点数组。

在 Code Composer Studio 中、我按照文档中所述编辑了映射:

此外、我将参数 pData 编辑为32位变量、因此我可以传输32位浮点/实数变量。

在n´t 运行模式下使用 TwinCAT、我不会为浮点变量获取正确的值。

在 TwinCAT 中,我将该值设置为3,0,因此该结果为十六进制0x40400000:

在 Code Composer Studio 中、我得到了一些不同的东西。 现在是十六进制0x4E808000:

我必须考虑什么吗? 甚至可以传输浮点值吗?

此致、

Willi Konrad

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

    我尚未尝试数据类型 REAL32、但应该可以通过网络和 SM 缓冲区将其视为32位。 您应该能够将32位从 ESC 存储器移动到 MCU RAM、然后进行拼写或将移动的32位视为浮点、并根据需要重复使用。

    现在、一旦您确认输入大小和输出大小是正确的数据单元数、请查看函数 PDO_OutputMapping 是否正在从 ESC RAM 将所有字节正确移入 MCU RAM 中。 您已经知道应该在 MCU 存储器中看到的纯字节。 查看在从 ESC 读取块后是否可以在 PDO_OutputMapping 中放置断点、并检查 MCU RAM 中是否存在所有字节。

    如果并非所有字节都正确、则 SSC 工具中的输入/输出对象定义和生成的应用对象软件中存在错误。 我怀疑情况并非如此、但最好进行检查。

    如果在 PDO_OutputMapping 执行块读取后确认 MCU 存储器中的所有字节均可用、则需要将数据移至 Laser _Angle 等应用变量。 pData 访问只是将数据从 MCU 存储器阵列移动到 PDI_OutputMapping、查看将 pData 作为16位指针是否会产生任何影响、查看 pData 的开始是否发生移位或这种情况看起来是正确的?

    希望这对您有所帮助。

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

    您好、Santosh、

    感谢您的回复。 我按您所说的那样进行了检查。 数据正在从 ESC RAM 正确移动到 MCU RAM。 我在 pData 指向的地址中看到正确的字节。

    但是、当将 pData 分配给浮点变量时、它会显示出不同的内容。 我猜是因为编译器将 pData 中的值视为十进制值并将其转换为浮点值。 ´m、我感到困惑的是、因为它应该是一个整数、但被视为十进制。

    在这里、我的示例:

    我向变量写入值0.12345 ->十六进制0x3dfcd35b

    在我的 MCU RAM 中、我看到了相同的情况、因此这可以正常工作。

    但是、在 CCS 中为我的变量分配值时、看起来会有所不同:

    您可以看到、我的 TwinCAT 十进制值(请再次参阅上图->十进制:1039979355)已转换为浮点值、因此它会提供十六进制值0x4E77F34D。

    您是否知道如何解决此问题?

    此致、

    Willi Konrad

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

    Willi、
    我也会在这里与团队进行交叉检查、在 APPL_OUTPUTMAPPING 函数中、将数据从 ESC RAM (pDATA 指针访问)移动到输出结构变量 ANG_1、您能否一次将16位从 pData 分配到 ANG_1、而不是32位移动?

    如果您在 ANG_1 var 中具有正确的十六进制值、那么您应该看到正确的右浮点吗?

    编辑:-我在这里与我的团队交叉检查,如果你将16位从 pData 复制到 ANG_1变量地址,而不是从右到左的32位分配,你应该看到正确的浮点值。 请告诉我们这是否可行。



    此致
    Santosh Athuru

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

    您好、Santosh、

    感谢您的交叉检查。 我n´t 传输仅16位、但它不起作用。 它还将我的十进制值转换为浮点值、而不是整数值。 它的行为相同。

    同时我解决了这个问题。 解决方案是将 pData 指针 memcpy 指向变量

    我n´t 不知道它为什么会n´t 铸件、但这是一个很好的权变措施。

    感谢您的支持

    此致

    Willi Konrad

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

    Willi、

    是的、memcpy 会起作用。 感谢确认、我假设16位移动以及 C28上的 memcpy 一次移动16位、但看起来像16位移动、会发生自动类型转换。

    memcpy with sizeof()是您所指出的更好的解决方案。

    此致

    Santosh Athuru