自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(77)
  • 收藏
  • 关注

原创 【Linux开发七】进程间通信|无名管道|命名管道|System V 消息队列|System V 信号量|System V 共享内存|POSIX消息队列|POSIX信号量|POSIX共享内存

进程间通信(简称IPC),指的是多个进程间进行数据交换和信息传递,在Linux系统下,每个进程都有着自己独立的地址空间和资源,想要进行通信就需要IPC机制。进程间通信目的:数据交换,资源共享,进程同步,传递消息。进程间通信的基本原理:不同的进程能访问和操作同一个内存空间。进程间通信的分类:有名管道和无名管道、System V消息队列,信号量,共享内存、POSIX 消息队列,信号量,共享内存、socket。System V和POSIX的主要区别在于System V底层使用命名空间。

2026-01-29 19:46:48 943

原创 【Linux开发六】进程概念|进程终止|进程中环境变量|进程创建|父子进程文件共享和竞争关系|监视子进程|孤儿进程和僵尸进程|执行新程序|进程状态与进程关系|父进程信号处理机制对子进程影响|守护进程

进程指的是正在运行中的程序,程序一旦运行就是一个进程,进程是一个动态概念并非一个静止的文件。程序一般指的是可执行程序或可执行文件,其本质还是一个文件,是一个静态的概念,文件一般存储在磁盘中。进程号(PID)每一个进程号都唯一标识一个进程。main函数是程序的入口,在执行main函数前还会执行其他代码这段代码叫做引导程序,引导程序不需要我们来编写,在程序编译链接时链接器会自动将引导程序加载到程序中。

2026-01-27 19:01:59 658

原创 【Linux开发五】条件变量|信号量|生产者消费者模型|信号概念和常见信号|信号的使用和处理

条件变量是线程同步的一种机制。通过来定义出条件变量。条件变量的理解:所谓条件变量,就是在使用时程序能否向下执行就需要一个满足的条件来判断条件变量的个数可以通过应用程序中的条件个数进行定义。函数的作用是初始化条件变量第一个参数是条件变量的地址第二个参数是条件变量的属性一般使用默认属性即传入参数NULL。函数的作用是销毁条件变量参数是需要销毁的条件变量地址。函数的作用是申请/获取条件变量,当线程应用程序中出现某个条件时执行到该函数后就被。

2026-01-25 19:39:20 570

原创 【Linux开发四】Linux中概念|MobaXterm和Filezilla软件使用|线程|互斥锁|读写锁

BSP指的是板级支持包,是构建嵌入式操作系统所需的引导程序、内核、根文件系统、工具链。每一个嵌入式开发板所需要的BSP都可能是不同的,且一般BSP都较大。FHS指的是文件层次标准,指定了Linux系统所必须的目录结构和文件存放位置。具体如下图:shell命令中-h参数是将文件的大小按K/M/G的可读形式进行输出显示-R参数是递归概念也就是对目录中的所有内容进行命令操作。cp -rfd命令是用于复制目录下的所用内容包括多层次目录下的内容r递归概念指全部。

2026-01-24 11:57:16 716

原创 【Linux开发三】GCC编译|动态库静态库|基础Makefile|深入Makefile

GCC的编译过程分为:预处理,编译,汇编,链接四个步骤。在使用gcc或g++进行编译时可以分别带上不同的参数进行这四个步骤的执行,预处理-E编译-S汇编-c、链接在进行标准库的链接时不需要带参数而进行动态库静态库的链接时则需要带上参数。预处理主要做的是展开头文件、宏替换、去除注释生成.ii/.i为后缀的文件,编译是将处理后文件编译成汇编文件生成.s为后缀的文件,汇编是将汇编文件转化为二进制文件生成.o为后缀的文件,链接是链接程序执行所需要用到的库生成。

2026-01-22 15:04:00 621

原创 【Linux开发二】数字反转|除数累加|差分数组|vector插入和访问|小数四舍五入及向上取整|矩阵逆置|基础文件IO|深入文件IO

当需要将一个实数进行反转时,我们可以使用c++提供给我们的库函数to_string将实数转化成字符串,然后对于实数的反转就可以想到原来在前面(高位)的现在要放到后面(低位),即该逻辑就是栈的先进后出逻辑,所以我们可以使用栈适配器来对该字符串进行处理入栈后从栈顶元素进行访问,然后以乘以10即乘以进制基数对低位进行提升记录符号位然后处理即可得到最后的数。

2026-01-20 23:42:28 563

原创 【Linux开发一】类间相互使用|继承类和构造写法|虚函数实现多态|五子棋游戏|整数相除混合小数|括号使用|最长问题

