自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 回溯算法(C/C++)

我们可以这么理解,已知可以选择走的路径总长度为n,在当前的横向遍历节点上,已知前面走过路径上长度为size,然后总共是需要走的长度为k,那么是不是可以说还需要走k-size的长度的路径?对于子集问题,其实跟前面的不同,子集是每一个递归的节点都要进行数据的收集,而前面的组合问题都是有条件限制的才执行收集的操作,比如递归收集数字和为target的组合之类的。这个问题其实是组合总和2的一个派生问题,本质上是差不多的,无法就是需要一个东西来去标记一下使用过的数据,避免下次重新去使用。下面三个案例练练手看看。

2025-02-26 18:54:45 2214

原创 Linux-----线程同步(条件变量)

上面这个写法还是会存在资源竞争的情况,也就是抢锁,实际上并不是生产者生产后消费者马上执行,而是互相竞争的。

2025-01-18 21:08:47 498

原创 Linux-----线程同步(资源竞争和同步锁)

我们在读操作中加了1s休眠,只要有一个读线程获得锁,在1s内写操作是无法执行的,其它读操作就可以有充足的时间执行,因此读操作就会连续发生,写操作必须等待所有读操作执行完毕方可获得读写锁执行写操作。我们可以尝试将策略更改为“写优先”,当写操作阻塞时,读线程无法获取锁,避免了写线程持有锁的时间持续延长,使得写线程获取锁的等待时间显著降低,从而避免写饥饿问题。如果一个线程试图获取一个已经被其他线程持有的锁,那么请求锁的线程将被阻塞,直到锁被释放。读操作:在读写锁的控制下,多个线程可以同时获得读锁。

2025-01-17 00:26:45 1120

原创 Linux-----线程操作(终止)

当某个线程调用pthread_exit方法后,该线程会被关闭(相当于return)。线程可以通过retval向其它线程传递信息,retval指向的区域不可以放在线程函数的栈内。其他线程(例如主线程)如果需要获得这个返回值,需要调用pthread_join方法。这个方式就是使用异步自动回收,主线程不需要等待子线程就会自动回收,跟join不同,这里没有同步而是异步。线程函数内部调用pthread_exit函数;其他线程调用pthread_cancel函数。线程函数执行return语句;

2025-01-14 19:41:56 571

原创 Linux-----线程操作(创建)

讲解线程创建的方式和使用

2025-01-14 15:08:25 207

原创 Linux-----进程通讯(消息队列)

mq_receive()同样的也是没有超时机制,当没有数据来的时候就处于阻塞状态。对于 mq_send()这个方式就是发送没有超时机制,可以一直处于阻塞状态。该数据类型定义在mqueue.h中,是用来记录消息队列描述符的。实质上是int类型的别名。

2025-01-09 21:39:59 662

原创 Linux-----进程处理(execve跳转)

const char *__pathL:执行程序的路径* char *const __argv[]: 对应执行程序main函数的参数* char *const __envp[]:传递的环境变量* (1):第一个参数固定是程序的名称->执行程序的路径* (2):执行程序需要传入的参数* (3):最后一个参数一定是NULLint* return 返回值* 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了execve()跳转接口。

2025-01-09 17:47:18 207

原创 Linux-----进程通讯(共享内存)

mmap系统调用可以将一组设备或者文件映射到内存地址,我们在内存中寻址就相当于在读取这个文件指定地址的数据。truncate和ftruncate都可以将文件缩放到指定大小,二者的行为类似:如果文件被缩小,截断部分的数据丢失,如果文件空间被放大,扩展的部分均为\0字符。不同的是,前者需要指定路径,而后者需要提供文件描述符;ftruncate缩放的文件描述符可以是通过shm_open()开启的内存对象,而truncate缩放的文件必须是文件系统已存在文件,若文件不存在或没有权限则会失败。

2025-01-09 00:58:54 348

原创 Linux-----结构体与联合体,大小端模式

