自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LinuxTaoist的博客

分享Linux驱动、C/C++开发学习经验。微信公众号"开源519",获取文章源码。

  • 博客(105)
  • 资源 (16)
  • 问答 (1)
  • 收藏
  • 关注

原创 Linux环境下的C/C++开发学习之旅

在当今软件开发领域,C和C++作为底层与系统级编程的重要语言,在Linux操作系统环境下具有极高的应用价值。在学习过程中,动手实现一些小型项目,如文件复制程序、简单的HTTP服务器、多线程并发任务调度器等,可以帮助你巩固所学知识,并对Linux环境下的C/C++开发有更深入的理解。:掌握Linux下的套接字编程,包括TCP/IP协议栈的理解,socket API的使用,以及并发服务器模型的设计。:C++引入了类、对象、继承、封装、多态等面向对象特性,这是C++区别于C的重要部分,需要深入理解和熟练运用。

2024-04-13 12:01:24 352

原创 轻松自研嵌入式日志框架,6大功能亮点一文读懂

日志框架作为一种普遍应用于软件开发领域的关键工具,已发展出众多成熟案例,诸如Android平台的logcatglogLog4cpp等。汲取这些成熟的框架的经验,本篇主要从需求分析、设计方案、实现细节和难点、测试、总结部分记录自研嵌入式框架的细节。对于项目来说,移植并使用像Android logcat这样的成熟日志框架至关重要,本文的实现正是以此为参考依据。虽然日志系统看似与实际功能模块无直接关联,但其重要性不可忽视;真正动手实现一套完善的日志系统,对个人技术水平的成长有着极大的提升。

2024-04-13 11:58:11 912

原创 开源项目约束框架

制定明确的行为准则,鼓励积极正面、尊重他人的社区氛围,处理冲突和争议的指导方针。:详细介绍从fork项目到提交PR的完整步骤,以及合并前的准备事项。:介绍新成员如何克隆项目、设置开发环境、提交第一个PR等入门流程。:明确任务认领、进度汇报、代码评审和最终验收的工作流程。

2024-04-10 10:24:16 612

原创 记一次定位fd泄漏问题

在Linux中,给每个进程分配的资源是有限制的,为的是避免某个进程把Linux资源耗尽,导致其他进程异常。同样在开发中要时刻关注这些资源是否异常。进程打开的文件数量限制(ulimit -n):限制进程能够同时打开的文件数量,可以在/etc/security/limits.conf文件中设置。进程内存使用限制(ulimit -m):限制进程在虚拟内存中使用的最大字节数,可以在/etc/security/limits.conf文件中设置。

2024-03-26 08:10:11 361

原创 Linux系统编程 - 进程异常自动重启

2024-03-26 08:06:49 944

原创 用最小堆实现通用的高效定时器组件

对于定时器容器,本篇用到了STL接口的容器,通过重载Timer运算符,实现按照时间戳(mExpired)从小到大排序。将定时器任务抽象处三个类,各自负责自己的业务,逻辑上更加清晰明了。使用一个系统定时器资源,完成所有定时任务的响应。实现基础功能的同时,降低对系统定时资源的消耗。

2024-03-24 22:19:13 610

原创 《Effective Modren C++》 进阶学习(上)

在阻止类的某些特定成员函数被外部调用时,有两种常见的方法:使用private访问修饰符将其声明为私有,或者使用delete关键字将其声明为已删除。一般情况,优先考虑deletedelete明确表示该成员函数被删除或禁止使用。C++11中实现一个空类,编译器会自动声明六个函数:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符。由于编译器会自动生成上述函数,导致即使不定义,第三方仍然可以调用编译器自动生成的这些函数,这不是期望的动作!若使用private。

2024-03-24 22:17:27 590

原创 快速上手:用二叉树实现高性能共享内存管理

使用二叉树管理共享内存优势很明显,搜索更快,封装出的共享内存接口使用也更简单。本代码还存在优化点,例如key值可以换成字符串;key属性也可以增加掉电存储、掉电不存储等属性。基于此代码,可以做一些项目上的通用功能,例如项目配置、进程间通信等功能。

2024-03-24 22:15:22 634

原创 实战高效RPC方案在嵌入式环境中的应用与揭秘