当一个类中要使用另一个类的对象的引用,但是被使用类被定义在该类后面时,就必须进行。但是当在该类中还要使用到后面类的成员函数时,就算进行了前向声明也会报错,这时就需要将类中的成员函数定义和声明进行分开,且两个类的成员函数都要写在。

2026-01-18 22:34:27 558

原创 【基础学习七十】ffmpeg命令

【代码】ffmpeg命令。

2026-01-15 18:55:00 221

原创 【基础学习五十二】c++红黑树及B树B+树

在进行插入节点是第三种情况时即插入节点插入到父亲节点的右边,那么就可以将其转化为第二种情况即插入节点插入到父亲节点的左边进行统一处理,对第二种情况处理后我们所得到的就已经时局部满足红黑树了即整体满足红黑树了,就可以退出循环啦。

2026-01-04 23:58:54 483

原创 【基础学习五十一】c++BST树相关知识续及AVL树实现

二叉树重建问题判断是否平衡问题二叉树平衡的条件是:左右子树高度差不超过1.求中序遍历的倒数第k个节点。

2026-01-04 00:53:38 235

原创 【基础学习五十】c++一致性哈希实现BST二叉树实现及相关知识

一致性哈希是负载均衡器用来解决负载请求映射到服务器的一个问题,对于这个映射问题还有轮询,权重比,最小连接,普通哈希等方法,但是以上的方法当其中一个服务器崩溃或者添加一个新的服务器时,原来使用以上提及到的一些方法来进行分映射时,本来应该被映射到A服务器的负载被映射到了B服务器就会导致一些请求响应不到等问题。2.对于递归查询函数来说,其返回值应该是查询到的节点的地址,而不是像递归的删除返回的是一当前节点当作根节点的树进行删除,返回的当前的节点。判断一个树是不是另一个数的子树。判断一个树是不是BST树。

2026-01-03 02:13:13 636

原创 【基础学习四十九】c++链式哈希表查重Topk问题

本文介绍了哈希表实现和常见数据处理问题解决方案。首先详细阐述了链式哈希表的C++实现,包括扩容机制和冲突处理方法,并比较了其与线性探测哈希表的优缺点。接着探讨了多种数据查重问题,包括使用unordered_set/unordered_map查找重复元素、位图法和布隆过滤器实现。最后讲解了TopK问题的多种解法,包括使用优先级队列(大/小根堆)和快速排序分割算法来高效查找最大/最小的前K个元素。文中提供了完整的代码实现,涵盖了哈希表、位图、布隆过滤器等数据结构的应用场景和实现细节。

2026-01-01 00:56:55 560

原创 【基础学习四十八】c++堆排序基数排序及哈希表实现

1.在堆排序中如何遍历到每一个非叶子节点呢?先找到最后一个非叶子节点,然后进行自减操作就可以遍历到堆中的每一个非叶子节点啦。2.在进行下沉操作的while循环条件中,虽然条件是i要从根节点遍历到最后一个非叶子节点,即i<=(size-2)/2,但是最后要化简转化为i<size/2条件,因为当其中的i取到0,size取到1时应该不不能进入循环条件的然而由于-1/2等于0,导致了进行了循环条件使得排序错误。

2025-12-30 01:13:29 708

原创 【基础学习四十七】C++选择排序插入排序希尔排序快排归并排及大小根堆实现优先级队列

这里k用来记录最小值的下标。

2025-12-29 01:33:40 955

原创 【基础学习四十六】C++队列实现搜索排序

这是上篇关于栈的相关知识的续。对于有栈对称结构的匹配问题思路都与此类似。

2025-12-28 00:56:46 715

原创 【基础学习四十五】C++实现单向循环链表双向链表双向循环链表栈

对于上篇中剩下的单链表的知识还有如下。注意:1.要注意其中循环继续的条件,因为对于fast指针要当前节点的下下个节点,避免出现空指针访问的错误。该知识点与找到链表中倒数第k个节点非常相似,对于没有头节点的链表如果有头节点更好解决我们可以实现一个头节点。对于链表的移动我们可以采用先连接成圆再解除圆来解决。

2025-12-27 00:53:34 712

原创 【基础学习四十四】C++实现数组和单链表

在编写该类中的一些注意事项:1.当在进行构造函数编写时,我们肯定是要将数组的有效元素个数成员变量置为0的,但是若不小心将其写成了数组容量为0,在我们使用该类时是注意不到的。而且在对该类进行添加成员数组扩容时,数组也是会正常输出,但是这里的数组时进行了越界访问的,因为当数组的容量不小心被设置成0时,并不满足我们所设置的扩容条件,所以需要注意不要写错了。2.在数组进行下标访问来获取数组的前后元素时,下标注意不要写成自增和自减,只能进行加减操作,只能改变访问的位置不要改变了i的大小。

