自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

vvvlan的博客

嵌入式 iot 物联网 设备 网络

  • 博客(12)
  • 收藏
  • 关注

原创 protobuf 序列化原理

protobuf 序列化原理文章目录protobuf 序列化原理背景一个完整的Protobuf举例序列化结果分析背景Protobuf是我们在网络传输中经常会用到的协议,优点是版本间兼容性强,对数据序列化时的极致压缩使得Protobuf包体积比xml、json等格式要小很多,节约流量。对于pb协议的具体使用方法,其官网有比较详细的说明,本文不再详述。我们的数据不管在代码中是什么复杂结构体,传输时都要序列化成二进制串。官网中也介绍了Protobuf的序列化算法,不过给的例子比较简单,学习起来不够直观。因此

2020-12-21 12:09:38 1048

原创 详解varint编码原理

详解varint编码原理文章目录详解varint编码原理1. 什么是Varint编码2. 编码原理3. 编码实现4. 解码实现1. 什么是Varint编码Varint是一种使用一个或多个字节序列化整数的方法,会把整数编码为变长字节。对于32位整型数据经过Varint编码后需要15个字节,小的数字使用1个byte,大的数字使用5个bytes。64位整型数据编码后占用110个字节。在实际场景中小数字的使用率远远多于大数字,因此通过Varint编码对于大部分场景都可以起到很好的压缩效果。2. 编码原理除

2020-12-21 12:08:25 1007

原创 proto文件描述语法

proto文件描述语法文章目录proto文件描述语法Chapter 1. 为什么使用Protocol BufferChapter 2. 定义第一个Protocol Buffer消息Chapter 3. 定义第二个(含有枚举字段)Protocol Buffer消息Chapter 4. 定义第三个(含有嵌套消息字段)Protocol Buffer消息Chapter 5. 限定符(required/optional/repeated)的基本规则Chapter 6. 类型对照表Chapter 7. Protoco

2020-12-21 12:07:40 2076

原创 github 加速办法,不需要替换dns

github 加速办法文章目录github 加速办法使用github镜像访问,访问镜像网站,网站的内容跟Github是完整同步的镜像,然后在这个网站里面进行下载克隆等操作, 两个最常用的镜像地址:https://github.com.cnpmjs.orghttps://hub.fastgit.org// 替换git config --global url."https://hub.fastgit.org".insteadOf https://github.com// 查看git配置信息

2020-11-21 22:23:07 1506

原创 C语言宏定义-max、min宏再看Linux内核问题演进

C语言宏定义-max、min宏再看Linux内核严谨性文章目录C语言宏定义-max、min宏再看Linux内核严谨性1. 简介2. `__COUNTER__`宏3. 相关宏1. 简介1) 通常我们经常使用如下宏判断返回X、Y的最小值或者最大值#define min(X, Y) ((X) < (Y) ? (X) : (Y))#define max(X, Y) ((X) < (Y) ? (Y) : (X))宏参数可能被重复调用的问题:例如 next=min(++a,1),宏被展开

2020-11-15 22:08:28 1601

原创 C语言宏定义-再看ARRAY_SIZE

文章目录C语言宏定义-再看ARRAY_SIZE1. 简介2. 相关宏C语言宏定义-再看ARRAY_SIZE1. 简介做过linux驱动开发的人员,应该都用过ARRAY_SIZE(x)宏,目的求出一个数组包含的个数,在2007内核提交了一个patch,更新了这个宏加入__must_be_array(arr)是防止被误用,比如用指针而不是数组上。#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]) + __must_be_array(arr))

2020-11-14 22:58:18 6028 1

原创 C语言宏定义-静态断言宏static_assert

文章目录C语言宏定义-静态断言宏static_assert1. 简介2. 相关宏C语言宏定义-静态断言宏static_assert1. 简介assert适用于运行时的断言,也就是说,如果程序不运行,我们根本不知道有没有错,但是有些时候,我们希望在编译的时候就可以让编译器检测到错误,所以在c++11中新增了assert_static,也就是静态断言。对于我们c开发,使用宏定义也能自己封装一套静态编译断言。2. 相关宏CMO_STATIC_ASSERT(cond)编译时检查cond表达式是否

2020-11-14 21:19:05 3537

原创 C语言宏定义-跟踪调试宏

文章目录C语言宏定义-跟踪调试宏1. 简介2. 相关宏3. 例子C语言宏定义-跟踪调试宏1. 简介标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。__LINE__当前代码行的行号,表示为十进制整型常量, 注:#line可以重新设定__LINE__的值__FILE__当前代码的文件名(全路径),表示字符串型常量__func__ or __FUNCTION__当前代码所在的函数

2020-11-14 18:23:02 1003

原创 C语言宏定义-#和##在宏定义中的作用

C语言宏定义-’#,##'在宏定义中的作用1. 宏##的作用是把宏的标识符进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号/** * @def CMO_STRINGIFY * @brief converts a macro argument into a character constant. * * @param[in] x - A macro argument to stringify. */#define CMO_ST

2020-11-14 12:03:23 1071

原创 C语言宏定义-主流编译器相关的宏

C语言宏定义-主流编译器相关的宏1. 目的嵌入式c语言日常开发中,主要面对的编译器有3种,KEIL、IAR、GCC,为了实现多编译代码的统一,抽象了编译器相关的宏,初始设计来源于cmsis源码抽象。2. 编译器类型识别/** * @brief Compiler type. * - CMO_COMPILER_TYPE */#if defined(__CC_ARM)#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 40

2020-11-13 23:34:36 1744

原创 C语言宏定义-基本使用

C语言中宏定义基本使用1. 宏定义的基本语法宏定义分为2类, 不带参数的宏定义 和 带参数的宏定义1.1 不带参数的宏定义形式:使用一个指定的标识符来代表一个字符串#define 标识符 字符串例如#define PI 3.14159265作用:程序中但凡使用到PI的地方全部都会用3.14159265来替换,主要用途使用一个简单标识符来代替一个长的字符串1.2 带参数的宏定义形式:带参数的宏定义不是仅仅进行简单的字符串替换,还要进行参数替换#define 标识符(参数表) 字符串

2020-11-13 18:26:16 849

原创 PicGo +码云+Typora来搭建markdown图床

文章目录PicGo +码云+Typora来搭建markdown图床1. 图床是啥子2. 准备工作2.1 Nodejs 安装2.1 PicGo 安装2.2 注册拥有一个码云gitee账号2.3 typora 下载安装3.码云图片仓库配置3.1 新建仓库3.2 生成一个新令牌4.PicGo配置4.1 gitee-uploader插件安装4.2 gitee-uploader插件配置4.3 验证配置是否有效5.typora配置PicGo +码云+Typora来搭建markdown图床1. 图床是啥子图床一般

2020-11-13 16:30:38 192

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除