自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ROS2入门:基于cpp的初步编码学习

首先,和之前一样,继承ROS2官方基类。然后我们先来看一下这个对象声明。前面两个,是回调组智能指针声明,主要是用于保证两个任务被拆分到两个不同的cpu上进行工作。如果我们不设置这个回调组声明,他们会被默认分到同一个组。属于同一个回调组内部的各个回调函数,在同一时刻绝对不允许被两个不同的线程并发执行。就会导致任务A(1000HZ)会被任务B(20HZ)无限卡住。假设任务A是电机信息的读取,那就是完全的延迟。因此,我们需要进行划分。

2026-06-20 21:16:35 248

原创 进程间通信-pipe

管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。其实我们以前已经用过管道了,如图中的命令。中间那个“|”就是管道。他的功能就是把 “ls l”的结果输入grep test,让grep命令在他的结果里面去找和test有关的内容。

2026-06-19 18:33:26 226

原创 My_shell模拟实现

该代码的作用主要是使用rfind进行提取。首先我们先定义我们要用的符号是"/",然后设置一个标准库里面的字符串dir是pwd,接着我们先保证这个dir不是根目录,如果是根目录,直接返回“/”。然后,我们就使用rfind函数进行倒着查。该函数会倒着查dir这个字符串,直到找到了"/"符号,然后返回这个位置的下标。如果发现pos的位置竟然在npos(-1),我们就认为出现bug了。如果没bug,我们就返回dir的最后一个目录,注意这里pos+1,因为我们不想要前面还有一个"/"。

2026-06-12 15:41:41 221

原创 进程控制知识

进程退出有三种场景:1:代码运行完成,正确运行。2:代码运行完成,但是失败。3:代码异常终止。一般来说,我们通过正常的main函数return,或者使用exit()和_exit()都是可以正常的结束进程的。而异常退出的典型例子就是ctrl+c。我们可以通过观察退出码来知道我们的进程到底是成功退出还是失败退出了。通常,我们认为除了0和1以外的都是失败退出。0是最正常的退出,而1是不被允许的访问,常见的退出码如下:最简单的读取返回值的方法是echo $?。

2026-06-07 21:43:10 234

原创 环境变量与虚拟内存

环境变量是系统的全局配置手册,里面存放了在当前操作系统下的一些参数。其一般是全局属性,具体的用途比如在链接C/C++代码的时候,系统会自动链接到动静态库中,然后生成可执行文件。指定命令的搜索路径指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)当前Shell,它的值通常是/bin/bash。

2026-04-26 22:15:20 391

原创 Linux基础知识与基本指令(3)

zip和tar都是linux系统中比较常见的打包压缩命令,从使用范围上来说,zip比较适合跨系统使用,比如把Linux的文件发给windows的朋友,但其缺点是压缩率较低,并且不会保留linux系统中的用户权限机制。zip命令常见的就是 zip file path/,直接把文件压缩到指定路径下。还有就是zip -r filepath path/,把指定文件夹压缩到指定路径下,如果不加-r,就是压缩一个空文件夹过去,-r的意思是递归,保证文件夹的压缩。

2026-04-24 19:29:55 371

原创 LINUX系统编程-进程优先级

前面说到,CPU在为进程分配资源的时候,会按照顺序进行分配,那么,这个顺序是什么呢?如果此时我们使用ps -l命令,可以得到当前正在执行的进程的一些信息,包括,(执行者身份),(父进程),(自身进程),(进程优先级),(nice值)。我们先简单介绍前面几个,UID指的是执行者身份,我们前面讲过权限相关的知识点,系统是怎么知道当前访问的这个用户,对于该文件是own,group还是other?

2026-04-24 11:31:20 422

原创 LINUX系统编程-进程概念

在linux系统中,对于进程管理,文件系统和设备驱动,都是通过先描述再组织的方式进行管理。那么,什么是先描述,什么是后组织呢?简单来说,的意思就是,将数据,通过结构体进行封装,实现将数据给对象化。,就是将这些对象,通过数据结构(链表,队列,堆栈)进行连接,使其建立联系,实现高效关联。

2026-04-23 22:32:45 368

原创 Linux基础指令(2)

再接下来是cat/ls *c(*是通配符,就是把该后缀结尾的全部都算),接上|,然后带上wc -l(wc是用来字数统计的,接-l就是列举行数,接-w就是列举单词数,接-c就是列举字节数),这样接以后,就可以列举出该文件的行数或者文件的数量。这是最好用的检索工具,less可以非常高效的进行的进行检索,而且less不同于more,他可以上下翻动,当我们less了一个文件,-i 忽略搜索时的大小写;more的功能和cat差不多,-n就是搜检索指定的行,然后可以往下翻,如果太长了,可以点击q离开。

2026-03-15 17:32:08 319

原创 Linux初识与基本指令