2025-12-26 01:16:42 769

原创 【基础学习三十】STM32中OTA介绍及使用

是⼀项通过⽆线⽹络远程更新设备软件、固件或配置的技术,它让设备升级像⼿机系统 更新⼀样⽅便,⽆需连接电脑或前往服务中⼼。Bootloader是在应⽤程序开始前运⾏的⼀个⼩程序,⾥⾯可以进⾏⼀些初始化操作,升级引⽤程序等,在嵌⼊式设备中很常⻅。然后将你要实现的功能写入到app文件中即可,需要进行ota更新的app文件要将前面说到的标志位进行一个更改。存放应⽤代码, App2区 存放暂存的升级代码。然后再去执⾏其他的应⽤程序. 在应⽤程序⾥⾯会加⼊程序升级的部分,之后第⼀步是先去更改程序的向量表。

2025-12-24 20:45:44 1135

原创 【基础学习二十九】CANOpen协议

其中/src是canopen协议栈的标准源代码,/include是各种头文件,/drivers是各种驱动,/example是测试程序,/objdictgen是带有图形界面的对象字典编辑器,/doc是一些说明文档。与其他总线相比can总线的优势就是帧数据量小,发送的时间段具有很好的实时性,被干扰的概率小抗干扰性强。CANopen是can总线的一种常用的应用层协议,CANopen 的核⼼规范是由cia301定义,其中包含了⽹络管理(NMT):启动、停⽌、和重置⽹络节点。):⽤于访问和配置对象字典中的数据。

2025-12-23 21:32:14 1045

原创 【基础学习六十六】Linux网络介绍网络编程和数据库

网络采用分而治之的方法设计,将网络的功能划分为不同的模块,以分层的形式有机组合在一起。每层实现不同的功能,其内部实现方法对外部其他层次来说是透明的。每层向上层提供服务,同时使用下层提供的服务网络体系结构即指网络的层次结构和每层所使用协议的集合两类非常重要的体系结构:OSI与TCP/IP。TCP/IP的四层模型是:网络接口与物理层 : 网卡与网卡驱动,网络层 : 路由器, ip地址,传输层: TCP 与UDP ,应用层: FTP, TFTP,DNS, SMTP, Samba ,SSH等。

2025-12-22 22:39:39 1558

原创 【基础学习四十三】C++标准模板库STL库和内存管理文件操作

标准模板库为标准化组件提供类模板,目的是进行范型编程(数据结构编程)。STL技术是对原有C++技术的一种补充,具有通用性好、效率高、数据结构简单、安全机制完善等特点。下面我们来看看STL库中的一些常用容器和迭代器。首先是序列容器,STL序列式容器,其共同的特点是不会对存储的元素进行排序,元素排列的顺序取决于存储它们的顺序。所谓序列容器,即以线性排列(类似普通数组的存储方式)来存储某一指定类型(例如 int、double 等)的数据,需要特殊说明的是该类容器并不会自动对存储的元素按照值的大小进行排序。

2025-12-21 21:46:46 1293

原创 【基础学习六十五】Linux进程线程与进程间通信

进程是一个独立可调度的任务,在系统执行某个程序时会分配和释放许多资源,进程是一个程序的一次执行过程,进程是程序执行和资源管理的最小单位。

2025-12-20 19:22:07 1214

原创 【基础学习六十四】Linux文件操作

标准IO是c语言的标准IO库,不仅在linux系统上在其他操作系统上也实现了c语言的标准IO库,标准IO是在文件IO的基础上构建的。其中也有着许多相关的概念如下:FILE指针,每个被打开的文件,操作系统都在内存中开辟一个区域,用来存放被打开文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。流:所有的I/O操作仅是简单的从程序移进或者移出,这种字节流,就称为流。

2025-12-19 16:32:21 862

原创 【基础学习六十三】linux的shell命令

shell编程的基本三部曲:创建shell文件,文件的后缀为.sh或者可以不写后缀,是包含多行操作系统命令或者shell命令的文本文件。用chmod赋予shell文件可执行(x)的权利。直接通过命令执行shell文件。我们了解了shell编程的三部曲后我们就可以进行shell编程了。前面是shell文本文件里面的内容,通过vi编辑shell脚本,然后通过chmod赋予该文件可执行的权利,最后直接执行该文件即可得到输出内容了。