本文介绍了一种实用高效的RPC(远程过程调用)解决方案。传统的IPC机制在处理服务间的双向通信时存在挑战,比如无法很好地支持同步返回结果。于是,受Android Binder机制的启发,运用共享环形缓冲区,实现一套轻量化RPC框架。共享内存配合上数据结构,用起来还是挺高效和方便的。例如之前的《高性能共享内存》用的是二叉树和共享内存;这篇文章是环形缓冲区和共享内存。应该还有其他数据结构配合共享内存用于新的场景,等待学习。

2024-03-24 22:13:24 1042

原创 深入了解23种设计模式:程序员必读指南

为什么会有一系列设计模式的产生,而且还有23种?代码复用在软件开发过程中,经常会遇到相似的问题需要解决。

2024-03-22 07:47:01 601

原创 网络编程 - Linux socket编程

前言  socket(套接字)是网络编程编程的一种技巧。通过socket不仅可以实现跨进程通信,还可以实现跨主机的网络通信。使用这种技术,就可以实现全国各地的通讯。例如:深圳的一台电脑接收来自北京一台电脑发来的信息。  本篇不涉及太底层的网络原理,仅说明socket的基本使用方法。主要参考《Linux网络编程》。Socket的功能  socket是通过标准的UNIX文件描述符和其他的程序通...

2023-01-02 20:41:19 621 2

原创 CMake搭建编译环境总结

前言  交叉编译算是每个嵌入式开发者都会经历的一道坎吧,通俗的描述就是搭建Arm板代码编译环境,让代码能够在Arm板子上跑起来。常用到的编译工具为Makefile和CMake,本篇记录下CMake的常用技巧。入门案例:单个源文件代码路径:https://gitee.com/LinuxTaoist/DesignMode/tree/master/FactoryMode工程结构. ├── C...

2022-11-21 22:08:50 1341

原创 C/C++ 枚举转字符串

枚举转字符串[TOC]1.开篇  在代码调试时,我们经常需要直观地定位当前枚举变量为哪个枚举常量。通常通过打印枚举值就可以确定,但是当枚举常量表过多时,就不那么直观了。本篇记录一种C/C++枚举变量转字符串的实用技巧。2.实现原理  在学习C语言宏的时候,有看到 “#” 在宏(#define)中有一些特殊的用法,这里先回顾一下:#: 预处理阶段,将宏参数转化为字符串##: 预处理阶...

2022-10-23 10:34:13 2774

原创 C++ lambda表达式

lambda表达式目录一、开篇二、lambda初识三、lambda基本用法四、lambda表达式捕获列表五、总结六、参考一、开篇  lambda表达式是C++11引进的一个新特性,其写法比较新颖,经常被一些"老鸟"用到C++的日常开发中,看的"菜鸟"一脸懵逼。  初看lambda表达式,语法怪异,感觉就是用来炫技的奇技淫巧。研究一番后,发现这语法"真香"!二、lambda...

2022-09-24 20:57:10 140

原创 C++并发编程 - 原子操作

所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。 --百度百科  原子操作可以保证正在进行的动作不被打断,即一旦开始,持续结束。对比互斥锁其优势在于,原子操作在C/C++的层面,是无锁操作,其既能解决并发问题又不会导致死锁。原理  先说明一下,非原子操作。从开始执行到结束的过程中,可能会被...

2022-09-13 10:05:28 2428

原创 C++并发编程 - 同步并发操作

本文主要总结了同步并发常用的一些技巧,其中条件变量使用被广泛使用,而c++11新引进的相对来说很少被用到。

2022-08-27 19:00:15 514

原创 C++并发编程 - 线程管理

线程管理  多线程编程是开发中经常用的技术,多数情况下,我们只是知道怎么启线程、回收线程以及常规的一些用法,对于其具体技术细节以及还有哪些巧妙的用法并未挖掘。  本篇参考《C++并发编程实战》及其他优秀的博客,做一次对C++的线程管理的梳理,方便后续使用查阅。并发编程的方法  计算机领域的并发指的是在单个系统里同时执行多个独立的任务, 而非顺序的进行一些活动。通常并发方式有两种: 多进程和...

2022-08-07 21:49:58 110

原创 C++并发编程 - 互斥锁(lock_guard和unique_lock)

C++并发编程 - 互斥锁在多线程的编程中,共享数据的修改限制是必不可少的环节。期望的是:当一个线程访问共享数据期间,此数据不应该被其他线程修改;当某个线程修改了共享数据,应通知其他线程。例如,买车票场景: 座位为共享数据,每个用户属于一个访问共享数据的线程,当一个用户开始购买某个座位车票期间,该座位就应该禁止被其他用户购买。从而避免同一个座位同时被两个用户买到。通常情况下,解决类似并发问题...

