- 博客(148)
- 收藏
- 关注
原创 C++中的原子操作,自旋锁
本文介绍了C++11原子操作和自旋锁的关键概念及应用。主要内容包括:1. 原子操作:通过std::atomic实现线程安全的变量操作,详细介绍了load/store、fetch_add/fetch_sub、exchange和compare_exchange_strong等核心方法,并与互斥锁进行性能对比。2. 自旋锁:阐述了自旋锁的工作原理(忙等待)及其适用场景(锁持有时间短),分析了其避免上下文切换的优势和可能浪费CPU的缺点。3. 实践示例:展示了如何使用C++11原子操作构建自旋锁,重点解析了std:
2025-08-20 18:11:54
936
原创 C++11中的互斥锁,条件变量,生产者-消费者示例
本文介绍了C++11中的互斥锁和条件变量机制。主要内容包括:1. 互斥锁的RAII封装类(lock_guard和unique_lock)及其自动管理功能,避免手动加解锁带来的死锁风险。2. 条件变量的作用原理,重点讲解了wait()函数的两种形式及其防虚假唤醒机制。3. 生产者-消费者模型的完整实现示例,展示了互斥锁与条件变量的协同工作流程。4. 详细分析了线程执行过程中获取锁、检查条件、等待通知和业务处理的时序关系。这些机制共同构成了C++多线程编程中安全高效的同步解决方案。
2025-08-20 13:22:19
1049
原创 c++中的auto自动类型推导
本文介绍了C++中auto关键字的基本用法和典型应用场景。auto通过自动类型推导简化代码,特别适用于处理复杂类型、迭代器和lambda表达式。主要内容包括:基本用法规则、类型推导机制(会忽略顶层const和引用)、函数返回类型推导等。重点展示了auto在简化STL迭代器类型、存储lambda表达式和范围for循环中的实际应用优势,同时指出了使用限制和注意事项(如必须初始化、不能用于函数参数等)。文章强调auto是现代C++编程的重要工具,能提升代码简洁性和可维护性,但应避免过度使用导致可读性降低。
2025-08-18 17:32:44
830
原创 深入理解c++中.h/.cpp文件,extern关键字,typedef,using关键字
源文件是代码的“具体实现”。它包含了所有在头文件中声明的实体所对应的完整定义。源文件中应该包含什么?头文件的包含:#include "my_header.h",以获取所有声明。函数的完整定义类成员函数的完整实现全局变量的定义(这是该变量唯一被分配内存的地方)为什么要这么做?每个 .cpp 文件都被编译器单独编译成一个目标文件(.o 或 .obj)。这些目标文件包含了实际的机器码。
2025-08-18 11:07:48
847
原创 c++中右值引用,移动语义详解
这是最基础的概念,要能区分 int a = 5;中的 a(左值)和 5(右值)。右值引用和移动语义确实属于那种“大多数时候你都在用,但并不知道自己在用”的特性。学习目标: 能够区分左值和右值,并且知道 int&& 这种类型是用来干什么的。右值引用的作用: 它最核心的作用是绑定到右值,并且能够延长右值的生命周期。右值引用的语法: 学习 int&& 这样的声明方式。右值引用 是 C++ 语法层面的一个新类型。移动语义 是基于右值引用实现的优化策略。
2025-08-16 01:04:25
704
原创 c++中的Lambda表达式详解
摘要: C++11引入的Lambda表达式是一种匿名函数对象,极大简化了代码编写。其语法为捕获列表->返回类型{函数体},其中捕获列表决定对外部变量的访问方式(值捕获、引用捕获等)。Lambda广泛应用于STL算法(如sort、for_each)、异步编程(std::thread)、回调函数等场景,提升代码局部性和可读性。返回值可通过显式声明或编译器自动推导处理。Lambda支持赋值给变量(推荐auto或std::function),便于复用和传递,同时避免命名污染。结合捕获能力与函数式特性,Lamb
2025-08-14 23:28:56
1368
原创 C++中的回调函数
简单来说,回调函数就是被传递给另一个函数作为参数的函数。这个“另一个函数”会在适当的时候调用(或“回调”)它。当一个事件发生时(如点击按钮),系统会调用你预先注册好的回调函数来处理这个事件。当一个耗时的操作(如文件读写、网络请求)完成后,主程序可以调用回调函数来处理结果,而不用一直等待。允许库或框架的使用者自定义某些行为,而不需要修改库本身的源代码。例如,STL中的std::sort函数可以接受一个自定义的比较函数作为回调,从而实现不同的排序逻辑。
2025-08-14 11:57:11
978
原创 c++实现一个静态线程池(结合epoll)
本文介绍了C++中线程池的实现与应用,主要内容包括:1. std::function的基础使用:作为通用函数封装器,可存储函数、lambda表达式等,实现类型擦除和统一接口; 2. 线程池原理:通过复用线程降低资源开销,包含任务队列、线程集合和同步机制等核心组件; 3. 静态线程池实现:使用std::thread、std::mutex和std::condition_variable构建,支持任务提交和线程管理; 4. Epoll服务器集成:将网络事件处理任务提交给线程池,实现I/O与业务逻辑分离;
2025-08-12 21:47:37
767
原创 bufferevent,evconnlistener详细介绍,libevent使用示例
是 Libevent 提供的一个高级封装,它将网络编程中的套接字(socket)读写操作与两个内部缓冲区(一个输入缓冲区,一个输出缓冲区)自动绑定。:其主要目的就是为了简化网络编程,让开发者从繁琐的底层event事件管理、手动缓冲区分配、以及处理复杂的网络 I/O 逻辑中解脱出来。
2025-08-06 22:31:32
606
原创 libevent基础介绍,event_base详解
ubuntu中安装libevent步骤:1. 更新软件库:sudo apt-get update2. 安装libevent库:sudo apt-get install libevent-dev (这个命令会自动安装libevent的运行时库及其依赖项)安装完成后,你可以通过检查libevent库的版本来验证它是否成功安装。
2025-08-04 21:44:20
642
原创 注册c++类/实例——>QML
本文介绍了QML与C++交互的核心方法,主要包括三个步骤:1)编写继承QObject的C++类,通过宏定义暴露属性、方法、信号和枚举;2)将C++类注册到QML引擎,可选择单例模式(setContextProperty)或可复用类型(qmlRegisterType);3)在QML中直接使用注册的C++对象或类型。文章详细讲解了嵌套子对象的处理方式,以及如何在QML中访问C++属性和方法。这种交互方式充分发挥了QML界面开发的高效性和C++处理复杂逻辑的优势,是Qt混合开发的核心技术。
2025-08-04 14:46:35
546
原创 Linux中的epoll详细介绍
select 是最早出现也是最通用的 I/O 多路复用机制,几乎所有操作系统都支持它。工作原理你提供三组文件描述符集合(一个用于读事件,一个用于写事件,一个用于异常事件)。select 会阻塞等待,直到这些集合中的任何一个文件描述符准备好进行 I/O 操作(比如有数据可读、可写或者发生错误)。当 select 返回时,它会修改这三个集合,只留下那些已经就绪的文件描述符。你需要遍历所有文件描述符,才能知道具体是哪些就绪了。优点可移植性好:几乎所有 Unix-like 系统都支持。
2025-07-19 20:47:27
1152
原创 I/O 多路复用select,poll
select 是最早出现也是最通用的 I/O 多路复用机制,几乎所有操作系统都支持它。工作原理你提供三组文件描述符集合(一个用于读事件,一个用于写事件,一个用于异常事件)。select 会阻塞等待,直到这些集合中的任何一个文件描述符准备好进行 I/O 操作(比如有数据可读、可写或者发生错误)。当 select 返回时,它会修改这三个集合,只留下那些已经就绪的文件描述符。你需要遍历所有文件描述符,才能知道具体是哪些就绪了。优点可移植性好:几乎所有 Unix-like 系统都支持。
2025-07-19 11:54:13
1040
原创 FreeRTOS中的信号量和互斥锁
虽然0-1信号量主要用于同步操作,但是通过其特定的操作机制,也能让0-1信号量实现对共享资源的互斥访问。0-1信号量如何实现互斥访问?0-1信号量的核心在于它的值只能是0或1,这使得它能够充当一个“门票”或者“令牌”的角色,控制对共享资源的访问。在系统启动或资源首次可用时,将0-1信号量的值初始化为。wait()down()当一个进程或线程想要访问共享资源时,它会执行0-1信号量的(也称为wait()或down()P操作会成功执行,将信号量的值,并允许该进程/线程进入临界区(即访问共享资源)。
2025-07-11 11:59:23
686
原创 FreeRTOS中的消息队列介绍&常见API函数
本文介绍了FreeRTOS消息队列的基本概念和使用方法。消息队列是一种遵循FIFO原则的异步通信机制,允许任务间安全传递固定大小的数据。文章详细讲解了创建队列(xQueueCreate)、发送数据(xQueueSend)、接收数据(xQueueReceive)等核心API的使用,并通过LED控制示例展示了生产者和消费者模式的实际应用。特别强调了队列长度设计、阻塞超时设置和数据完整性等关键注意事项,为嵌入式系统开发中的任务间通信提供了实用指导。
2025-07-11 00:57:49
906
原创 FreeRTOS中任务状态的转换,任务挂起,任务删除
任务创建的时候默认优先级是22,这里需要再额外介绍一下各种任务的优先级的相关知识。介绍一下这个杀死任务的函数时如何实现的(主要是了解一下,可以帮我们来更好的进行)其实时不能自杀的,自杀就是将当前的这个任务放置到了我们的杀死的任务队列中来。任务函数中不能直接return,要想销毁的话必须手动调用一个函数,通过空闲任务来杀死这个任务的pcb,这个空闲任务的优先级是0。任务转换图(这个是重点,面试的时候经常问)空闲任务就是在检查这些任务列表。剑哥说这里面这段描述非常重要。任务创建时候的结构体。
2025-07-08 23:58:15
949
原创 FreeRTOS介绍,创建一个任务,osThreadAttr_t结构体,os_Delay()
RTOS(Real Time OS)即实时操作系统,根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度、异常处理等工作。在RTOS支持的系统中,每个任务均有一个优先级(类似前面章节的中断抢占优先级),RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。
2025-07-08 09:25:26
791
原创 ESP8266详解
ESP8266 是一个非常强大的 WIFI 模块,可以利用串口与单片机进行通讯,从而编程实现控制 ESP8266。利用 ESP8266 可以访问一些 API,获取天气信息或者完成网络授时,也可以连接云平台进行开发。不过因为是串口传输,速度较慢,不能用来传输图像、视频这些大容量的数据但是传些传感器数据还是绰绰有余的。这是 ESP8266 最核心的卖点。它内置了完整的 TCP/IP 协议栈,可以直接连接到 Wi-Fi 网络,而无需额外的 Wi-Fi 模块,这大大简化了物联网设备的开发和成本。
2025-07-05 00:38:33
939
原创 BH1750光照传感器详解
BH1750使用过程注意:在使用过程中需要注意一些问题:1.发送测量指令后不能马上去读数据,需要等待一定的时间让芯片测量数据,确保证数据正确和稳定;2.取得16位数据后,需要对数据进行合并,然后根据手册的公式得到最终的数据即为实际的光照值。
2025-07-02 20:44:05
723
原创 OLED0.96屏幕的使用
0.96寸的OLED屏幕通常使用的是 SSD1306 或类似的显示驱动芯片。SSD1306芯片有一套固定的命令集(Command Set),这些命令都有预定义的格式和功能,这些命令的详细定义都可以在SSD1306的数据手册(Datasheet)中找到。SSD1306 芯片的命令分类:基本控制命令:开关显示,设置对比度,正常/反相显示(黑变白,白变黑)等寻址设置命令:设置内存寻址模式 :页寻址模式/页寻址模式/页寻址模式,设置页开始/结束地址,设置列开始/结束地址等等。
2025-07-01 16:26:07
653
原创 I2C协议
I2C 只使用两条双向线进行通信,分别是串行数据线和串行时钟线。这大大简化了硬件连接,节省了引脚。数据在同一时间只能在一个方向上传输。I2C 总线上可以连接多个主设备和多个从设备。任何一个主设备都可以发起数据传输,但总线上同时只能有一个主设备处于活动状态。SDA 和 SCL 线对应的引脚都采用开漏(Open-Drain)输出结构,这意味着它们不能主动输出高电平,需要通过外部上拉电阻来实现高电平。这使得多个设备可以连接到同一条总线上,并通过线与(wired-AND)的方式实现通信。
2025-06-30 20:53:57
675
原创 串行通信接口USART,printf重定向数据发送,轮询和中断实现串口数据接收
配置好时钟源之后,选择USART1之后选择模式为异步模式就可以了,剩下的配置不需要动。选完之后我们会发现这里多了两个选中的引脚,TX(发送)RX(接收)。如果选择同步通信方式的话还会有一根时钟线用于同步操作。在USART协议中我们其实是可以选择使用同步方式(synchronous)或者异步方式(Asynchronous)进行数据的发送和接收的 ,不过一般异步方式用的多,同步方式通信一般会选择其他类型协议如 SPI、I²C。
2025-06-29 17:09:36
891
原创 STM32中定时器配置,HAL_Delay的原理,滴答定时器,微秒延时实现,PWM,呼吸灯
关于定时器的话,配置的时候主要需要配置定时器的预分频值,计数周期计数模式,然后就是何种方式启动定时器。
2025-06-28 13:48:28
1039
原创 QT下的TCP网络编程介绍,QTcpServer,QTcpSocket
在 Windows 和 Linux 系统中,原生的网络通信接口都是C 语言风格的 API (Application Programming Interface),例如 Windows 上的 Winsock API(socket(), connect(), send(), recv() 等)和 Linux/Unix 上的 Berkeley Sockets API(也是 socket(), connect(), send(), recv() 等)。
2025-06-18 11:43:40
600
原创 QML介绍,QML中的属性赋值
这里的width和height的值是固定的,除非你在后续的代码中显式地改变它们,否则它们不会自动更新。它们没有“绑定”到任何其他属性。
2025-06-18 10:39:03
1055
原创 stm32中的外部中断
MX种配置了相关的中断之后,在stm32f4xx_it.c这个文件中会生成对应的中断线对应的ISR定义,这个ISR名字是固定的,和中断向量表中的名字一样,固定的ISR名字在启动文件startup_stm32f411xe.s中可以看到,注意并不是所有的中断线对应的ISR是不同的,比如5-9对应的ISR就是不同的,归根到底是因为不同的GPIO并不是有独立的中断线,比如A0,B0,C0……对应的是一跟独立的线EXTI0,但是。一起对应了一根中断线,所以这些调用的ISR是同一个。
2025-06-18 00:46:48
712
原创 关于按键检测设计思路,按键消抖,短按长按,中断的时机
/同理2,3,4,如果没有任何按键按下,就返回0。这样就只需要调用这个按键扫描函数进行持续扫描,就可以实时返回哪个按键被按下了,检测按键按下对应的消抖逻辑封装在函数内部进行具体实现。由短按检测引出长按检测,然后通过长按检测再引出关于不断检测的时候cpu占用率和对中断的相应及时性,问一下为什么及时性会变差。再来解释一下linux中的软件层面的信号和嵌入式中硬件层面的信号好像有不同,嵌入式层面更加及时,这里要来进行做一下对比。抽象的使用一个名为MY_Key_Scan的函数来进行检测,//检测按键按下的情况,
2025-06-17 00:34:51
774
原创 STM32中GPIO介绍,嵌入式学习与c++/Java的不同,Keil中的使用技巧
你的微控制器主动发出信号去控制别人。你的微控制器被动接收信号来感知别人。
2025-06-13 18:35:46
991
原创 C语言中字符串的定义方式种类,数组衰退成指针,可变长数组,malloc,calloc,realloc
局部变量(函数内部定义的非static变量)通常存储在栈上。栈上的内存由编译器自动管理,函数调用时分配,函数返回时自动释放。// myString 存储在栈上// myString 的内容可以被修改// 合法操作此时字符串是可读可写的,可以对其中的内容进行修改。如果要定义一个存储在栈区的字符串,都是选择用数组的形式来定义的,不会使用指针的形式来定义的。
2025-06-12 09:35:19
1065
原创 I/O系统层次,逻辑设备,虚拟设备,假脱机系统,磁盘I/O计算,磁盘I/O调度算法
I/O系统层次,逻辑设备,虚拟设备,假脱机系统,磁盘I/O计算,磁盘I/O调度算法
2025-05-08 18:11:52
922
原创 虚拟存储器,请求分页系统机构,请求分页系统中地址变换过程,页面置换算法,置换算法实际运用在缓存置换中运用
虚拟存储器,请求分页系统机构,请求分页系统中地址变换过程,页面置换算法,置换算法实际运用在缓存
2025-05-07 17:57:51
1122
原创 进程创建,进程状态,进程同步互斥,信号量,用户态和内核态
用户态进程是普通应用程序的运行实例,例如你使用的浏览器、文本编辑器、游戏等,都是运行在用户态的进程。在 Linux 操作系统中,用户态进程无法直接访问硬件资源,必须通过**系统调用(System Call)**请求内核提供服务,例如文件操作、网络通信、进程管理等。这样做的目的是为了提高系统安全性和稳定性,防止应用程序直接操作硬件导致系统崩溃。用户态进程的特点运行在用户态(User Mode),权限受限,不能直接操作硬件。访问系统资源需要系统调用,例如。
2025-05-05 19:58:57
840
原创 文件系统——文件操作,文件共享,文件空间分配方式,linux中的i-node,按名存取(按文件路径存取)的实现
操作系统中的文件系统,文件的基本操作,文件共享的实现方式——硬链接,软链接,文件的存储使用索引分配改进版,linux中实际文件存储使用的是i-node策略
2025-05-04 11:29:11
875
原创 动态规划的一些感悟(写给dp小白的我)
本篇文章算是目前博主对于动态规划问题的一些理解,其中我可能有一些理解偏差的地方,欢迎大家指出,大家关于有不同想法的见解也欢迎讨论。emm,dp这种题目感觉还是需要多练,上面只是总结了一下dp题目的理论知识,实践是要比理论知识更重要的!在实际的实践中你会发现有很多的变种题目,OK,话不多数,刷题去啦,大家加油!多刷题!多思考!
2025-05-01 23:53:49
730
原创 动态规划问题,下降路径最小和(dp初始化问题,状态压缩),单词拆分(回溯法+剪枝+记忆化),substr函数
动态规划问题,下降路径最小和(dp初始化问题,状态压缩),单词拆分(回溯法+剪枝+记忆化),substr函数
2025-04-25 15:23:18
1120
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人