2025-12-18 18:51:46 888

原创 【基础学习六十二】Linux的shell命令

进程是一个独立可调度的任务,是一个程序一次的执行过程。进程有四种状态:运行态:此时进程正在运行或准备运行,等待态:此时的进程正在等待一个事件的发生或者系统的某种资源,有可中断和不可中断两种。停止态:此时进程被停止。死亡态:这是一个已经终止的进程,但是还在进程向量数组中占有一个stack_struct结构。ps aux:显示进程。其中USER:进程的所有者,哪个用户运行的进程。PID:进程的进程号,1是系统的守护进程。%CPU:占用cpu的百分比。%MEM:占用内存的百分比。VSZ:虚拟内存的大小。

2025-12-18 12:23:06 1212

原创 【基础学习六十一】Linux的shell命令

id:用来显示用户的详细信息。adduser:用来创建一个新的用户,useradd也可以用来创建一个新的用户,但是useradd命令创建的用户是一个三无用户。su:进行用户间的切换。sudo:给与普通用户更高的权限。userdel:删除一个用户,用户被删除但是文件夹下还有。rm -rf:强制删除文件或目录,且不显示错误信息。passwd:修改用户密码。exit:退出当前用户。

2025-12-17 21:04:10 1551

原创 【基础学习五十五】C语言中的面向对象思想

对于c语言当一个结构体要创建多个变量时,若我们分开管理就会比较难以管理,但是我们可以通过结构体数组(对象数组)的形式对其进行管理。可见当我们需要管理多个gpio时我们就可以通过一个数组的方式将其管理在一个数组内,并且通过对数组的遍历我们还可以批量处理数据,方便了我们的管理。

2025-12-15 22:53:19 825

原创 【基础学习四十二】C++11线程库的使用

在C++11中引入了原生的线程支持,包含在<thread>头文件中,我们下面来看看该线程库的基本使用方法,先看下面这段程序。我们创建了一个线程对象,将show函数作为入口传入。当我们运行时有以下运行结果:虽然我们的hello thread成功输出出来了,但是却出现了错误,这是因为在我们子线程还没有结束时,我们的main线程已经return结束啦,就导致出现了错误。那么怎么办呢?

2025-12-14 23:50:58 1183

原创 【基础学习六十】Linux的shell命令

在Linux系统中不同于window中的图形化操作,linux更多的是用的命令行的操作,下面我们来看看其中的一些基础shell命令。@是分隔符,linux和root是用户名,ubuntu是计算机名,~表示家目录即linux/home是根目录的子目录,/是根目录,~后的符号表示是普通用户,#表示是管理员用户。

2025-12-14 18:48:20 1838 1

原创 【基础学习五十九】QT软件开发知识点流程及记事本开发

我们通过选用基本的控件来设计出下面的ui界面:当然我们的效果还要有选项中的图形显示,如下图所示:这里的图标我们可以通过阿里巴巴图标库获取,然后将其添加到我们的资源文件中即可,因为对于软件图标只能使用ico格式图片,但是阿里巴巴图标库里面并没有提供该图片格式,所以我们可以通过我们前面开发的图片格式转化工具来进行格式的转化。

2025-12-12 16:37:01 1137

原创 【基础学习五十四】C语言函数指针与面向对象思想

函数在c语言的内存模型中会被存入到代码区,所以也是有地址的,所以和变量一样既然有地址就可以通过一个指针来指向这个地址,固然就有了函数指针。在前面深入理解指针篇中我们讲到函数指针得概念和一些用法,下面我们来更加详细得讲解一下函数指针的使用。可见我们通过对函数指针的两种使用方法来实现两个数的相加。第一个采用的是用接引用的方式,因为函数指针也是一个指针通过解引用就可以拿到我们的函数,再传入参数即可实现函数的调用。

2025-12-12 15:42:55 813

原创 【基础学习五十三】深入理解C/C++指针

我们可以看到这是指针最基本的用法,那么我们现在来深入理解一下这段程序,char ch;编译器在执行了这句话后就会在内存中开辟一段内存,而对于该段内存就会有一个地址,这个地址就像是这段内存空间的一个门牌号用来帮助编译器在后面我们要用到该段程序时知道该空间。那么对于char就是类型,通过这个类型编译器可以知道要开辟的空间的大小即1个字节大小。那么我们现在来思考一下ch是什么呢?

2025-12-11 17:02:50 1204 1

原创 【基础学习四十一】C++模板

