最近移植软件,原编译器是GCC,移植到STM32上用ARMCC。
有几个库函数(htonl,ntohl,htons,ntohs)在标准库里没有,需要自己写。于是网上找了个模板比较简单,修改了下做成自己的函数。
然后想做成内联函数,于是加了__STATIC_INLINE(定义在core_cm4.h中)修饰。以htons为例,程序如下:
// 模拟htons函数,本机字节序转网络字节序
__STATIC_INLINE unsigned short int htons(unsigned short int h)
{
// 若本机为大端,与网络字节序同,直接返回
// 若本机为小端,转换成大端再返回
int i = 0x12345678;
return (*((unsigned char *)(&i)) == 0x12) ? h : BigLittleSwap16(h);
}
结果检查汇编码发现编译器并没有选择内联,仍然是普通的函数调用,如下图:
于是在__STATIC_INLINE前面加了__attribute__( ( always_inline ) )修饰,以htons为例,程序如下:
// 模拟htons函数,本机字节序转网络字节序
__attribute