IOT物联网小镇

其他

Linux驱动实践:带你一步一步编译内核驱动程序

的驱动框架,只要把驱动两个函数地址注册进去即可。module_init(hello_init);module_exit(hello_exit);有两个小地方注意一下:在内核中,打印函数是
2021年11月12日
其他

Linux系统中编译、链接的基石-ELF文件:扒开它的层层外衣,从字节码的粒度来探索

这个字符串(\0是字符串的分隔符)?!好了,如果看到这里,你全部都能看懂,那么关于字符串表这部分的内容,说明你已经完全理解了,给你一百个赞!!!读取代码段的内容从下面的这张图(指令:readelf
2021年5月25日
其他

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

r等等)。我们可以指定使用哪个寄存器,也可以交给编译器来选择使用哪些寄存器,通过寄存器来操作数据,速度会更快一些。如果我们愿意的话,也可以直接使用变量的内存地址来操作变量,此时就需要使用约束字符
2021年4月27日
其他

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

channel_;};Step3:服务端程序实现接口中定义的方法,提供服务;客户端调用接口函数,调用远程的服务。请关注上图中的绿色部分。(1)服务端:EchoServiceEchoService
2021年4月21日
其他

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

RTOS,主要利用的就是任务调度,实现真正的硬实时。这方面最牛逼的就是VxWorks了,当然价格也是非常可观的,有些公司购买之后,甚至会把除了任务调度模块之外的其他模块全部重写一遍,这也足以证明了
2021年3月16日
其他

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

主题。如果用类图来分析,对于面向对象的开发语言来说,可能会更容易理解,比如:可以明确的定义出每一个对象的属性,私有函数,共有函数,并且能够清晰的构建出对象之间的关系。2.
2021年3月11日
其他

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

不是特指人,是指系统以外的,在使用系统或与系统交互中所扮演的角色。用例:是对包括变量在内的一组动作序列的描述,系统执行这些动作,并产生传递特定参与者的价值的可观察结果。系统边界:
2021年3月6日
其他

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

篇原创先说声抱歉,斗胆了为什么突然想写这篇文章不管怎样,一定要考研在小公司如何混在技术上,一定要往深度钻请教别人,一定要虚心趁年轻,多吃苦既要埋头干活,也要抬头看路写在最后的话先说声抱歉,斗胆了
2021年2月28日
其他

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

内核中的驱动开发和定时器,都是这个套路,一通百通!在网关中的每个进程,只需要添加上面这部分代码,就可以挂载到消息总线上,从而可以与其它进程进行收发数据了。2.
2021年2月24日
其他

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

查找自己的配置信息(假设用户已经提前配置好了一条规则:当门磁打开的时候,就触发声光报警器),发现匹配到了“门磁->报警器”这条规则,于是发出一条控制报警器的指令,发送到消息总线上的
2021年2月21日
其他

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

协议,包括:C/C++、Java、Python、C#、JavaScript、Go、Objective-C等等。那么对于嵌入式开发来说,使用比较多的是这几个实现:Mosquitto;Paho
2021年2月14日
其他

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

FALSE#endif在数据类型定义中,需要注意的一点是:如果你的程序需要用不同平台下的编译器来编译,那么你要去查一下所使用的编译器对这些宏定义控制的数据类型是否已经定义了。例如:在
2021年2月6日
其他

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

0;}代码就不需要详细说明了,直接看代码中的注释即可明白。这个代码仅仅是示意性的,在生产代码中肯定需要更完善的包装才能使用。有一点需要注意:setjmp/longjmp
2021年1月31日
自由知乎 自由微博
其他

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

结构体指针C语言中的基本数据类型是预定义的,结构体是用户定义的,在指针的使用上可以进行类比,唯一有区别的就是在结构体指针中,需要使用->箭头操作符来获取结构体中的成员变量,例如:typedef
2021年1月17日
其他

关于加密、证书的那些事

V3标准化之后的产物。事实上现在用的都是TLS,但是大家都习惯了SSL这个称呼。协议分层SSL协议最大的优点就是与应用层无关,在SSL协议的上层,可以运行一些高层应用协议,例如:HTTP,
2021年1月8日
其他

一步步分析-C语言如何面向对象编程