64为操作系统为例:对于data这个结构体,原本是20个字节的,划分为4,4,4,4,4,如果扩展为8位的话,前两个4组成一个8,中间两个4组成一个8,剩下最后一个4扩展为一个8,所以划分8,8,8,一共24字节,最后加上指针占8字节,总共32字节。一个int 是4字节,上面有10个char,需要10个字节,根据结构体字段空间对齐的特性,应该按照4个字节划分,应该划分为4,4,4,4,第三个4实际上只存储了2个char类型,所以整体就是16个字节,如果按照下面的情况的话就存储满了,刚好满16字节。

2025-01-07 01:22:16 916

原创 Linux-----进程通讯(管道Pipe)

调用open()打开有名管道时,flags设置为O_WRONLY则当前进程用于向有名管道写入数据,设置为O_RDONLY则当前进程用于从有名管道读取数据。设置为O_RDWR从技术上是可行的,但正如上文提到的,此时管道既读又写很可能导致一个进程读取到自己发送的数据,通信出现混乱。参数s:指向一个字符串的指针,如果s不是空指针且指向的不是\0字符,则perror会在s后添加一个冒号和空格作为前缀,输出错误信息,否则不输出前缀,直接输出错误信息。但要注意的是,无论是有名管道还是匿名管道,

2025-01-06 21:52:34 732

原创 Linux-----进程处理(waitpid,进程树,孤儿进程)

在上面的例子中,父进程在子进程结束前就结束了,那么其子进程的回收工作就交给了父进程的父进程的父进程。在ps -ef的输出结果中,我们发现,CMD部分有的行带有[],而有的没有,前者属于内核线程,内核线程在内核空间执行,不占用任何用户空间资源,它们在技术上是线程,而在许多方面表现得像独立的进程,因此也会被ps命令检索到。第一个内核线程的pid为2,它是所有其它内核线程的祖先。实质上,1号进程就是systemd,它由内核创建,是第一个进程,负责初始化系统,启动其他所有用户空间的服务和进程。它是所有进程的祖先。

2025-01-05 19:59:01 581

原创 Linux-----进程处理(execve执行可执行文件)

const char *__pathL:执行程序的路径* char *const __argv[]: 对应执行程序main函数的参数* char *const __envp[]:传递的环境变量* (1):第一个参数固定是程序的名称->执行程序的路径* (2):执行程序需要传入的参数* (3):最后一个参数一定是NULL* return 返回值* 跳转之后只有进程的信息保留了下来,其他变量的相关东西都删除了。

2025-01-05 16:05:08 351

原创 Linux-----进程处理(文件IO资源使用)

下面代码是通过父进程和子进程对同一个文件IO资源进行操作,父进程和子进程都对这个进程进行写入操作,我们都知道这两个进程实际上是并发的,所以需要一个同步机制来去操作同一个资源(后面再深入去说明同步的api,这里使用延时就可以解决了)

2024-12-26 16:31:12 473

原创 Linux-----进程处理(子进程创建)

【尚硅谷嵌入式Linux应用层开发,linux网络编程,linux进程线程,linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?

2024-12-26 15:36:41 260

原创 stm32串口数据包

DMA当接收的数据量打到一半的rx_len的时候也会触发这个空闲中断,所以需要关闭掉这个玩意。上面的代码是有问题的哦!

2024-12-25 22:32:12 614

原创 Linux文件IO

对与系统IO ,当我们调用read,write读写数据的时候,操作系统会进入到内核来去调用这些api,但是如果是多次循环读写的话频繁的进入内核是和消耗性能的。所以标准的IO(fopen、fread、fwrite)会有一个用户buffer来缓存文件的数据,当使用fread或者fwrite的时候会直接在这个buffer里面读取,而不需要去频繁的进入内核。当buffer被用满了之后,才会调用read或者write进入到内核读取数据放到buffer中。应用层触发异常,传递给内核,内核去处理异常。

