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.

[参考译文] 编译器/TM4C1290NCPDT:Byteswap

Guru**** 2466550 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/667605/compiler-tm4c1290ncpdt-byteswap

器件型号:TM4C1290NCPDT

工具/软件:TI C/C++编译器

您好!

我想使用 TM4C129 /Corteswap 指令、CortexM4器件。 我知道在汇编器中、这可以通过 gcc-代码来完成、如下所示:

内联 uint32_t rev16 (uint32_t a)
{
asm ("rev16 %1、%0"
:"=r"(a)
:"R"(a));
返回 A;
} 

我找不到如何使用适用于 TM4C 器件的 TI 编译器将其转换为有效语法。 欢迎提供任何帮助。  

此致

Micky

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

    为了澄清一下、您是否希望将其作为内联汇编函数转换为 Code Composer Studio、以便与.c 代码一起使用? 您使用的是哪个 CCS 版本?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没错、我想以 C 内联的方式执行此操作。

    我在 Linux 下使用 CCS7。

    TI-CGT-ARM_16.9.1.LTS 版本提供:

    TI ARM C/C++编译器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    
    TI ARM EABI C/C++解析器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM C/C++文件合并 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM C/C++优化器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM C/C++代码生成 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM 汇编器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM Embed 实用程序 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM C 源代码接口器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TAR C08D
    TI ARM 连接器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TAR-C08D
    TI ARM 绝对列表器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TAR-C08D
    TI ARM Strip Utility v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM XREF 实用程序 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM C++还原器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TAR C08D
    TI ARM 十六进制转换器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM 名称实用程序 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TA-C08D
    TI ARM 目标文件显示 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TAR-C08D
    TI ARM 归档器 v16.9.1.LTS
    内部版本号1QM7P-2LI-VATAQ-TAR-C08D 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想指出的是、(两种) PRO IDE (IAR 和 Keil)都提供了这样的"内联"ASM 支持。 (虽然不太可能证明"准确"-线索可能会提供哪些指导和帮助。)

    "免费-代码大小受限版本"-可供下载-而大量的"用户手册"提供了"详细信息"-您可以在此处了解(可能)操作的优点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不想更改工具链或编译器。
    我猜、这可以作为 C 内联或(不是很好)汇编器函数来完成。 但我不知道如何使用 TI ARM 编译器来实现这一点。 gcc 可以如上所述执行此操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我没有建议您"改变"您的工具链-相反、我认为您可以"获得见解"-通过查看(其他人)如何实现您的目标...

    重塑"车轮"-正如您所发现的-并不总是"快速/轻松"。    (因此我的建议)

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

    您的编译器具有 ARM 指令内在函数。

    我在查看该手册(我的手册适用于16.9.0.STS、但我怀疑内在函数会在次要版本之间发生变化)、第5.13节的表5-3显示了这些内在函数的列表。

    对这些内在函数的调用以代码形式编写、语法与对 C 函数的调用相同、但编译器使用汇编指令替换它。

    请参阅内在函数__rev16()。

    文档页面的屏幕截图:

    还有其他页面、其中包含更多内在函数。

    不确定本手册的链接在哪里... 也许其他人可以在此处发布该链接。 :-)

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

    1. Go CMSIS:我发布了一组文件来执行该操作。 它可与 CCS 配合使用。 也可以简单地使用 msp432的 CMSIS 文件。

    或者只需在 CMSIS 文件中复制并粘贴 rbit 实现。 它相当独立。

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

    我在(IAR 和 CCS)下找到了这个"asm 示例"。

    #if defined (ewarm)|| defined (DOXYGEN) //请注意、这在 IAR (ewarm)下
    静态长整型
    MainLongMul (长 LX、长 Ly)

    //
    //汇编代码以高效执行乘法(使用
    //指令将两个32位值相乘并返回完整的64位值
    //结果)。
    //
    _asm (" smull r0、r1、r0、r1"
    " LSR r0、r0、#16\n"
    " ORR r0、r0、r1、LSL #16\n"
    " BX lr");

    //
    //从未达到此返回值,但需要避免使用编译器
    //警告。
    //
    返回(0);

    #endif

    #if defined (CCS) // 、这在 CCS 下
    静态长整型
    MainLongMul (长 LX、长 Ly)

    //
    //汇编代码以高效执行乘法(使用
    //指令将两个32位值相乘并返回完整的64位值
    //结果)。
    //
    _asm (" smull r0、r1、r0、r1"
    " LSR r0、r0、#16\n"
    " ORR r0、r0、r1、LSL #16\n"
    " BX lr\n");

    //
    //这是防止 TI 编译器优化代码所必需的。
    //
    return (LX * Ly);

    #endif

    您可能会注意到、差异(非常)很小。   (\n 和不同的返回值-我现在注意到)   PRO IDE (此处的 IDE 早已存在)的优点是它们的"用户手册深度说明-它们的稳健性-当然还有它们的"供应商不可知"功能。   (一个也只有一个- PuhLease……)

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

    [引用 USER="Michael Schuster"]我猜,这可以是作为 C 内联函数或(不是很好)作为汇编器函数来完成的。

    您可能会过快地取消此选项。 良好的编译器 很可能能够将 C 代码转换为等效(或更好)的汇编语言。 如果出于某种原因需要准确的汇编指令序列或性能测试、则只需跌落至汇编指令、就会首先显示出您需要改进、其次是汇编提供了改进。

    检查以查看是否有如下内容(警告未检查的代码)

    uint16_t x;
    
    x =((x &(uint16_t) 0xFFu)<< 8u)|((x &(uint16_t) 0xFF00u)>> 8u); 

    性能也优于汇编代码或优于汇编代码、其额外优势是不依赖于编译器。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的解释。 我可以使用内在函数(如12月12日下午的建议)、但这可能会对进一步的问题有用
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、这正是我的理想之选!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意:参考 LWIP 的 NTOHS,我建议改进:

    按如下方式更改 LWIP 中的 def.h 以增强 ntohs 功能并定义 LWIP_PLATE_BYTESWAP

    /*
    版权所有(c) 2001-2004瑞典计算机科学研究所。
    *保留所有权利。
    *
    *
    只要满足以下条件、就允许以源代码和二进制形式重新分发和使用****
    
    ** 1. 重新分发源代码必须保留上述版权声明
    、*本条件列表和以下免责声明。
    * 2. 以二进制形式重新分发必须复制上述版权声明、
    *本条件列表和
    分发随附的文档*和/或其他材料中的以下免责声明。
    * 3. 未经
    事先书面许可、不得使用作者的姓名认可或推广本软件*衍生产品。
    *
    *本软件由作者``按原样'提供、
    
    不承担任何明示或暗示的*保证、包括但不限于*适销性和特定用途适用性的暗示保证。
    在任何情况下*提交人都不应对任何直接、间接、偶然、特殊
    、*模范、 或相应的损害(包括但不限于采购
    *替代产品或服务;丧失使用、数据或利润; 或业务
    *中断)、但出于任何责任理论、
    
    无论是在*合同中、严格责任还是由于使用本软件而以任何方式产生的侵权行为(包括疏忽或其他)、即使被告知
    存在此类损坏的可能性*。
    *
    *此文件是 lwIP TCP/IP 堆栈的一部分。
    *
    *作者:Adam Dunkels 
    *
    //
    #ifndef __LWIP_DEF_H__
    #define __LWIP_DEF_H__
    
    // arch.h 可能已经定义 NULL */
    #include "lwip/arch.h"
    #include "lwip/opt.h"
    
    #ifdef __cplusplus
    extern "C"{
    #endif
    
    #define IP/XT.x (x_MAX)(x)(x)(x (?)(x (x ))(x (x )))(x (?(((?)))))) (x):(y)
    #define LWIP_min (x、y)(((x)<(y))? (x):(y)
    
    #ifndef NULL
    #define NULL ((void *) 0)
    #endif
    
    //* Endianess-optimized 移位2个 u8_t 以创建一个 U16_t */
    #if byte_order = lit_ENDIAN
    #define LWIP_make_U16 (a、
    
    b)((a << U8)|#define LWIP_8)|(a <_make b)|(a <_8) b)
    #endif
    
    #ifndef LWIP_platform_BYTESWAP
    #define LWIP_platform_BYTESWAP 0
    #endif
    
    #ifndef LWIP_prefix_ByteOrder_funcs
    //在某些平台上命名冲突的权变措施*/
    
    #ifdef hs
    #undif
    //#undifton/htons */
    #iftonf #undtol *#undiftol /#undtol #undtol
    
    *
    nhs #undiftol /#undtol #undiftol * nf/#undtol #undiftol #undiftol * nf #undiftol #undtol #undtol / nf/#undtol #undiftol #undtol #undif
    
    
    
    
    
    hl #define (x) lwip_htons (x)
    #define ntohs (x) lwip_ntohs (x)
    #define htonl (x) lwip_htonl (x)
    #define ntohl (x) lwip_ntohl (x)#define ht
    (x)#define nwip_done
    
    
    
    
    
    
    
    
    
    
    (x)#define nwip (x)#define)(x (nwip_tex_t_byte)#define)#define nwip (x (x)(nwip_t_t+)#define)#define) nwip_t_nwip_rx (x (nwip_nwip_rx (x)#define)#define)#define nthx (nwip_t_nwip_rx (x (nwip_t_t+)#define)#define)#define)#define nwip_nwip_nwip_nwip
    #if LWIP_platform_BYTESWAP
    #define lwip_htons (n)__rev16 (n)
    #define lwip_nhs (n)__rev16 (n)
    #define lwip_hwip_hwip_ht (n)_nwip_tl
    
    (nwip_hwip_ht)#define lwip_hwip_hwip_ht
    
    
    
    
    
    (n) nwip_t_hwip_t_nt_t_nt_t_nt (nwip_nwip_t_t_tx_t_t_nt_t_hl_lwt)#define (nwip_nwip_nwip_nwip_nwip_nwip_t_t_t_t_t_t_hl
    
    (nwip_nwip_nwip_nwip_nwip_nwip_nwip_nwip_nwt)#define)#define (nt_hl_t_t_t_t_t_t_
    #endif /* LWIP_platform_BYTESWAP */
    
    ////这些宏应由预处理器计算,并且
    仅与编译时常量一起使用(因此
    在运行时不存在小端开销)。 //
    #define PP_HTONS (x)(((((x)& 0xff)<< 8)|((((x)& 0x00)>> 8)
    )#define PP_NTOHS (x) PP_HTONS (x)
    #define PP_HTONL (x)((((((x)& 0xff)<< 24))|\
    ((((x)& 0x0000)<< 8)|\
    ((((x)& 0x00000000UL)>> 8)|\
    ((((x)& 0x000000UL)>> 24)
    #define PP_NTOHL (x) PP_HTONL (x)
    
    #endif //* byte_order = BIG_ENDIAN */
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /*__LWIP_DEF_H_*
    
    

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

    也许您应该在 lwIP 邮件列表上提出这项建议、以便其他人也能从中受益?

    需要注意的一点是:这仅在编译器支持此类__rev()和__rev16()内在函数时有效。