关于Linux,我们首先得要知道,他是一个系统,本质上和鸿蒙,windows,ios是一样的。但是为什么工程师以及企业会更喜欢用Linux呢?首先是因为,Linux他本身是开源的,因此他的社区及其丰富,公司也可以根据需求来改造linux;其次,linux对设备的要求较小,并且极为稳定,在嵌入式领域或者公司服务器也更倾向于使用linux。因此,学习linux的知识是非常有必要的。服务器级的linux一般不具有可操作界面,而是通过命令行来直接进行操作。

2026-03-14 16:47:56 262

原创 C++异常与智能指针

关于异常/错误的处理,C语言时期的方法是通过错误码的形式来处理错误。错误码类似于一个map,C语言内核会为每一个错误码附带一个错误信息,发生异常后便会给出错误码,接着我们需要拿着错误码去找错误信息,比较麻烦。在C++中异常处理机制得到了改善,使用的是异常的抛出与捕获方法。当程序出现问题的时候,我们通过抛出(throw)一个对象来触发一个异常,接着由catch判断类型是否符合。每一个try都至少会匹配一个catch,否则就会报错。

2025-10-14 23:25:30 747 1

原创 C++ 11包装库,lambda的用法

lambda表达式本质是一个匿名函数对象,但是他可以定义在函数内部,一般来说,我们可以直接使用auto的对象来接收lambda对象。其中,capture-list是捕捉列表,用于获取函数内的局部变量来给lambda函数使用。编译器是根据"[]"的存在来判断这个是否为lambda函数。所以,即使我们什么也不需要捕捉,将其为空也不可以省略。lamda的捕捉有两种方法,传值捕捉和引用捕捉。传值捕捉的参数不能在lambda函数体内修改,但是传引用捕捉的可以。

2025-10-04 13:38:36 365

原创 C++11学习:可变参数模版

可变模版参数是C++11新引入的机制,其本质是模版的模版,一个可变参数模版支持可变数量参数的函数模版和类模版。和普通模版函数一样,你在函数界面可以传值,也可以传左值引用或者万能引用。其基本语法规则是在定义模版处需要在参数类型前加上三个点,然后再函数中需要在函数类型后加上三个点。注意,引用符号要放在点前类型后。如果使用引用传参,依旧遵循引用折叠的规则。

2025-09-28 10:44:51 395

原创 C++11中的列表初始化,右值引用与移动语义

C++11是C++11的一个重要的大更新版本,其中增强了许许多多的特性的语法规则,提高了代码的运行效率,当然也增加了学习成本,我将分几小章分别介绍C++11中常用的语法规则。首选今天要介绍的就是列表初始化,右值引用和移动语义。

2025-09-25 21:12:41 566

原创 哈希表与unorder_set,unorder_map的学习

哈希(hash),是一种理论思想,与各种各样的树一样,其是一种数据组织的方式。依据我的理解,哈希的本质就是映射,将一组数据根据某种规则(哈希函数)映射到一个有序可查的表中。这个表里存放size_t(unsigned int)类型的数据,用于直接访问。因此,哈希表的增删查改的时间效率为O(1),效率很高。但是其也有缺点,就是其得出的结果不会有序,因此哈希的本意为散列,就是散乱的数列。

2025-08-17 17:08:21 983

原创 红黑树的结构

相比于AVL树,红黑树在工作中其实更为常见。作为map和set的底层数据结构,红黑树有四个绝对准则:1.每个结点只有两种颜色,红色或是黑色2.根节点root一定是黑色的3.r=如果一个节点是红色的,那么他的两个子节点一定是黑色的,不会出现两个连续的红色节点4.对于任意一个节点,从其起始到其所以NULL结点的路径上,均有相同数量的黑结点这四个准则间接引出了一个准则,也就是最长路径比最短路径不会长超过2倍,这就保证了红黑树相对的平衡。

2025-08-12 15:43:44 350

原创 AVL树的四种旋转

AVL树是c++中很常用的数据结构,其独有的特点使得其增删查改的效率都是logn级别。AVL树中最核心的是四种旋转方式,我将从代码入手去分析四种旋转的特点,具体图例就不画了。

2025-08-09 19:38:29 286

原创 二叉搜索树模拟

二叉搜索树是一种经典的数据结构,也是map和set的底层实现。为了更好的理解BS的设计思想,我们来尝试实现一下二叉搜索树。

2025-08-06 14:39:49 334

原创 cpp中的多态

多态的实现依赖于继承,在继承的基础上实现。多态需要基类和派生类的目标函数完成三同:名字同,返回值同,参数类型同。想要实现多态,还有两个重要条件:1.必须是基类的指针或者引用调用了虚函数。只有基类的指针或者引用才能即指向基类又指向派生类。2.被调用的必须是虚函数,并且完成了虚函数的重写/覆盖。使得基类和派生类有不同的函数。