2024-12-25 22:21:42 285

原创 Linux------进程处理(system库函数)

【尚硅谷嵌入式Linux应用层开发,linux网络编程,linux进程线程,linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?第一个是表示父进程 ./main ,第二个是指向父进程id。可以显示父进程的信息,而。没有直接显示父进程。

2024-12-25 22:17:02 324

原创 Linux-----gdb调试

r是表示run,重新开始调试。

2024-12-24 01:06:34 249

原创 x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV然后配置到C++和python环境中

【代码】x86_64 Ubuntu 编译安装英伟达GPU版本的OpenCV。

2024-12-21 16:00:13 381

原创 Linux网络操作指令

视频教程:【Linux通过命令行连接wifi——nmcli、nmtui、wpa_supplicant】https://www.bilibili.com/video/BV1nRsjeqEJ3?它通常用于 Linux 系统,特别是在需要脚本化管理网络连接或没有图形界面的环境下。:广播地址是子网中的最后一个 IP 地址,用于向同一子网内的所有设备发送广播包。提供了一种高效的方式来查看、创建、修改、启用或禁用网络连接。注意,这里这个是表示广播地址,不是网关。是一个命令行工具,用于管理和配置。ssid查看网络信息。

2024-12-12 01:40:36 932

原创 Ubuntu换源,Cmake,交叉编译,宏定义

ARM嵌入式开发——Windows下CLion与OpenCV交叉编译环境搭建-番茄园【OpenCV】OpenCV源码编译并实现CUDA加速(Windows)-椒颜皮皮虾-博客园CMake编译OpenCV_4.10.0时,FFmpeg库编译失败_opencv4.10.0videoio-CSDN博客。

2024-12-09 17:45:53 415

原创 计算机网络

MAC地址(Media Access Control Address)是网络接口硬件的物理地址,通常由网卡厂商在设备生产时烧录。

2024-12-03 20:08:31 714

原创 Linux宝塔面板

通常,宝塔面板的安装路径在。目录下,相关脚本位于。

2024-11-26 23:52:25 1741

原创 yolov5模型 训练,导出

教学视频:【目标检测 YOLOv5 开源代码项目调试与讲解实战【土堆 x 布尔艺数】】https://www.bilibili.com/video/BV1tf4y1t7ru?

2024-11-09 22:33:30 819

原创 Windows部署yolov5训练环境

你的Windows电脑没有显卡就不用看了。模型训练的时候是需要用到你的显卡的,一般都不会拿CPU去训练,如果你是第一次去做yolo训练模型的,你要做的有下面这些东西。虚拟环境的配置:安装conda配置或者使用Python配置CUDA安装和cdDNN(看本地显卡驱动支持的版本安装)安装Pytorch(看前面CUDA版本安装)推荐的相关教学视频。

2024-11-07 19:48:20 811

原创 Qt开发————网络编程

在局域网中,当一个计算机想要发送数据到另一台计算机时,它需要知道目标计算机的MAC地址。设备会通过ARP请求询问网络中的设备以找到目标IP地址对应的MAC地址,然后使用这个MAC地址将数据包发送到目标设备。(Media Access Control Address)是用于在局域网(LAN)中唯一标识网络接口设备的地址。它是在网络设备的硬件层面(如网卡)进行通信时使用的。是一个16位的数字,用于标识网络设备上运行的特定应用程序或服务。的设备上,HTTP服务运行在80号端口。有接收缓冲区,也有发送缓冲区。

2024-10-31 18:37:06 974 2

原创 Qt开发-----线程调度

以下引用内容源自正点原子Qt开发指南文档。我们写的一个应用程序,应用程序跑起来后一般情况下只有一个线程,但是可能也有特殊情况。比如我们前面章节写的例程都跑起来后只有一个线程,就是程序的主线程。线程内的操作都是顺序执行的。恩,顺序执行?试着想一下,我们的程序顺序执行,假设我们的用户界面点击有某个操作是比较耗时的。您会发现界面点击完了,点击界面对应的操作还没有完成,所以就会冻结界面,不能响应,直到操作完成后,才返回到正常的界面里。如果我们的界面是这么设计的话,估计用户得发毛了。

