- 博客(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
原创 用最小堆实现通用的高效定时器组件
对于定时器容器,本篇用到了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
原创 网络编程 - 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++并发编程实战》及其他优秀的博客,做一次对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
EEPROM、EPROM、FLASH、SRAM、DRAM、SDRAM的区别
2019-04-03
stm32f030c8t6 ADC_DMA采集电压
2019-01-16
stm32f030c8t6串口空闲中断
2018-12-19
SIM808连接外网服务器
2018-05-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人