2022-07-24 10:47:14 4232 2

原创 S21. 迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。C++ STL中各个容器都有迭代器的体现,通过迭代器能够顺序的访问该容器各成员。意义有利于隐藏聚合类的内部实现,外部通过迭代器来实现对聚合类的顺序访问。场景实现聚合类的一种顺序访问。注: 对于开发者来讲,基本上不会实现一套迭代器。因为现存的标准库都有提供各种容器List、Array等,都有提供迭代...

2022-05-04 14:46:39 108

原创 S20. 模板方法模式

模板方法模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。模板方法模式利用C++多态特征,在父类定义一套结构流程,其中通用部分在父类实现,子类继承父类实现差异性的接口。意义模板方法模式是比较实用的一种设计模式,将不变部分的流程和接口在父类实现,变化部分的接口预留出来交由子类实现。如此,有利于代码的复用性、可扩展性。应用...

2022-05-03 12:32:36 63

原创 S19. 访问者模式

访问者模式将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。简单的说,就是已经存在稳定的数据类。由于外部需求,需要访问特定的类成员。希望在不改变原数据类接口,仅通过增加外部模块实现需求。此模式,是行为模式中最复杂的一种模式。意义此模式主要用于在存在多个同类型的数据类情况下,统...

2022-05-02 14:15:40 98

原创 S18. 备忘录模式

备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。就是实际的回退功能,将不同时间段的各状态数据依次存储至列表。当需要回退时,从列表取出各状态值载入即可。该模式又叫快照模式。意义备忘录模式 有点类似后悔药的功能,软件回档和撤回的功能就是备忘录的体现。应用场景玩游戏时,人物的状态(等级和血量)是随时间和...

2022-05-01 10:04:09 127

原创 S17. 责任链模式

责任链模式责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。即将所有处理某种请求的对象一个接一个的排成序列,当某个任务来临时,按照次序列依次执行下去,直至有对象处理。意义责任链模式是一个很贴近生活的设计模式,使每个对象做好自己分内的事情即可。当一个请求来的时候,当前处理对象不能处理,那就交给下...

2022-04-17 18:32:12 1990

原创 S16. 代理模式

代理模式代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。在某些情况下,客户端代码不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。由代理对象向客户端提供引用原对象的接口,客户端通过调用代理对象访问原对象。意义首先要明白代理对象存在的必要性,如果不存在代理对象会...

2022-03-27 20:03:51 118

原创 S15. 享元模式

享元模式享元模式是一种结构型设计模式, 它允许你在消耗少量内存的情况下支持大量对象。简单的理解: 一个类的成员非常多,创建此对象很消耗资源,在实际场景中又需要反复创建和销毁该对象。所消耗的内存,就更加庞大。如果此时设计一个对象池,里面缓存一定的对象,软件在用时申请,不用时回收。就能实现对象的重复利用,而多次创建和销毁对象。意义从上述的解释可以总结出,享元模式主要在资源有限的情况下,对...

2022-03-20 15:22:10 113

原创 S14. 适配器模式

适配器模式适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的接口一起工作。意义在于将某些功能与第三方需求接口适配对接,且避免第三方接口与功能代码过多耦合。在设计初初,不要考虑使用此模式。仅在功能完善,需要实现第三方接口时,没必要迎合第三方的需求对原来的设计大动刀戈,可以尝试使用适配器模式。多用...

2022-03-19 10:18:50 133

原创 S13. 外观模式

外观模式外观模式又叫门面模式,是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。外观模式的作用主要是封装一套一致对外的接口,具体实现由多个独立模块函数协作完成。如此一来,客户端需要实现一个复杂的功能时,无需关注具体的实现,只需要调用一个接口即可。意义外观模式非常适用于解决客户端业务逻辑代码与第三方类代码的耦合问题。Android HalAndroid...

2022-03-06 19:54:33 126

原创 S12. 中介者模式

中介者模式用一个中介对象来封装一系列对象的交互,从而把一批原来可能是交互关系复杂的对象转换成一组松散耦合的中间对象,以有利于维护和修改。 --百度百科中介者模式是将多对多的交互关系转化为一对多。软件中设计一个中介对象专门管理交互逻辑,如此一来便能够将各个对象间错综复杂的耦合统一到与中介对象耦合。适用中介者模式的场景当多个组件或对象互相依赖,动一发而牵全身。该模式能够使各个组件相互独...