2024-10-23 21:45:29 923

原创 Qt开发————QPainter画图

当你想要自定义控件的外观或在窗口上绘制自定义图形时,需要重写paintEvent函数。在这个函数内部,你可以使用QPainter对象来绘制各种形状、文本、图像等内容。

2024-10-23 12:56:37 907

原创 Qt开发——Qt项目打包、整合以及生成安装包保姆级教程(Windows系统)

做完了一个Qt项目之后,要干嘛呢,很显然要打包给别人,让别人也能使用这个软件,本期我们就来学习Qt打包,本期内容分为Windows下和Linux下的打包封装,打包好的文件发给别人只需要点击执行就行了,就跟你下载了一个软件双击即可执行,这是作为开发者必备的打包能力,下面一起来学习吧!

2024-10-21 22:49:05 12051 3

原创 Qt开发-----布局控件(QHBoxLayout, QVBoxLayout, QGridLayout, QSplitter, QSpacerItem)

每个部件可以指定其所在的行和列,以及在行和列中跨越的数量(span)。是 Qt 框架中的一个用于管理多个窗口部件(widgets)显示区域的类,允许用户通过拖动分隔条来动态调整部件的大小。它通常用于在同一个窗口中创建可调整的多个区域,比如左右两栏或上下两个部分。是 Qt 中用于在布局中插入空白空间(类似于“弹簧”效果)的类。它可以占据布局中的一部分空间,并根据窗口大小动态调整自身的尺寸。通常用于让布局中的其他控件彼此分隔,或者让布局中的元素更灵活地响应窗口尺寸的变化。

2024-10-20 14:08:57 808

原创 Qt开发------容器控件(QWidget,QFrame、QMainWindow、QScrollArea)

