工具/软件: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
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.
工具/软件: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
没错、我想以 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
我在(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
请注意:参考 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_*