2022-02-16 18:31:52 229

原创 S11 组合模式

组合模式组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。 -- 百度百科组合模式能够体现各个对象之间的层次关系,将所有对象设计为同一种类型,从而忽略组合与个体的差异,统一管理起来。意义组合模式将所有的对象统一管理,并按照树形排列起来。用户能够按照结构顺序来查询指定位置的对象属性。应用场景公司的结构顺序。公司存在多个部门,部门内又存在多个小组,小组内存在多个成...

2022-01-23 21:54:35 151

原创 S10. 装饰模式

装饰模式装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 --百度百科装饰者模式主要是为一个对象增加新的行为,效果与子类扩展父类类似,但实现方式与继承不同,且更加灵活。装饰模式类图装饰模式Componet: 定义接口基类。ConcreteComponent: 具体被装饰的目标对象。Dec...

2022-01-16 15:28:06 123

原创 S9. 策略模式

策略模式策略模式定义多种处理同一种场景的不同算法,这些算法可在不影响用户的情况下互相替换。场景应用场景某会员制商场有两种级别会员:银卡会员、黄金会员,分别享有9折、8折购物优惠。同时不同的会员用户在生日当天购物,会赠送不同的生日礼物。分析场景比较简单,需要解决的问题是区分不同类型的顾客享有不同的权益(折扣和生日礼物)。按照平常的编码习惯,通常会在需要区分用户等级的业务上加上if判断,...

2022-01-09 19:43:24 177

原创 S8.命令模式