是用户界面的基本单元:它从窗口系统接收鼠标,键盘和其他事件,并在屏幕上绘制自己。这个函数是被子类重新实现的。这里至少还有两个有用的函数:drawFrame()之一是窗口可能重叠,使得一个窗口隐藏另一个窗口的一部分或全部。当两个窗口重叠时,它们的Z。是重叠二维对象的顺序,例如堆叠窗口管理器中的窗口。类是有框架的窗口部件的基类,它绘制框架并且调用一个。顺序确定哪个窗口出现在另一个窗口的顶部。类是所有用户界面对象的基类(如。都是矩形的,它们按照。

2024-10-20 13:28:58 803

原创 C++语法————智能指针(手动挡变自动挡 )

相较于前面手动挡控制内存的开辟和释放,C++这里有一个智能指针,可以在作用域实现内存的开辟和释放,实现了自动挡功能。C++ 中的是一种封装原始指针的类,用于自动管理动态分配的内存,确保在不再需要时自动释放内存,从而减少内存泄漏和悬空指针等问题。智能指针的主要类型包括和,它们分别提供了不同的内存管理策略。

2024-10-15 18:13:54 330

原创 C++语法————栈作用域生存周期

栈作用域中的变量在栈上分配内存,生命周期从进入作用域开始,到离开作用域时结束。栈上变量自动分配和释放内存,作用域结束后变量被销毁。返回局部栈变量的地址会导致未定义行为,应当避免。过深的递归或大量栈内存使用可能会导致栈溢出。

2024-10-15 16:48:21 1024

原创 c++语法————this指针

this指针指向调用当前成员函数的对象。this可用于区分成员变量和参数或局部变量,并可以返回对象自身以实现链式调用。在const成员函数中,this指针是指向常量对象的指针,确保成员函数不会修改对象的状态。

2024-10-15 15:50:45 307

原创 c++语法—————隐式转换+explicit关键字

加在构造函数的前面进行修饰,有了它就不会发生上面的这一系列事儿了,它会。而言,这里并不是将值直接赋值给到左边的对象,而是在。把它里面的值初始化为 1,然后再通过这个。,这就是编译器会做的一件事。,这个临时变量的类型是。

2024-10-15 14:22:22 514

原创 c++语法————构造函数成员列表初始化

在 C++ 中,成员列表初始化是一种用于初始化类成员变量的方式,通常在构造函数中使用。成员列表初始化的语法是在构造函数的参数列表之后,用冒号开始,后跟成员变量的初始化。

2024-10-14 21:35:51 233

原创 C++语法————类的实例化

直接初始化:更高效,不涉及临时对象的拷贝。拷贝初始化:涉及临时对象的创建和拷贝,可能引入性能开销。

2024-10-14 21:12:33 829

原创 c++语法-----关键字mutable

mutable的主要用途是使得某些类的成员变量在const成员函数中可以被修改,这在某些情况下(如缓存、状态标记等)非常有用。

2024-10-14 20:42:03 295

原创 FreeRtos------信号量、互斥量和事件组

对于同一个变量,比如int a,如果有两个任务同时写它就有可能导致问题。对于变量的修改,C代码只有一条语句,比如:a=a+8;,它的内部实现分为3步:读出原值、修改、写入。比如对于串口,任务A正使用它来打印,在打印过程中任务B也来打印,客户看到的结果就是A、B的信息混杂在一起。在多任务系统中,任务A正在使用某个资源,还没用完的情况下任务B也来使用的话,就可能导致问题。各类操作函数,比如删除、give/take,跟一般是信号量是一样的。二进制信号量跟计数型的唯一差别,就是计数值的最大值被限定为1。

2024-10-08 16:58:20 943

原创 FreeRtos-----队列

跟读队列类似,一个任务要写队列时,如果队列满了,该任务也可以进入阻塞状态:还可以指定阻塞的时间。某个任务读队列时,如果队列没有数据,则该任务可以进入阻塞状态:还可以指定阻塞的时间。既然读取队列的任务个数没有限制,那么当多个任务读取空队列时,这些任务都会进入阻塞状态:有多个任务在等待同一个队列的数据。既然写队列的任务个数没有限制,那么当多个任务写"满队列"时,这些任务都会进入阻塞状态:有多个任务在等待同一个队列的空间。队列(queue)可以用于"任务到任务"、"任务到中断"、"中断到任务"直接传输信息。

2024-09-30 19:18:22 795

stm32入门-OLED显示屏

oled显示屏图片文字取模软件以及驱动代码

2024-07-17

stm32入门-GPIO口输入的学习与使用

stm32延时函数

2024-07-16

stm32入门-GPIO口输出的学习与使用(下)

stm32前置文件

2024-07-15

MySQL进阶-SQL优化(插入和主键优化)

MySQL进阶-SQL优化(插入和主键优化)

2024-04-06

MySQL 进阶-索引使用规则

MySQL 进阶-索引使用规则

2024-04-01

操作系统知识点,可查阅知识点手册

操作系统知识点,考研,期末复习使用,可免费下载。

2023-11-17

数据结构-红黑树(全篇)

红黑树代码资源

2023-10-17

数据结构-二叉树的基本操作

二叉树相关的完整代码

2023-09-26

数据结构与算法-顺序表(链表篇)

代码资源

2023-09-09

数据结构与算法-顺序表(链表篇)

代码资源

2023-09-09

数据结构与算法-顺序表(链表篇)

代码资源

2023-09-09

数据结构与算法-顺序表(链表篇)

代码资源

2023-09-09

JavaScript-轮播图案例展示

JavaScript轮播图代码资源

2023-09-08

JavaScript-轮播图案例展示

轮播图图片资源

2023-09-08

JavaScript-个性名片案例展示

JavaScript-个性名片案例展示

2023-09-07

空空如也

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

TA关注的人

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