这是道哥的第009篇原创一、前言在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向对象的编程方式。虽然C++语言是从C语言发展而来的,但是今天的C++已经不是当年的C语言的扩展了,从2011版本开始,更像是一门全新的语言。那么没有想过,当初为什么要扩展出C++?C语言有什么样的缺点导致C++的产生?C++在这几个问题上的解决的确很好,但是随着语言标准的逐步扩充,C++语言的学习难度也逐渐加大。没有开发过几个项目,都不好意思说自己学会了C++,那些左值、右值、模板、模板参数、可变模板参数等等一堆的概念,真的不是使用2,3年就可以熟练掌握的。但是,C语言也有很多的优点:其实最后一个优点是最重要的:使用的人越多,生命力就越强。就像现在的社会一样,不是优者生存,而是适者生存。这篇文章,我们就来聊聊如何在C语言中利用面向对象的思想来编程。也许你在项目中用不到,但是也强烈建议你看一下,因为我之前在跳槽的时候就两次被问到这个问题。二、什么是面向对象编程有这么一个公式:程序=数据结构+算法。C语言中一般使用面向过程编程,就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步调用,在函数中对数据结构进行处理(执行算法),也就是说数据结构和算法是分开的。C++语言把数据和算法封装在一起,形成一个整体,无论是对它的属性进行操作、还是对它的行为进行调用,都是通过一个对象来执行,这就是面向对象编程思想。如果用C语言来模拟这样的编程方式,需要解决3个问题:数据的封装继承多态第一个问题:封装封装描述的是数据的组织形式,就是把属于一个对象的所有属性(数据)组织在一起,C语言中的结构体类型天生就支持这一点。第二个问题:继承继承描述的是对象之间的关系,子类通过继承父类,自动拥有父类中的属性和行为(也就是方法)。这个问题只要理解了C语言的内存模型,也不是问题,只要在子类结构体中的第一个成员变量的位置放置一个父类结构体变量,那么子类对象就继承了父类中的属性。另外补充一点:学习任何一种语言,一定要理解内存模型!第三个问题:多态按字面理解,多态就是“多种状态”,描述的是一种动态的行为。在C++中,只有通过基类引用或者指针,去调用虚函数的时候才发生多态,也就是说多态是发生在运行期间的,C++内部通过一个虚表来实现多态。那么在C语言中,我们也可以按照这个思路来实现。如果一门语言只支持类,而不支持多态,只能说它是基于对象的,而不是面向对象的。既然思路上没有问题,那么我们就来简单的实现一个。三、先实现一个父类,解决封装的问题Animal.h#ifndef
2020年12月20日
其他

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

这是道哥的第008篇原创一、前言上篇文章我们聊了gdb的底层调试机制,明白了gdb是利用操作系统提供的系统信号来调试目标程序的。很多朋友私下留言了,看到能帮助到大家,我心里还是很开心的,其实这也是我继续输出文章的最大动力!后面我会继续把自己在项目开发中的实战经验进行总结。由于gdb的代码相对复杂,没有办法从代码层面仔细的分析调试细节,所以这次我们选择一个小巧、开源的Lua脚本语言,深入到最底层的代码中去探究一下代码调试真正是怎么一回事。不过请放心,虽然深入到代码最底层,但是理解难度并不大,只要C语言掌握的没问题,其他就都不是问题。另外,这篇文章重点不是介绍代码,而是介绍实现一个调试器应该如何思考,解决问题的思路是什么。通过阅读这篇文章,能有什么收获?如果你使用过Lua语言,那么你能够从源代码级别了解到调试库的代码逻辑。如果你对Lua不了解,可以从设计思想、实现架构上学习到一门编程语言是如何进行调试程序的。二、Lua
2020年12月17日
其他

用图文带你彻底弄懂GDB调试原理

铺垫了半天,终于轮到主角登场了,那就是系统调用函数ptrace(其中的参数后面会解释),正是在它的帮助下,gdb才拥有了强大的调试能力。函数原型是:
2020年12月13日
其他

C_C++_静态库_动态库的制作和使用

这篇文章主要是视频教程的辅助文档,把其中的一些重要的内容放在这里,强化一下印象,更好的理解教程内容。为什么要写这个教程?这个应用模型是我们在开发过程中经常使用的,例如:作为一名资深程序员,你需要为公司的应用开发工程师提供一个轮子:modbus通讯库。通过阅读modus协议之后,你可以手动实现这个库,你也可以在一些第三方的开源软件(比如:libmodbus)的基础上进行简单的修改,更快速的搞定工作。如果你选择了后面这种做法,在libmodus库的外面再包裹一层你定义的API函数就可以输出以你的名字命名的库libNB.so,然后提供给应用开发人员。但是在你的libNB.so中一定要静态链接libmodbus库,这样就只需要提供一个libNB.so就可以了(.h头文件当然是必须的),应用开发人员就会惊叹:大牛就是大牛,这么快就搞定了!相反地,如果你动态链接libmodbus库,这样你就得提供2个文件给应用开发人员:libmodbus.so和libNB.so,这样就暴露了你偷懒的高尚品德。这个教程就是来演示这个编译和链接过程。当然,也顺带着介绍一些make+Makefile,
2020年12月4日
其他

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

对于这样的需求,生产者(日志的产生)和消费者(把日志写入文件)速度不匹配,显然应该使用不同的线程来执行。此时,你是不是立刻想到使用消息队列来进行数据缓冲,不就解决了这个速度不匹配的问题?也就是这样:
2020年12月3日
其他

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

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

C与C++混合编程

这篇文章讲解的知识点很“小”,但是在C和C++的混合编程中非常重要。因为我们在写应用程序时,经常利用到第三方的程序。如果我们的代码用C,但是第三方代码是C++;或者我们的代码用C++,而第三方的代码是C,那么在整合的时候就需要仔细一点了。一、C调用C++中的函数1.
2020年12月1日
其他

拿来即用:用C+JS结构来处理JSON数据

当C代码中需要对JSON格式的字符串进行处理时,把JSON数据通过栈结构传给JS程序,在JS程序中处理数据之后,把处理结果再返回给C程序中。
2020年6月26日
其他

拿来即用:分享一个检查内存泄漏的小工具

在集成测试时发现系统资源存在持续减少的情况,而且找不到规律。因为各进程之间的交互比较多,也许只是在触发了某些特定的执行逻辑时,才可能发生内存泄漏等情况。
2020年6月16日