可见链表模板类的优势就是我们可以通过模板类实现数据的增删改查反转显示后,我们就可以对int,float,string等类型直接使用模板类实现链表类的功能啦,对于这个链表模板类我们实现了基本数据类型的增删改查反转显示功能,下面我们实现一个自定义类型作为传入参数的模板类。可见我们想要的功能是将创建对象时直接赋值的参数输出显示出来,但是我们知道<<运算符并不支持对类类型的操作,我们我们就要用我们前面说到的运算符重载来解决这个问题,其实对于运算符重载实际上就是你想要将该运算符重载成实现出你想要的功能。

2025-12-10 23:20:22 662

原创 【基础学习六十九】ffplay播放控制快捷键及相关命令及过滤器

【代码】ffplay播放控制快捷键及相关命令及过滤器。

2025-12-09 20:31:09 589

原创 【基础学习六十八】在windows上安装ffmpeg及新版ffmpeg命令

首先我们点击ffmpeg官网链接https://www.ffmpeg.org/进入到ffmpeg官网中,官网界面如下:点击Download进入下载界面如下:然后点击windows图标,点击后会出现如图所示的两个链接,我们点击第一个,进入如下界面:往下拉看到如下图所示的releas builds发布版本:其中我们可以选择最新版本,我这里的最新版本是8.0.1,在最新版本的栏目中我们可以看到有四个压缩包。

2025-12-09 12:59:22 1465

原创 【基础学习六十七】音视频入门基础知识

首先对于音频的录制来说,我们首先要通过一定的采样频率来获取到采样帧,然后对音频进行处理后进入到采样帧队列,然后通过编码处理(包括压缩等)后形成一个音频包队列。对于视频的录制来说,我们也要先通过一定采用频率来获取图像帧,然后对图像进行处理进入到图像帧队列,然后通过编码处理(其中也包括压缩等)后形成一个视频包队列。最后将音频包和视频包通过复用器合成我们的音视频文件。详情见下图:其中的时钟对于采样帧和图像帧的采用很重要,且两者一般共用一个时钟源,来保证后续的音频同步。

2025-12-08 18:12:53 1181

原创 【基础学习五十八】QT软件开发知识流程及秒表计时器开发

首先我们选择相应的控件并进行如下界面布局:首先我们在创建文件是要选择窗体为主窗体,选择了主窗体之后我们才能编辑左上角的工具栏,这里我们的工具栏要设置的功能就是语言转化功能。然后上面选择的控件是LCD Number即数码管显示通过数码管来显示我们要计数的时间,数码管对象属性的设置如下:然后就是中间部分的两个按钮选择Push Button控件,下面部分我们要选择的控件是table view列表显示,用于显示我们秒表的计数值。

2025-12-06 21:52:30 1565

原创 【基础学习五十七】QT软件开发知识点流程及文本转语音工具

首先我们选择对应的控件来对所需界面进行布局,布局如下:界面上部分用的是文本编辑框可以用来输入要转化为语音的文本,选择左边的控件为Text Edit下面我们选择的是两个Group Box用来将我们的选项进行分组,然后我们选择Label控件并编辑成相应的文字用于对后面的下拉列表选项进行说明,后面的下拉列表选择Combo Box控件该控件可以放入字符串图片的信息供我们进行下拉选择,中间的分割线选择Vertical Line用来显示分割,右边同样先选择Label控件用来说明后面的滑动条信息和数字信息,下面我们选择P

2025-12-05 16:33:31 917

原创 【基础学习五十六】QT软件开发知识点流程及图片转换工具的开发

首先打开软件之后我们就会进入到软件主界面,如下:我们点击创建项目然后选择自己所要创建的工程选项后就可以进入到该软件的编辑界面。如下所示:可见该界面有一些C++头文件和源文件,我们程序的主要编写文件就是widget.h和widget.cpp文件,我们主要的图形化设计界面就是widget.ui文件,双击之后即可进入到如下界面:其中左边时一些界面设计所需的控件,我们可以通过将空间拖拽到中间的编辑界面来进行界面编辑,右边上面是对象名,下面是对象属性编辑器用来给对象的属性进行一些编辑。

2025-12-04 20:30:07 1186

原创 【基础学习四十】深入理解C++虚函数,虚继承,菱形继承

首先我们来先了解几个重要概念:虚函数:用virtual关键字声明的成员函数。虚函数表指针(ptr):用于指向虚函数表的的指针。虚函数表(vtable):包含虚函数的类产生的一个函数指针数组。有了这些概念后我们就可以来深入理解一下虚函数,虚继承,菱形继承等相关概念了我们把这些相关概念分成多个小点给大家讲清楚。

2025-12-01 20:35:59 1185

空空如也

空空如也

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

TA关注的人

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