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.

[参考译文] TMS570LS3137:如何将 C 结构的标量字段的字节值设置为小端?

Guru**** 2595800 points
Other Parts Discussed in Thread: TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1079053/tms570ls3137-how-to-set-the-endianness-of-the-scalar-fields-of-c-structures-to-little-endian

部件号:TMS570LS3137

您好,

我正在进行一个项目,我需要将一个巨大的 C 软件模块从 Windows 平台(小型 Endian 体系结构)移植到 TMS570LS3137 (大型 Endian)

软件 模块基本上从外部芯片接收一些数据,处理这些数据并发回响应。

接收或发送到外部芯片的数据应该是比较小的字节,但  TMS570LS3137是比较大的字节。

软件模块使用大量类型转换将8位数据缓冲区转换为特定的内部结构类型。

例如:

myStructure = (MY_STRUCTURE_TYPE *)pData //pData of type (uint8_t *)

当软件在 Windows 平台上运行时,由于“yStructure”中的数据顺序正确,因此其工作正常,但在 TMS570上运行时,由于字节序的变化,一切都是错误的。

1/我看到只要 定义了此类结构,就可以使用的 pragma <#pragma scalar_storage_order litte-endian>,但 TI 编译器不支持该结构(TI v20.2.5.LTS)

2我试图用小端点编译代码,并在 CCS 中将设备类型更改为小端点,但我在将代码刷新到目标上时遇到问题,CCS 中出现错误“File.elf 与目标端字节不匹配,未加载”

3我正在研究如何将编译器更改为 gcc (以便使用 scal_storage_order pragma) ,但这一过程将涉及构建整个 GNU 工具链。 但是,这一过程似乎没有得到很好的记录。

我能看到的唯一肮脏的黑客方式是手动创建函数,以便在使用此类类型转换时反向所需的字节。 但是,这是一种容易出错的高强度适应,因为有 数百种结构和类型铸造,如上所述。

您认为处理此问题的最佳方法是什么? 我对任何解决方案都持开放态度。  

谢谢

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

    你好,Seb,

    您的 C 代码访问字节是否为系统寄存器和外围设备寄存器? 哪种外设用于接收数据和发送数据?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="513841" url=~ë/support/icles/arm-based icroms-group/arm-based icros/f/arm-based iclms-forum-forum/1079053/tmspragma 5703137-How to -set-didian-of_scalar-fields -of_c-structurs- chain/gma, 但编译器在构建过程中几乎不会改变 gma 的顺序。] 但是,这一过程似乎没有很好的记录。

    在以下线程中,如果它有所帮助,则记录了从源代码构建 GNU 工具链和添加大端库所采取的步骤:

    对于 GNU ARM v7.3.1

    对于 GNU ARM v9.3-1

    其中,上述内容包含到我的 Google 驱动器上预构建的编译器的链接。

    #pragma scalar_storage_order litte-endian>看起来很有趣,但尚未尝试查看它是否在 GNU ARM 上运行。

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

    QJ 您好,

    感谢您的回复。 C 代码从闪存和 mibspi 模块读取字节,并将数据发送到 mibspi 模块。

    你的想法是什么?

    我想在(MIB) SPI 级别颠倒必要的字节。 因此,我会在发送帧前或接收帧后交换所需的内容,但有许多不同类型的帧(和不同的格式)  在 这一级别实施解析器的努力似乎比  在第三方软件中执行肮脏/黑客反向操作要大得多

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

    谢谢切斯特

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

    你好,Seb,

    ARM 编译器提供了两种交换数据字节的内在函数:

    _rev (单词);

    _rev16 (半字);