自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

陈建的专栏

记录生活,记录工作

  • 博客(371)
  • 资源 (12)
  • 论坛 (4)
  • 收藏
  • 关注

原创 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

文章目录一、前言二、RPC 基础概念1. RPC 是什么?2. 需要解决什么问题?3. 有哪些开源实现?三、protobuf 基本使用1. 基本知识2. 使用步骤四、libevent1. libevent 简介2. 基本使用五、实现 RPC 框架1. 基本框架构思2. 元数据的设计3. 客户端发送请求数据4. 服务端接收请求数据5. 服务端发送响应数据6. 客户端接收响应数据六、总结1. protobuf 的核心2. 未解决的问题一、前言在嵌入式系统中,很少需要使用到 RPC (Remote Proce

2021-04-25 08:33:32 25 1

原创 都说软件架构要分层、分模块,具体应该怎么做(二)

道哥的第 028 篇原创文章目录一、前言二、需求调研和需求分析1. 用例图2. 用例描述(1)添加设备用例描述(2) 删除设备用例描述(3) 控制设备用例描述(4) 规则配置用例描述(5) 规则触发用例描述三、概要设计1. 针对关键用例的用例描述,画出鲁棒图2. 对鲁棒图中的模块进行归类,归纳出子系统四、详细设计1. 逻辑架构2. 运行架构3. 开发架构五、架构验证六、总结一、前言在上一篇文章中,我们主要聊了:在嵌入式系统的应用程序架构设计中,应该从哪些方面来进行需求整理和分析,文章链接:都说软件.

2021-03-17 10:48:49 97 6

原创 C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻

这是道哥的第014篇原创文章目录一、前言二、变量与指针的本质1. 内存地址2. 32位与64位系统3. 变量4. 指针变量5. 操作指针变量5.1 指针变量自身的值5.2 获取指针变量所指向的数据5.3 以什么样的数据类型来使用/解释指针变量所指向的内容三、指针的几个相关概念1. const属性2. void型指针3. 空指针和野指针3.1 空指针:不指向任何东西的指针3.2 野指针:地址已经失效的指针四、指向不同数据类型的指针1. 数值型指针2. 字符串指针3. 指针数组与数组指针3.1 指针数组3..

2021-01-17 12:38:09 531 9

原创 一步步分析:C语言如何面向对象编程

这是道哥的第009篇原创一、前言在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式。虽然C++语言是从C语言发展而来的,但是今天的C++已经不是当年的C语言的扩展了,从2011版本开始,更像是一门全新的语言。那么没有想过,当初为什么要扩展出C++?C语言有什么样的缺点导致C++的产生?C++在这几个问题上的解决的确很好,但是随着语言标准的逐步扩充,C++语言的学习难度也逐渐加大。没有开发过几个项目,都不好意思

2020-12-20 17:07:36 116

原创 原来gdb的底层调试原理这么简单

一、前言这篇文章来聊聊大名鼎鼎的GDB,它的豪门背景咱就不提了,和它的兄弟GCC一样是含着金钥匙出生的,在GNU的家族中的地位不可撼动。相信每位嵌入式开发工程师都使用过gdb来调试程序,如果你说没有用过,那只能说明你的开发经历还不够坎坷,还需要继续被 BUG吊打。我们都知道,在使用gcc编译时,可以使用-g选项在可执行文件中嵌入更多的调试信息,那么具体嵌入了哪些调试信息?这些调试信息是如何与二进制的指令之间进行相互交互?在调试的时候,调试信息中是如何获取函数调用栈中的上下文信息?针对上面这些疑惑,道

2020-12-14 09:58:35 1280 11

原创 向高手学习:glib如何来封装跨平台的线程库

文章目录一、前言二、glib 简介三、线程库的设计1. 线程相关的文件2. 数据结构3. 线程的创建4. 线程的执行5. Windows平台函数调用链四、总结一、前言这篇文章,按照下面这 2 张图,来描述 glib 在 Linux 和 Windows 平台上,是如何来进行线程库的设计的。Linux 平台:Windows 平台:最近写了几篇关于跨平台的应用程序设计思路,有些小伙伴在后台留言询问关于一些通用的跨平台库,看来这方面的需求还是很多的。所谓的跨平台,无非就是希望用同一份应用程序的代码,

2021-05-14 08:30:11 18

原创 使用 cmake 来搭建跨平台的应用程序框架:C++版本

文章目录一、前言二、示例代码说明1. 功能描述2. 文件结构三、Linux 系统下操作1. 通过 cmake 指令,生成 Makefile 文件2. 编译 libA3. 编译 libB4. 编译可执行程序 appC四、Windows 系统下操作1. 生成 VS 解决方案2. 编译 libA3. 编译 libB4. 编译 appC五、总结一、前言在上一篇文章中(使用 cmake 来搭建跨平台的应用程序框架:C语言版本),我们以源代码的形式,演示了利用利用 cmake 这个构建工具,来编译跨平台的动态库、静

2021-05-11 14:35:30 12

原创 使用 cmake 来搭建跨平台的应用程序框架:C语言版本

文章目录一、前言二、示例代码说明1. 功能描述2. 文件结构3. cmake 构建步骤4. Utils 目录说明5. Application 目录说明三、Linux 系统下操作步骤1. 创建构建目录 build2. 执行 cmake,生成 Makefile3. 编译 Utils 库4. 编译可执行程序 Application四、Widnows 系统下操作步骤1. 通过 cmake 指令生成 VS 工程2. 编译 Utils 库文件3. 编译可执行程序 Application五、总结一、前言我们在写应用

2021-05-11 14:34:44 164 8

原创 内联汇编很可怕吗?看完这篇文章,终结它!

文章目录一、基本 asm 格式1. 语法规则2. test1.c 插入空指令3. test2.c 操作全局变量4. test3.c 尝试操作局部变量二、扩展 asm 格式1. 指令格式2. 输出和输入操作数列表的格式3. test4.c 通过寄存器操作局部变量4. test5.c 声明改动的寄存器三、使用占位符来代替寄存器名称1. test6.c 使用占位符代替寄存器2. test7.c 给寄存器起别名四、使用内存地址1. test8.c 使用内存地址来操作数据五、总结在 Linux 代码中,经常可以看到

2021-04-27 08:29:28 18

原创 关于技术书籍,我是这么来选书和看书的

文章目录一、前言二、选书1. 重视选书的过程2. 如何选书3. 电子书 or 纸质书三、读书1. 不要怕弄脏书2. 消灭模糊性、不确定性3. 一定要做笔记4. 怎么确认自己真的懂了一、前言前几天有同事过来,让我推荐一本 Linux 系统的书籍。我就问他 2 个问题:你想学习 Linux 哪一个层次:内核层?驱动层?应用层?你的目标是什么:是学习 Linux 系统的设计架构?某个模块的驱动开发?还是仅仅想系统学习一下应用程序编程?最后,给他推荐了下面这本书:后来我又想了一下自己

2021-04-12 08:30:23 23

原创 关于二进制表示和补码计算的来龙去脉,入门看了秒懂

文章目录一、前言二、从十进制到二进制1. 十进制2. 二进制3. 扩展到十六进制4. 扩展到任意进制三、从十进制加法到二进制加法1. 十进制加法2. 二进制加法3. 十六进制加法四、把负数计算转换成正数计算1. 原码2. 把负数计算变成正数计算3. 新问题:如何表示0?4. 补码的计算五、总结一、前言计算机最喜欢的数字就是 0 和 1,在 CPU 的世界中,它只认识这两个数字,即使是强大的操作系统,也都是由 0 和 1 组成的。作为一名软件开发者,入门学习的内容可能就是认识这 2 个既简单、又强大的数

2021-04-08 09:35:49 7

原创 跨平台代码的3种组织方式

文章目录一、缘起二、问题引入三、三个解决方案方案1方案2方案3四、One More Thing一、缘起在上一篇文章中,分享了一个跨平台的头文件是长成什么样子的,这个头文件对于 windows 平台下更有意义一些,因为要处理库函数的导入和导出声明(dllexport、dllimport)。其实,可以在这个头文件的基础上继续扩充,以达到更细粒度的控制。例如:对编译器的判断、对编译器版本的判断等等。同样的,我们在源代码中也会遇到一些跨平台的问题。不同的功能,在不同的平台下,实现方式是不一样的,如何对这些平

2021-04-01 09:41:44 34

原创 分享一个跨平台的头文件

文章目录一、前言二、头文件三、预定义的宏1. 平台宏定义2. 编译器宏定义四、Windows 平台场景分析1. 编译生成库文件2. 使用库五、Linux 平台场景分析一、前言我们平常在写代码的时候,特别是在制造轮子的时候(为别人提供库文件),会遇到各种不同的需求场景:有些人需要在 Linux 系统下使用,有些人需要在 Windows 系统下使用;有些人使用 C 语言开发,有些人使用 C++ 来开发;有些人使用动态库,有些人使用静态库;特别是在 Windows 系统中,库文件中导出的函数需

2021-04-01 09:41:04 13

原创 C语言边角料4:利用_Pragma来温柔的废弃API

文章目录一、前言二、操作过程1. 第一个版本的库2. 第二个版本的库三 \_Prama 其他用法1. 处理头文件重复包含2. 输出编译信息一、前言想象一下这个工作场景:你在为一个项目写一个功能库,别人调用库中提供的函数,后来你发现库里的函数A是多余的。具有完美情节的你,就是想把这个函数A废弃掉,此时肯定是不能直接删掉,因为你不知道别人在多少个地方调用了这个函数。这种情况如何处理比较好呢?这篇小短文就来聊一聊这个问题。二、操作过程1. 第一个版本的库测试文件只有 3 个: api.h, ap

2021-04-01 09:40:20 18

原创 C语言边角料3:用纯软件来代替Mutex互斥锁-多线程

文章目录一、前言二、Micha Hofri 算法三、测试代码四、总结一、前言在上一篇文章中,介绍了一种纯软件算法,用来实现临界区的保护功能,文章链接: C语言边角料2:用纯软件来代替Mutex互斥锁。首先明确一下:如果利用操作系统提供的互斥锁可以实现我需要的功能,我肯定使用互斥锁,之所以介绍 Peterson 这个算法,主要是因为它比较有意思,很小巧,可以为我们带来一些“规范的”编程之外的一些想法。后台也有一些小伙伴对这个算法发表了一些留言,只要有想法都非常好,就怕不去想。其中有位朋友提到,这个算

2021-04-01 09:39:36 19

原创 C语言边角料2:用纯软件来代替Mutex互斥锁

文章目录一、前言二、Peterson 算法简介三、测试代码四、Mutex 互斥锁对代码执行效率的影响1. 单线程中:Mutex 互斥锁对代码执行效率的影响2. 多线程中:Mutex 互斥锁对代码执行效率的影响3. 在两个线程中,使用 Peterson 算法来保护临界区五、总结一、前言在 Linux 系统中,当多个线程并行执行时,如果需要访问同一个资源,那么在访问资源的地方,需要使用操作系统为我们提供的同步原语来进行保护。同步原语包括:互斥锁、条件变量、信号量等,被保护的代码称作“临界区”。这是非常正规

2021-04-01 09:38:44 12

原创 C语言边角料-01

道哥的第100篇原创文章目录一、前言二、小试牛刀1. 灵活的数组成员2. 不定参数的宏定义三、为自己打气一、前言这几天在把一个嵌入式项目的代码,移植到另一个平台,发现很多地方用的都是 C89 标准。1999 年,C语言的标准化委员会发布了 C99 标准,引入了许多特性,包括可变长度的数组、灵活的数组成员(用在结构体)、对IEEE754浮点数的改进、指定成员的初始化器、内联函数、支持不定参数个数的宏定义,在数据类型上还增加了 long long int 以及复数类型。于是最近找了一本比较新的 C.

2021-04-01 09:37:44 14

原创 Starlink星链计划能与5G抗衡?看一下马斯克吹过的牛

文章目录一、Starlink星链计划是什么?1. 卫星发射情况2. 性能测试二、5G 通信性能1. 通信速度2.通信时延3. 速度快的主要原因4. 系统容量三、Starlink 与 5G 的对比1. 覆盖范围2. 通信速度四、Starlink 的优势1. 局部地区的网络服务2. 军事服务3. 未来远景一、Starlink星链计划是什么?今年的 3.15 晚会,很多人都觉得缺少了特斯拉的一席之地,最近马斯克忙的很,又是在中国辟谣没有监控车主,又是在推特上跟网友“干架”,这么成功的商人,精力还这么充沛,真的

2021-04-01 09:36:20 258

原创 使用Jenkins + git submodule 实现自动化编译,解决代码安全性问题

道哥的第 030 篇原创文章目录一、一个真实的代码泄漏故事二、Jenkins 的基本使用1. Jenkins 是什么?2. 安装 JDK83. 安装 Jenkins4. 在浏览器中配置 Jenkins5. 在 Jenkins 中配置一个小项目6. 手动触发编译一次三、git submodule 基本使用1. git submodule 是什么?2. 利用三个小项目,来测试一下 submodule 的用法3. 在一个空目录中来编译、验证一下可行性四、在 Jenkins 中使用 git module 来编.

2021-03-18 15:42:45 26

原创 为什么航天器、导弹喜欢用单片机,而不是嵌入式系统?

道哥的第 029 篇原创文章目录一、前言二、关于单片机与嵌入式系统之间界定1. 单片机2. 嵌入式系统3. 嵌入式Linux4. RTOS三、非实时、软实时、硬实时四、x86 Linux 系统的调度策略1. 为什么 Linux 系统是软实时的?2. Linux 系统如何改成硬实时?(1)RT-Preempt(2)Xenomai五、RTOS 的优势六、总结一、前言前几天和一个在某研究所的发小聊天,他说:现在的航空、航天和导弹等武器装备中,控制系统几乎都是用单片机,而不是嵌入式系统。乍一听,和我们的.

2021-03-16 14:41:45 84

原创 都说软件架构要分层、分模块,具体应该怎么做(一)

道哥的第 027 篇原创文章目录一、软件架构设计的生命周期1. 软件开发流程2. 关于套路3. 先僵化,后优化,再固化4. 佛说:“知我说法,如筏喻者”二、需求调研和需求分析1. 功能需求2. 质量属性3. 条件约束4. 画用例图5. 写用例描述6. 确定关键需求一、软件架构设计的生命周期什么是架构?如果你问十个人,有可能得到十一种不同的答案;如果去翻一下相关的书籍,每一本都可能给出不同的定义。因此,我们没必要纠结于那些概念,只要方法对、能完成项目任务就行,不管黑猫白猫,能抓到耗子的就是好猫!.

2021-03-08 08:25:35 1814 8

原创 以我失败的职业经历:给初入职场的技术人员几个小建议

道哥的第 024 篇原创 文章目录先说声抱歉,斗胆了为什么突然想写这篇文章不管怎样,一定要考研在小公司如何混在技术上,一定要往深度钻请教别人,一定要虚心趁年轻,多吃苦既要埋头干活,也要抬头看路写在最后的话先说声抱歉,斗胆了第一次写这种非技术性的文章,感觉有点心虚啊,而且题目又似乎有点居高临下的感觉。《增广贤文》中有这么一句话:力微休重负,言轻莫劝人。我也不是成功人士,有自知之明,明白自己有几斤几两,所以万万不敢以一个很高的姿态,来对年轻人提什么建议。在这里只能用自己踩过的坑,一些失败的教训来..

2021-03-02 08:12:07 483

原创 代码安全性和健壮性:如何在if和assert中做选择?

道哥的第 023 篇原创 文章目录一、前言二、assert 断言assert 是一个宏,不是一个函数三、if VS assert1. 使用 if 语句来检查2. 使用 assert 断言来检查3. 你喜欢哪一个?4. assert 的本质5. if-else 的本质6. 我喜欢的版本五、总结一、前言我们在撸代码的时候,经常需要对代码的安全性进行检查,例如:指针是否为空?被除数是否为 0?函数调用的返回结果是否有效?打开一个文件是否成功?对这一类的边界条件进行检查的手段,一般都是..

2021-02-27 16:55:13 232

原创 物联网网关开发:基于MQTT消息总线的设计过程(下)

道哥的第 022 篇原创文章目录一、前言二、与云平台之间的 MQTT 连接三、Proc_Bridge 进程:外部和内部消息总线之间的桥接器1. mosquitto 的 API 接口2. 利用 UserData 指针,实现多个 MQTT 连接四、总结一、前言在上一篇文章中物联网网关开发:基于MQTT消息总线的设计过程(上),我们聊了在一个物联网系统的网关中,如何利用 MQTT 消息总线,在嵌入式系统内部实现多个进程之间的相互通信问题。这个通信模型的最大几个优点是:模块之间解耦合;各模块之间.

2021-02-24 08:30:52 326 1

原创 物联网网关开发:基于MQTT消息总线的设计过程(上)

道哥的第 021 篇原创文章目录一、前言二、网关的作用2.1 指令转发2.2 外网通信2.3 协议转换2.4 设备管理2.5 边沿计算(自动化控制)三、网关内部进程之间的通信3.1 网关中需要哪些进程3.2 MQTT消息总线3.3 Topic 的设计3.4 与 DBUS 总线的对比四、网关与云平台之间的通信五、总结一、前言在上一篇中,我们聊了在一个嵌入式系统中,如何利用MQTT消息总线在各进程之间进行通信,文章链接:《我最喜欢的进程之间通信方式-消息总线 》。这样的通信模型,我之前已经在多个项目.

2021-02-24 08:28:55 169 2

原创 我最喜欢的进程之间通信方式-消息总线

道哥的第 020 篇原创文章目录一、Linux 系统中的进程之间通信(IPC)二、基于 Socket 通信的优点1. 跨主机,具有伸缩性2. 操作系统会自动回收资源3. 可记录、可重现4. 跨语言三、MQTT 消息总线1. MQTT 是一个通信的机制2. MQTT 的实现3. 在 MQTT 之上,设计自己的通信协议四、嵌入式系统中如何利用 MQTT 消息总线1. 一个嵌入式系统的通信框架2. 稍微复杂一点的通信模型五、Mosquitto: 一个简单的测试代码1. 直接通过 apt 来安装、测试2. 通.

2021-02-16 14:01:07 157

原创 提高代码逼格的利器:宏定义-从入门到放弃

道哥的第 019 篇原创文章目录一、前言二、预处理器的操作1. 宏的生效环节:预处理2. 条件编译3. 平台预定义的宏三、宏扩展1. 最常见的宏2. 与函数的区别四、符号:\# 与 \#\#1. #: 字符串化2. ##:参数连接五、可变参数的处理1. 参数名的定义和使用2. 可变参数个数为零的处理六、奇思妙想的宏1. 日志功能2. 利用宏来迭代每个参数3. 动态的调用不同的函数4. 动态创建错误编码与对应的错误字符串七、总结一、前言一直以来,我都有这样一种感觉:当我学习一个新领域的知识时,如果其.

2021-02-06 22:12:53 56

原创 推荐一个阅读代码、文档的利器:屏幕贴图工具

这是道哥的第018篇原创文章目录一、你是怎么阅读 PDF 文件的?二、几种可能的方法三、屏幕贴图神器 Snipaste四、总结一、你是怎么阅读 PDF 文件的?作为已经软件开发人员,阅读代码或者 PDF文件是家常便饭的事情。假设有这样一个场景:你在看第 100 页的内容时,想回过头去看一下第 20 页的图片,你一般是如何操作?这篇文章为你推荐一个利器:Snipaste,如果你已经在使用这个非常顺手的工具软件了,下面的内容就可以不用看了,听听音乐享受人生去。二、几种可能的方法方法1用鼠标滚轮.

2021-02-04 08:28:33 53

原创 利用C语言中的setjmp和longjmp,来实现异常捕获和协程

这是道哥的第 017 篇原创文章目录一、前言二、函数语法介绍1. 最简示例2. 函数说明3. setjmp:保存上下文信息4. longjmp: 实现跳转5. setjmp:返回类型和返回值三、利用 setjmp/longjmp 实现异常捕获四、利用 setjmp/longjmp 实现协程1. 什么是协程2. 线程中的生产者和消费者3. 协程中的生产者和消费者4. C 语言中的协程实现五、总结一、前言在 C 标准库中,有两个威力很猛的函数:setjmp 和 longjmp,不知道各位小伙伴在代码中.

2021-02-02 10:55:15 48

原创 C指针的这些使用技巧,掌握后立刻提升一个Level

这是道哥的第016篇原创关注+星标公众号,不错过最新文章文章目录一、前言二、八个示例1. 开胃菜:修改主调函数中的数据2. 在被调用函数中,分配系统资源2.1 错误用法2.2 正确用法3. 传递函数指针4. 指向结构体的指针5. 函数指针数组6. 在结构体中使用柔性数组7. 通过指针来获取结构体中成员变量的偏移量8. 通过结构体中成员变量的指针,来获取该结构体的指针三、总结一、前言半个月前写的那篇关于指针最底层原理的文章,得到了很多朋友的认可(链接: C语言指针-从底层原理到花式技巧,用.

2021-01-28 22:01:55 63

原创 一个printf(结构体指针)引发的血案

这是道哥的第015篇原创关注+星标公众号,不错过最新文章文章目录一、前言1. 为什么写这篇文章2. 你能得到什么收获3. 我的测试环境3.1 操作系统3.2 编译器二、问题导入1. 网友求助代码2. 期望结果3. 实际打印结果三、分析问题的思路1. 打印内存模型2. 分开打印信息3. 一步步分析问题本质原因3.1 打印一个最简单的字符串3.2 打印一个结构体变量3.3 测试更简单的结构体变量3.4 继续打印结构体变量四、C语言中的可变参数1. 利用可变参数的三个函数示例示例1:参数类型是 i.

2021-01-25 13:05:45 103 2

原创 C语言函数传参:指针的指针

文章目录前言代码:版本1分析原因执行`char *pData = 0;`执行`do_work(pData, 128);`执行`p = (char *)malloc(size + 1);`代码:版本2执行`char *pData = 0;`执行`do_malloc(&pData, 128);`执行`*p = (char *)malloc(size + 1);`前言今天同事问了一个问题:在函数参数中传递指针的指针,很常用的一个场景,重新梳理一下记录于此,以后如果有类似的问题直接发这篇小总结就可以了。

2021-01-13 09:48:24 135

原创 关于加密、证书的那些事

这是道哥的第012篇原创<文章目录前言一个典型的物联网产品数据加密明文传输的缺点加密传输加密方式可逆加密不可逆加密公钥和私钥证书如何申请证书如何确认证书的合法性单向认证和双向认证认证机构证书链证书文件的后缀名证书文件的格式PEM格式(Privacy Enhanced Mail)DER格式(Distinguished Encoding Rules)X.509标准证书格式OpenPGP协议/标准OpenPGP是什么?OpenPGP协议的实现OpenPGP的使用流程SSL/TLS协议分层握手过程HT.

2021-01-08 12:53:41 202 2

原创 一步步教你:如何用Qemu来模拟ARM系统

这是道哥的第011篇原创文章目录前言为什么需要ARM模拟系统应用程序的开发系统开发(BSP)Qemu是什么?Qemu的两种模式Qemu 能做什么?或者说适合做什么?在 Ubuntu16.04 系统中,利用 Qemu 搭建一个ARM虚拟机使用Qemu虚拟机的几种选择测试平台安装交叉编译器编译内核kernel制作根文件系统利用Qemu启动ARM虚拟机测试HelloWorld应用程序总结软件下载地址前言前一段时间因为工作需要,我对ARM模拟器进行了一番调研。调研目的是:由于项目参与人员比较多,如果人手一.

2020-12-29 14:20:08 645 3

原创 你只用do-while来实现循环?太浪费了!

这是道哥的第010篇原创文章目录前言在宏定义中的妙用错误的宏定义比较好的宏定义另一个也不错的宏定义在函数体中的妙用函数功能:返回错误代码对应的错误字符串函数功能:通过TCP Socket连接服务器解决多个return的问题解决goto的问题总结前言这篇文章讲解的知识点很小,但是在一些编程场合中非常适用,大家可以把这篇短文当做甜品来品味一下。地球人都知道,do-while语句是C/C++中的一个循环语句,特点是:至少执行一次循环体;在循环的尾部进行结束条件的判断。其实do-while.

2020-12-22 14:21:02 98

原创 深入LUA脚本语言,让你彻底明白调试原理

这是道哥的第008篇原创一、前言上篇文章我们聊了gdb的底层调试机制,明白了gdb是利用操作系统提供的系统信号来调试目标程序的。很多朋友私下留言了,看到能帮助到大家,我心里还是很开心的,其实这也是我继续输出文章的最大动力!后面我会继续把自己在项目开发中的实战经验进行总结。由于gdb的代码相对复杂,没有办法从代码层面仔细的分析调试细节,所以这次我们选择一个小巧、开源的Lua脚本语言,深入到最底层的代码中去探究一下代码调试真正是怎么一回事。不过请放心,虽然深入到代码最底层,但是理解难度并不大,只要C语

2020-12-18 08:28:47 517

原创 【最佳实践】生产者和消费者模式中的双缓冲技术

【这篇文章说了啥】这篇文章主要介绍了在生产者-消费者模式中,生产和消费之间有大量数据需要交互时的一个高效率的解决方案。【问题引入】1. 问题场景在设计模式中,生产者-消费者模式肯定是排在前面位置的,在实际开发过程中,也常常需要使用这个模式。在讲解设计模式的书籍中,只会从抽象的角度对生产者-消费者模式进行讲解。面对实际的编程问题,还需要具体问题具体分析。这里给出一个使用场景,你可以停下来思考一下该如何解决问题:你需要实现一个日志库...

2020-12-04 10:56:41 87

原创 利用C可变参数和宏定义来实现自己的日志系统

【为啥写这篇文章】 在嵌入式应用的开发过程中,日志系统是非常重要的!特别是在生产环节出现了偶发性的、与当前的执行环境相关的bug的时候,如果没有日志系统来追踪问题,很难进行问题重现。 因此,实现一个自己的日志系统是很有帮助、很必要的。在软件模型上,一般是把日志系统编译成库文件。应用程序直接调用库中提供的API接口函数,即可记录日志信息。 那么实现自己的日志系统需要有3个问题需要处理:(1)日志API函数的设计。(2)日志信息的缓存。(3)日志信息的持久化,也就是写入到...

2020-12-02 19:51:32 45

原创 C与C++混合编程需要注意的问题

这篇文章讲解的知识点很“小”,但是在C和C++的混合编程中非常重要。因为我们在写应用程序时,经常利用到第三方的程序。如果我们的代码用C,但是第三方代码是C++;或者我们的代码用C++,而第三方的代码是C,那么在整合的时候就需要仔细一点了。一、C调用C++中的函数1. 被调用C++代码中的头文件(callee.h)2. 被调用C++代码中的源文件(callee.cpp)3. 被调用C++代码编译成目标文件(callee.o)知识点:(1)...

2020-12-01 13:19:22 104

原创 我对数据字典的理解

一、概念数据字典有两种形式1. 把主体的属性代码化放入独立的表中,不是和主体放在一起,主体中只保留属性的代码。这里属性的数量是不变的,而属性取值的数量可以是变化的。2. 用一个表来放结构相同的所有属性信息,不同属性的不同取值统一编码,用“类型”来区别不同的属性,主体中保留属性代码的列表。这样主体所拥有的属性数量就是可变的了。第二种数据字典比第一种更抽象,层级更高,也更具一般性、通用性。二、实例说明一张职员表,包括:姓名,国籍,证件,学历。国籍包括:中国,美国,日本证件包.

2020-11-19 07:40:29 86

ZWave实战入门-完全自己总结整理的基本知识

这是我自己在刚入门ZWAVE设备开发时,自己总结的文档,包括了ZWAVE最基本的知识。

2019-04-04

Stunnix-CXX-Obfus-4.7-Linux-trial.zip

这是用于C/C++源代码级别的混淆工具,不是二进制混淆。官网的下载特别特别慢,因此在这里提供一下,给需要的开发者。

2020-03-10

在虚拟机中直接使用liveCD

在练习LFS的过程中,对各种依赖的版本需求和宿主机的版本要求,相关性是很大的。这里提供一个有效的步骤去使用兼容的虚拟机,将会大大提高LFS的创建流程。

2014-07-15

ZWave 700 系列 Z-Wave Roadmap 700 Series - Asia Forum_B2B_V3.pdf

这个PDF描述了在ZWave 700系列的产品的一些基本情况,已经路线图,很有参考价值。

2019-04-03

DL-LFS开始之前.txt

在练习LFS时,很多朋友遇到一些版本兼容的问题,而且这些问题是最能打击新手的自信心的,在开始LFS之前,了解一些相关的必要知识,将会避免很多问题。

2014-07-15

Git2.25.0.1.zip

Git2.25.0.1.zip是在 windows系统中使用的版本管控工具,在我们的开发过程中大部分是使用这个工具进行代码版本的管控。但是官网下载的速度太慢,所以在这里提供一下。

2020-02-04

cmake-3.15.6-win64-x64.msi

cmake-3.15.6-win64-x64.msi 是在windows下进行开发时大部分需要的构建工具,但是官网下载的太慢太慢,所以在这里提供一下,确认可用。

2020-02-04

LFS-BOOK-6.3.pdf

非常详细、非常接底气的LFS参考资料,按照里面的提示流程走一遍,将会大大增强自己对linux操作系统的理解。

2014-07-15

iOS开发指南:从零基础到App Store上架-第一章

iOS开发指南:从零基础到App Store上架 第一章 由于权限问题,只能分开上传。

2014-09-14

iOS开发指南:从零基础到App Store上架-第2章

iOS开发指南:从零基础到App Store上架 第2章 由于全新问题,只能分开传。

2014-09-14

iOS开发指南:从零基础到App Store上架-第三章

iOS开发指南:从零基础到App Store上架 第三章 因为权限问题,所以分开上传

2014-09-14

CppPluginSample1.tgz

1. 实现原理。 因为工作需要使用C++插件的开发形式,于是调研了目前的实现方式和思路,本质上就是在一个插件管理模块,使用容器(map)存储所有注册的插件名称和构造函数。 注册的过程可以使用代码,也可以使用XML配置的方式。在应用程序需要某个插件对象的时候,直接通过传递插件的名称作为参数,从插件管理模块中获取一个创建好的插件对象。 2. 实例代码 我一共写了2个demo,这一个是按照上面的思路实现的,比较简单、基础。解压后,直接在命令行使用 make 一下就可以得到可执行文件。 另外一个demo过会再上传,本质原理是一样,但是没有使用插件管理模块,而是在每一个插件接口中,使用静态成员容器来保存实现了本接口的所有插件信息,当应用程序需要插件时,调用该插件实现的接口中的静态函数即可。

2019-09-20

优秀程序员和普通程序员都是怎样过完一天的

发表于 2016-04-04 最后回复 2020-03-04

jchen1218的留言板

发表于 2020-01-02 最后回复 2020-01-02

请教:如何检查内存使用情况?

发表于 2015-06-03 最后回复 2016-04-04

博客搬家->失败->抱歉,没有获取到任何文章。

发表于 2013-10-22 最后回复 2015-06-03

空空如也

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

TA关注的人 TA的粉丝

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