2025-08-01 16:22:45 744

原创 C++继承

继承,顾名思义,就是从长辈那边获得一些东西。cpp中的继承指的是子类从父类继承函数,变量的手段,并在这个的基础上进行扩展,产生新的类。继承设计的核心就是减少代码的编写,提高编码效率。例如胡萝卜和上海青都是蔬菜,那就可以继承蔬菜这个父类的一些变量,比如维生素含量啥啥的,然后可能胡萝卜还有自己的胡萝卜素的含量,再另外处理。继承最本质就是父类和子类还有继承方式,代码中Student就是子类,Person是父类,protected是继承方式。

2025-07-30 16:29:57 1022

原创 模版进阶知识及其小知识点

模版参数的类型分为和。指的是出现在模版参数列表中的,前面会跟着class或者typename。一般来说就是用一个常量作为类或者函数模版的一个参数,在该模版中可以将这个参数作为常量来使用。类似于#dfine 但是非类型模版参数只作用于模版中。浮点数,类对象和字符串是不可以作为非类型模版参数的!

2025-07-29 16:48:34 358

原创 stm32 蓝桥杯 物联网 独立键盘的使用

在蓝桥杯物联网平台里面,有5个外接设备,其中有一个就是6个独立按键。首先,我们先看一下按键有关的电路图。

2025-03-09 19:19:25 849

原创 stm32 基于蓝桥物联网赛 oled屏使用

在.h文件中实现一些宏定义,首先定义oled和按键的刷新时间,这代表了oled和按键工作函数每几秒工作一次。接着是按键的宏定义。无需严格写成这样子,只要三个数据不同即可。#define Oled_Min_Time 200 //定义oled和按键的最小刷新时间#define Asw_None 0x00 //定义按键,为后续的逻辑运算做准备#define Asw_1 0x01 //二进制为0001#define Asw_2 0x02 //二进制为0010 #define 后面不需要加;号。

2025-03-07 20:49:38 1211

原创 stm32(hal库)学习笔记-时钟系统

时钟是具有周期性的脉冲信号,一般我们常用占空比为50%的方波。可以形象的说,时钟就是单片机的脉搏。在我常用的stm32F1系列中,分别有HSE(高速外部),LSE(低速外部),HSI(高速内部),LSI(低速内部)。高速的两个一般用于滴答时钟,低速的两个一般用于RTC。其中还有两个比较少见的,分别是CSS(时钟安全系统)和FCLK(自由运行时钟)。CSS作用为若HSE启动失败,自动切换HSI,且其可以进NMI中断。FCLK用于采样中断和调试模块记时。休眠时仍然有效。

2025-03-01 19:43:59 983

原创 stack,queue,priority_queue学习知识点

在c++常用的容器中,有的是以容器迭代器为核心,而有的则以容器适配器为核心。较为常用的就包括queue和stack。接下来我将简单的以queue和stack的模拟实现介绍其特点。在以下的模拟实现中,class Con就是我们的容器适配器,他用于传一个容器,默认为deque类模版,deque模版是一种奇妙的模版,他在头部插入和删除时,效率很高,扩容效率也高,但是其不适合遍历。当我们想要实现某个类,而刚好这个类可以用其他类的功能来直接实现,那么我们就可以将这个类用另一个类包装起来。

2025-02-24 23:32:03 472

原创 List模拟实现

list,链表容器是一种能够高效进行数据存储的容器,与前面已经提到的一些容器相似,list也是用迭代器进行遍历和控制数据。但是list的迭代器实现起来较为复杂,因为其不是原生指针的typedef,如果我们要模拟实现一个list类型,需要自己重新定义一个类来实现。STL原文件实现的是双向带头节点的链表,此次我们实现的也相似。

2025-02-19 16:46:42 551

原创 vector的综合学习与OJ

首先我们需要知道,vector需要存储不同类型的数据,可以是存一堆整形也可以是存一串串的字符串,甚至可以存vector,因此,我们需要用模版来实现vector。并且,由于模版类声明和定义不可分离,因此我们大部分代码都要写在.h文件中在STL原装库中,vector是通过3个迭代器来进行定义的,分别是_start,_finish与_endof_Storage,名字可能略有不同,但是具体功能都在下文表示出来了。public:////////private:// 指向数据块的开始。

2025-02-16 10:53:35 918

原创 string类的模拟实现

string类是我们平时经常使用的一种类,他是c++中的字符串。通过自己手动写代码实现string类可以有效促进我们对string类的理解。

2025-02-09 20:12:59 459

原创 2025.2.1(迭代器,auto,for遍历)

迭代器是cpp中STL的重要组成部分,主要负责数据的遍历以及删改,//迭代器,形如指针,一些地方就是指针,begin返回这块空间开始的迭代器,end是最后一个数据的下一个位置的迭代器,很有可能是'\0',it需要解引用所以真的很像指针。

