sqlite 0转换为bit_vppinfra字节序转换、bitops、cacheline、jmp机制

本文介绍了VPP代码中常用的字节序转换API、位操作函数,如位1计数,以及缓存相关概念和协程实现,通过longjmp机制实现轻量级多任务。
摘要由CSDN通过智能技术生成

微信公众号:DPDK VPP源码分析
关注公众号可了解更多的学习资源,请留言:资料。问题或建议,请公众号留言;如果你觉得内容对你有帮助,欢迎赞赏[1]

a5bfaa0c81803a4953aaa0c9205fab53.pnga5bfaa0c81803a4953aaa0c9205fab53.png

fbe8aa5137c383276667767ca641565b.png

本篇介绍一些vpp代码中经常使用一些宏定义,了解一下内部的一些实现。

字节序转换相关api

vpp提供的字节序相关的api都定义在src\vppinfra\byte_order.h文件中,支持u16、i16、u32、i32、u64、i64字节序的转换。
下面是定义当前系统是大端还是小端的宏定义

1/*系统大小端设置宏*/
2#if (__BYTE_ORDER__)==( __ORDER_LITTLE_ENDIAN__)
3#define CLIB_ARCH_IS_BIG_ENDIAN (0)
4#define CLIB_ARCH_IS_LITTLE_ENDIAN (1)
5#else
6/* Default is big endian. */
7#define CLIB_ARCH_IS_BIG_ENDIAN (1)
8#define CLIB_ARCH_IS_LITTLE_ENDIAN (0)
9#endif

宏定义BYTE_ORDER__和__ORDER_LITTLE_ENDIAN在vpp工程中是搜索不到的。其实这些宏是gcc默认的宏定义选项。
我们可以在自己的系统上使用下面的命令来查询(当前环境是小端模式)

1$: gcc -E -dD -xc /dev/null | grep ENDIAN
2#define __ORDER_LITTLE_ENDIAN__ 1234
3#define __ORDER_BIG_ENDIAN__ 4321
4#define __ORDER_PDP_ENDIAN__ 3412
5/*这是我们需要的宏定义,当前环境设置为小端模式*/
6#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
7#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__

我们以u16主机序到网络序的转换函数:clib_net_to_host_u16来举例,来看下宏定义展开后的相应函数实现如下:

 1#define clib_arch_is_big_endian    CLIB_ARCH_IS_BIG_ENDIAN
2 always_inline u16 3clib_byte_swap_u16 (u16 x) 4{
5    /*使用gcc的buildin字节转换函数*/
6    return __builtin_bswap16 (x);
7}
8
9 always_inline u1610clib_host_to_big_u16 (u16 x)11{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值