命令模式命令模式是一种行为模式,用于将请求或频繁调用关系管理起来,封装成对象行为。意义在平常的设计中,对于不同模块之间调用关系,通常通过头文件直接调用接口即可。随着需求的增多,调用越来越多。最终维护起来会发现如下问题:代码裁剪时任务量大。由于调用过多,且调用关系散落各处,导致裁剪代码时,不敢轻易下手。各个组件关系复杂。在实际的编程中,经常会遇到一些“特殊”场景,需要特殊处理(组件之间调...

2022-01-03 20:47:07 416

原创 S7.状态模式

状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 --百度百科简单地说,状态模式就是状态机设计。其主要用于同一个请求,不同条件下执行不...

2021-12-26 16:22:23 240

原创 S6.观察者模式

观察者模式观察者模式是一种行为设计模式,主要用于实现一种订阅机制,可在目标事件发生变化时告知所有观察此事件的对象,使观察者做出对应的动作。通常是通过调用各观察者所提供的方法来实现。UML类图image观察者模式CObserver类,为观察者抽象类,为具体观察者定义标准接口:Update() 用于更新自身行为,由具体主题调用。GetName用于获取定义的字符,用于标识各个对...

2021-12-21 19:12:14 178

原创 S5. 桥接模式

桥接模式桥接是一种结构型设计模式,可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。简单的理解,就是将抽象部分与实现部分分离,实现解耦。场景实现Honor30Pro与Mate40手机的微信与王者荣耀APP。分析遇到此类场景时,通常我们会抽象出手机类,然后在不同的手机上实现客制化的APP(假设不同的手机品牌安装同一款APP会有一些参数差异)。如果将手机抽象,可以得...

2021-12-06 19:28:59 1865

原创 Ubuntu报错 Error in the certificate verification

记录一下Ubuntu更新包报错解决方法问题Ubuntu执行apt-get update报错如下:解决办法将/etc/apt/sources.list 中https更换为http即可。亲测有效!# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse# deb-src https://mir

2021-12-04 15:18:33 1071

原创 UML中类与类间的关系及实现

UML中类与类间的关系及实现在面向对象的程序设计中,类之间主要有六种关系:继承, 组合, 聚合,关联, 依赖,实现。C属于面向过程语言,本身的语法不支持这些关系的实现,但可通过结构体和指针来实现这些关系。C++/Java/Python等语言原生支持面向对象的程序设计,可通过其语法来完成这些关系。此次结合UML与C++来掌握这些关系的实现与运用。继承(Generalization)继承是面向对...

2021-11-25 11:06:54 887

原创 S4. 单例模式

单例模式(Singleton)介绍单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个实例,并提供获取该实例的接口供客户端使用。(即创建对象禁止使用new,而是通过类的接口返回一个已经存在的对象。当强行new操作时,编译报错)单例模式的实现较为简单,部分专家并不认为其是一种设计,而是一种编程技巧。意义既然存在单例模式,那么其存在的意义是什么呢?又或者说能解决什么问...

2021-11-24 22:57:44 269

原创 S3. 设计模式 原型模式

C++设计模式 原型模式原型模式(Prototype)原型模式是一种创建型设计模式,其功能为复制一个运行时的对象,包括对象各个成员当前的值。而代码又能保持独立性。场景举例假设这样一个场景,孙悟空出世,在花果山经历与猴孙的生死离别后,拜菩提老祖为师。历经多年,学的一身本领。此时的悟空拔出一个毫毛,变出一个自己。分析此时悟空变出的另一个自己,自然要与现在的年龄、身高、体重等多个参数一致。...

2021-11-14 17:46:22 141

原创 S2. 设计模式 生成器

生成器模式生成器模式属于创建型设计模式,根据需要分步创建功能较多的对象。场景问题假设要生产两款不同品牌的笔记本ThinkPad X 13和MateBook X Pro,笔记本的参数包括重量、内存、硬盘和CPU,且同一型号的笔记本参数会存在差异。满足开闭原则的基础下,设计此场景。分析此场景主要的对象为两款笔记本,其中内部包含各种参数。因此要构建具体的实例,需要初始化时,对内部成员一一进行...

2021-10-24 18:09:36 122

C++工厂模式源码及文档说明

C++简单工厂模式、工厂方法和抽象工厂模式源码,亲测可用。

2021-10-18

dx_driver_test.zip

在写完安卓驱动后,为了方便测试其驱动的功能,可以像linux一样写一个C的测试文件,然后编译成可执行文件push到机器中执行。

2019-12-25

singlelist.c

本人自己写的单链表基本操作,包括增删改查等拓展功能。gcc编译器可过,其他编译器没有试过,代码易懂可借鉴。

2019-11-14

stm32虚拟串口实现

由stm32CubeMX生成代码工程,基于stm32f302单片机实现usb虚拟串口的功能。单片机可与PC通过USB直接通信。

2019-07-16

EEPROM、EPROM、FLASH、SRAM、DRAM、SDRAM的区别

单片机常用的内存EEPROM、EPROM、FLASH、SRAM、DRAM、SDRAM的区别。单片机必学。

2019-04-03

stm32f030c8t6 ADC_DMA采集电压

基于STM32F030的ADC电压采集程序,通过推算系数与实际比较,充分开发stm32功能开发了最大程度减小误差的程序,最新技术采集。

2019-01-16

stm32f103串口空闲中断收发

为了解决stm32f103串口一次接收不定长度且没有结束标志的数据,选择空闲中断接收。经过修改,目前收发稳定,仅供参考。

2018-12-20

stm32f030c8t6串口空闲中断

主控stm32f030c8t6芯片,采用stm32CubeMX软件生成代码,由于没有串口空闲中断接收,经过编程已加上了这个功能,供嵌入式同行借鉴使用。

2018-12-19

stm32+Modbus从机读取

Modbus协议从机上传数据,主机发送Modbus指令给从机,从机上传。亲测可用!stm32单片机。

2018-07-14

dnw驱动linux

基于JZ2440的win7 64位dnw驱动。打开dnw软件检测到硬件更新此驱动。。

2018-06-30

stm32f103+esp8266

本例程实现了stm32f103配置esp8266成功连接已存在热点,并能够实现与服务器的通信。

2018-05-25

红外无线抢答器

STC89C51单片机开发的基于红外抢答器。解码分析锁定抢答选手。

2018-05-13

串口屏动态实时显示时间

stm32F103开启内部RTC功能,将时间实时上传串口屏实现机屏同步功能。。。。主要是串口通讯,将单片机数据实时刷到串口。

2018-05-13

SIM808连接外网服务器

stm32F103驱动SIM808,通过串口5发送指令成功实现了GPRS连接外网服务器,并成功发送数据。主要TCP透传协议。效率不太高,但是能够连接上,有借鉴意义。

2018-05-13

万能红外学习代码 单片机

51单片机红外学习代码,能学习美的格力空调并解码存储至EEProm中实现掉电存储功能。由于下载太多,导致积分过高。积分重新调到5。

2017-11-24

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

TA关注的人

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