2025-02-01 11:34:19 396

原创 模块初阶学习

函数模版代表了一个函数家族,与特定具体类型无关,函数模版里面T1等参数由使用时决定类型,根据输入的实参推断出,此时T1......Tn应该是什么类型。

2025-01-25 21:40:08 427

原创 类和对象的学习(下)

在类和对象中,我们介绍过一种成员变量初始化的方法,那就是函数体内初始化。这种初始化依赖于函数体的缺省值和实参,并且无法初始化部分数据,如被const修饰的数据。构造函数体内也无法初始化引用成员变量。因此,我们在此介绍另一种成员变量初始化的方式:初始化列表。初始化列表的格式为在构造函数后面以‘:’开始,‘,’分隔,并且在成员变量后面的括号里放初始值或者表达式。这样,就完成了初始化列表。需要注意的是,初始化列表中的每个成员变量只需要初始化一次,多次初始化会到导致报错!

2025-01-22 21:53:23 1050

原创 类和对象学习(中)

在C++的类中,有6个默认的成员函数,当我们不写的情况下编译器会默认生成。这六个里面最重要的是前4个,最后两个相对而言重要性较低。因此,我们重点介绍前四个函数。

2025-01-20 01:08:42 942

原创 类和对象(上)

在cpp中,class是定义类的关键字,例如以下代码,class是关键字,Date是类的名字,{}中是类的主体。该主体中可以放成员函数和成员变量。注意,{}后面的分号‘;’是不可以省略的。在cpp中,class与struct基本等价,但是一般我们还是用class来定义类。根据不同公司,不同学校的习惯,我们一般会把成员变量加一个特殊标识,在我的习惯中,便是在成员变量前加上一个_a以表示这是一个成员变量。cpp的成员函数默认是inline的,因此当成员函数的代码较少的时候,会展开为代码行。

2025-01-15 22:26:07 918

原创 C++基础入门

在学完了C语言和基础数据结构以后,我们可以开始逐渐开始学C++了。C++作为目前市场上最为热门的几款语言之一,也被人们称为最难的语言。C++有着强大的功能与复杂的语法,需要我们尽全力去好好学习他,掌握他,以提高自己的综合能力。因此,从今天开始,我将慢慢在优快云上更新我的学习笔记,若有错误之处,烦请您指出来,无尽感激。C++是大量包含了C语言语法的,因此,你直接在C++的编译器里面写C语言理论上也是没问题的。但是既然C++是plusplus,当然有他的改进与独到之处。

2025-01-13 23:44:17 724

原创 基于esp32-idf的FreeRTOS系统学习

1.运行当任务实际执行时, 它被称为处于运行状态。任务当前正在使用处理器。如果运行RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。

2024-11-08 15:16:06 1439

原创 常见排序算法总结

排序,既将一串数据,无论其原先是有序还是无序状态,都将其变成有序的一个过程。在C语言中,排序有很多种方法,本次主要介绍其中几种,他们的空间复杂度和时间复杂度都可能有所不同。接下来我将以此讲解。

2024-10-08 12:22:26 836 1

原创 二叉树堆的建立与排序

在数据结构中,二叉树是非常好用的一种数据结构,这节暂时按下不表。这节课主要介绍堆的建立与使用。堆,是二叉树中一种很特殊的结构,首先,他必须是满二叉树,也就是除了最后一层以外,其他层都是满的。堆对于节点数据也有要求,其基本按照某种规律进行排序。首先堆分为大堆和小堆。大堆上大小大小堆上小下大。有非常大的差距。并且在堆中每个节点也满足完全二叉树的父子节点规律,既child=parent*2+1 | 2,1和2取决于是子左节点还是右节点。

2024-09-22 21:13:27 954

原创 栈与队列相关知识点

栈与队列是比较常用的两种数据结构,其中他们分别有特别的使用方法。今天,我们先来简单了解一下栈与队列的实现。

2024-09-16 21:13:03 850

原创 回环相关知识

回环是链表中一个比较有意思的类型,指的是一条链表尾部的节点连接了链表中某一个节点,导致这个链表会无限遍历,具体表现为如下图所示那么,在回环链表中我们要探索什么呢?第一,我们要探索一个链表是否有无回环;第二,我们要找到链表的回环入口。

2024-09-11 11:32:23 427

原创 贪吃蛇游戏设计学习

在过去几个月,我陆续学习了简单的数据结构,为了能更好的知识学以致用,在此我们设计一款基于开发台的贪吃蛇小游戏,其基于Win32 API设计。贪吃蛇游戏的总体设计思路为,接着我们就先从初始化游戏开始讲。

2024-08-01 20:27:10 791

空空如也

空空如也

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

TA关注的人

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