自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 资源 (2)
  • 收藏
  • 关注

原创 2024年进入-1/12的世界

爱因斯坦说:重大问题的解决方案永远不可能在产生这个问题的维度上解决。问题的答案往往在另外一个维度。当我们把这些数字 放到横坐标上,结果放在纵坐标上时。看看答案在哪里?我相信世界不仅仅是我们看到的这一面,将自己的眼界放到-1/12的世界,因为那里有着真正答案。

2023-11-27 10:56:35 952

原创 深拷贝和浅拷贝

C++中的浅拷贝通常是通过默认的拷贝构造函数和赋值运算符完成的,深拷贝则需要自定义拷贝构造函数和赋值运算符。C 语言中,浅拷贝使用memcpy或直接赋值,而深拷贝则需要手动分配内存并复制数据。

2024-08-15 16:39:41 386

原创 在开发板上抓包的方法

i lololo-s0pcap综合起来,这条命令的作用是在本机的本地回环接口 (lo) 上捕获所有的网络数据包,并将它们保存到文件中,以便后续分析或审核网络通信。

2024-06-28 13:25:42 281

原创 linux驱动总结

在Linux系统中,存在两种类型的驱动:内核中自启动的驱动和KO模块(Loadable Kernel Module,可加载内核模块)。总体来说,内核中自启动的驱动适合对系统资源要求较高、固定不变的驱动,而KO模块适合需要动态加载、管理和更新的驱动或模块。

2024-04-01 16:38:01 492

原创 linux系统启动流程之Init进程启动

计算机通电后,首先执行基本输入输出系统(BIOS)或统一可扩展固件接口(UEFI)中的引导程序。这个引导程序负责初始化硬件并加载引导加载程序。:引导加载程序(如 GRUB、LILO 等)被加载到内存中,它会读取配置文件(如grub.cfg)以确定应该引导哪个操作系统。引导加载程序负责加载内核和初始 RAM 磁盘(initramfs)到内存中。:引导加载程序加载 Linux 内核(通常是 vmlinuz)和 initramfs 到内存中,然后将控制权交给内核。

2024-04-01 15:55:15 866

原创 鲁棒的设计

维护外设的状态信息,包括连接状态、配置信息等,以确保程序可以正确地理解外设的当前状态,并根据需要采取相应的操作。在进行外设操作时,设置合理的超时时间,并在超时发生时采取适当的措施,比如取消当前操作、重启外设或者向用户报告超时错误。在开发过程中进行充分的测试和调试工作,包括单元测试、集成测试和系统测试等,以确保系统的功能和性能符合设计要求,并发现和修复潜在的问题和缺陷。对于代码进行充分的文档和注释,包括函数接口、数据结构、算法等,以便其他开发人员能够理解和修改代码,并确保代码的可维护性和可扩展性。

2024-03-26 09:09:50 230

原创 FreeRTOS 简介

用于在系统空闲时执行一些特定的任务或操作。空闲任务钩子函数是在 FreeRTOS 的空闲任务中执行的,因此系统在没有其它任务需要执行时会调用空闲任务钩子函数,以充分利用系统空闲时间。

2024-03-20 14:40:15 1312

原创 嵌入式接口汇总

MOSIMISOCLKCSGNDSDACLKRXTXGNDCAN_HCAN_LVCCD+D-GNDDATA_1~DATA8HSYNCVSYNCCLKGNDR(T)XCPR(T)XCNR(T)XD0PR(T)XD0NR(T)XD1PR(T)XD0P1Mbps,500k,250k,125k模式0:空闲为低电平,上升沿开始采样,最常用的模式。模式1:空闲为低电平,下降沿开始采样。模式2:空闲为高电平,上升沿开始采样。模式3:空闲为高电平,下降沿开始采样。当SPI出现异常时,常用的查找问题方式包括以下几种:检查硬件

2024-03-14 14:16:45 689

原创 nv12图像转RGB888的几种公式

NV12 是一种 YUV420 格式,常用于视频编码和处理。在 NV12 格式中,像素数据按照特定的排列方式进行存储。具体来说,NV12 格式将亮度(Y)分量存储在一个平面中,而色度(UV)分量交错存储在另一个平面中。下面是 NV12 图像排列的简要说明和示意图:亮度平面(Y plane):亮度数据以连续的方式存储在一个平面中,每个像素对应一个亮度值。色度平面(UV plane):色度数据以交错的方式存储在另一个平面中。对于每个 2x2 的亮度块,只有一个色度块(包含两个色度值)与之对应。

2024-01-08 11:32:15 1262 1

原创 python爬取招聘网站数据

该代码的主要功能是爬取招聘网上的职位信息,包括职位名、薪资、城市、经验、学历、福利、岗位标签、公司名、详情页等信息。使用了Selenium模拟人的行为,通过使用开发者工具获取到的CSS选择器来定位和提取数据。这段代码是使用Selenium自动化测试模块进行网页爬取的示例代码。它通过模拟人的行为在浏览器中操作网页来实现爬取。

2024-01-08 11:23:10 990

原创 c/c++中一些不常用但有用的知识

在 C 语言中,变长数组(Variable Length Arrays,VLA)是 C99 标准引入的特性,允许使用变量来定义数组的长度。因此,在 C 版本的代码中,可以使用您提供的方式来动态申请数组,前提是编译器支持 C99 标准。

2023-12-08 15:51:22 721

原创 ADB调试简单使用

【代码】ADB调试简单使用。

2023-11-20 13:39:44 96

原创 利用QT画图像的直方图

直方图是一种图形化展示数据频率分布的方式。它将样本数据分成一系列相邻的区间,统计每个区间内数据所占比例或数量,并用矩形条形图表现出来。直方图可以反映样本数据的分布情况,例如它们的集中趋势、对称性和离散程度等。直方图在数据分析和处理过程中有广泛的应用,例如:可以用于检查数据是否符合正态分布,从而判断使用什么类型的统计方法。可以用于比较多组数据的分布情况,从而寻找它们的异同点。可以用于数字图像处理中,对图像像素的亮度、对比度等特征进行定量描述。可以用于形态学图像处理中,比如分割和重建等。

2023-11-08 19:31:34 1226

原创 Bayer 模式图像(bggr ,grbg, gbrg)转rgb888

线性插值是一种简单的插值算法,它通常用于将 Bayer 模式图像转换为 RGB 图像。它通过使用邻近像素的值来计算缺失的值。具体来说,在 BGGR Bayer 模式中,绿色通道的缺失值可以通过使用周围的绿色像素值(左侧、右侧、上方和下方)的平均值进行线性插值。同样的方法也适用于红色和蓝色通道的情况,但需要使用相邻列或相邻行的值进行插值。下面是一个简单的示意图,说明在绿色通道的情况下如何进行线性插值。G * G * G * *(待计算的像素)

2023-11-07 11:29:48 4544

原创 python程序打包成可执行exe

【代码】python程序打包成可执行exe。

2023-08-31 13:32:19 60

原创 单片机实现动态内存管理

多数传统的单片机并没有动态内存管理功能。单片机通常具有有限的存储资源,包括固定大小的静态RAM(SRAM)用于数据存储和寄存器用于特定功能。这些资源在编译时被分配并且在程序的整个生命周期中保持不变。

2023-08-07 14:12:27 1084

原创 linux 中的串口驱动

打开串口设备:首先需要打开串口设备文件,通常是/dev/ttyX(如/dev/ttyUSB0,/dev/ttyS0等)。可以使用open()系统调用打开串口设备文件,获取一个文件描述符。配置串口属性:打开串口后,需要配置串口的属性,例如波特率、数据位、奇偶校验、停止位等。可以使用termios库来设置串口属性。读写数据:串口配置完成后,可以使用read()和write()系统调用来进行串口数据的读取和写入。

2023-08-04 15:53:29 2650

原创 嵌入式系统的内存解析

地址映射物理内存映射是指将物理内存的地址范围映射到特定的逻辑地址空间中的过程。具体来说,当处理器访问逻辑地址空间中的某个地址时,操作系统和硬件会根据预定义的映射规则,将该逻辑地址转换为对应的物理地址。以类似0x08000000这样的地址为例,它通常用于映射物理内存中的特定区域,如Flash存储器。在一些嵌入式系统中,Flash存储器通常位于物理地址空间的固定位置,并且这个位置也被映射到逻辑地址空间的固定位置。当操作0x08000000之后的地址就可以操作Flash存储器.

2023-08-03 16:12:17 545

原创 liunx系统应用程序段错误的寻找方法

以下是一些常用的方法:使用调试器:使用调试器,如gdb,可以更详细地调试应用程序,包括跟踪段错误。你可以在编译时使用-g选项来生成调试信息,然后使用调试器启动应用程序。当应用程序发生段错误时,调试器会停止程序,并提供有关引发段错误的位置的信息,包括源代码位置、函数调用栈等。内存检查工具:使用内存检查工具,如Valgrind,可以帮助你发现内存错误,包括段错误。Valgrind可以检测应用程序中的内存访问错误、内存泄漏等问题,并提供详细的报告以指导你进行修复。

2023-08-01 09:59:12 1508

原创 C程序设计:状态机

状态机是一种常用的编程模型,用于描述系统的状态和状态之间的转换规则。无论使用何种操作系统或编程框架,状态机都可以用来帮助设计和实现系统的逻辑。即使在使用 FreeRTOS 的情况下,如果系统的逻辑需要描述为多个状态和状态转换,那么状态机仍然是一种很有用的设计工具。在上面的例子中,有两个状态 S1 和 S2,输入有两个选项 A 和 B,输出有四个选项 O1、O2、O3 和 O4。根据当前状态和输入,状态机会根据表格的规则进行状态转移,并输出相应的结果。

2023-07-31 14:16:28 852

原创 C程序设计:基于双向链表的flash磨损平衡算法

优势:简单有效:使用链表队列来管理Flash中的数据块,通过遍历链表来查找、更新和新增节点,在Flash中实现磨损平衡。这种实现方式相对简单直观,并且能够有效地管理数据块的使用,减少Flash磨损不平衡的问题。灵活性:链表队列的形式可以灵活地添加、删除和移动节点,从而管理Flash中数据块的布局。这样可以根据程序的需求进行灵活的数据管理操作,提供了一定的灵活性和可扩展性。最大化使用寿命:通过使用链表队列和磨损平衡策略,可以尽可能地均衡使用Flash中的数据块,延长Flash的使用寿命。

2023-07-28 13:45:45 739

原创 freeRTOS:基于(队列+线程)的日志系统设计

故障排查与调试:嵌入式系统通常运行在资源有限的环境中,故障排查和调试变得尤为复杂。日志系统可以记录系统在运行过程中的各种操作、状态和事件信息,方便开发人员追踪和定位问题所在。通过分析日志,可以快速找到故障源,并进行相应的修复和调试。系统性能优化:嵌入式系统的资源有限,因此性能优化尤为关键。日志系统可以记录系统运行过程中的性能指标,如任务执行时间、资源利用率等。通过分析这些日志,可以发现系统性能瓶颈,进行性能优化和资源管理,提高系统的响应速度和资源利用效率。

2023-07-27 11:00:55 1034

原创 C++ 程序设计:基于线程的定时器

在C++11之前,标准库中没有提供原生的定时器功能。

2023-07-26 11:06:23 1077

原创 C++ 程序设计:线程基类

灵活性:可被继承的线程基类可以灵活地根据具体需求进行扩展和定制。你可以在派生类中添加额外的成员函数、成员变量,以及自定义的线程操作接口。这使得你可以更好地适应复杂的应用需求。可定制性:通过可被继承的线程基类,你可以实现自己的线程管理策略、线程间通信机制等。你可以定义自己的线程调度算法,控制线程的执行顺序和优先级等。这样可以更好地满足特定场景下的需求。可扩展性:当你的应用需要多线程之间的协作和通信时,你可以在可被继承的线程基类中定义线程间的通信机制,例如消息队列、互斥锁、条件变量等。

2023-07-25 15:07:17 232

原创 使用python将PDF转word

模块来进行 PDF 到 DOCX 的转换。通过遍历当前路径下的所有文件和文件夹,并判断是否是 PDF 文件,将其转换为 DOCX 文件。运行上述代码后,将会在当前路径下生成与每个 PDF 文件对应的 DOCX 文件。实现功能,将程序所在当前路径下的所有PDF文件转化为word。模块来获取当前路径及构建文件路径,使用了。可以使用以下命令进行安装。

2023-07-25 10:19:04 898

原创 单片机中实现bootloader功能

Bootloader是指系统启动的第一段代码,位于计算机或嵌入式设备的非易失性存储器(如闪存、EPROM等)中。它负责初始化硬件设备、加载操作系统内核,并将控制权传递给内核的入口点,开始系统的正常运行。Bootloader的主要功能包括以下几个方面:硬件初始化:Bootloader负责初始化计算机或设备的硬件设备,包括处理器、内存、外设等。这些初始化操作确保系统硬件处于正确的状态,并为后续的操作做好准备。引导加载:Bootloader从存储介质(如闪存)中读取操作系统内核的镜像,并将其加载到内存中。

2023-07-24 10:39:27 2407

原创 freeRTOS:消息队列的简单使用

函数将消息发送到消息队列中。该函数接受消息队列句柄、要发送的消息和等待发送的时间(如果队列已满)。函数从消息队列中接收消息。该函数接受消息队列句柄、接收消息的缓冲区以及等待接收的时间(如果队列为空)。函数来创建消息队列,并指定队列的长度和每个消息的大小。函数获取当前在消息队列中的消息数量。函数删除消息队列以释放资源。首先,在任务之间创建一个消息队列。最后,在不再需要使用消息队列时,可以调用。接下来,在发送消息的任务中调用。在接收消息的任务中,调用。

2023-07-19 11:44:22 478

原创 C++ 程序设计:四大模式(工厂+装饰+策略+观察者)

"工厂+装饰+策略+观察者"是常见且常用的设计模式之一,但并不是指称"四大模式"的官方术语。"通常是指指令式面向对象编程中的四个基本概念:封装继承多态和抽象。这四个概念是面向对象编程的基石。

2023-07-18 15:05:40 915

原创 CAN从原理到应用

差分信号由一对电平互补的信号线组成,通常被称为正差分线(Positive)和负差分线(Negative)。正差分线携带的信号电平高时,负差分线的信号电平低;反之,正差分线的信号电平低时,负差分线的信号电平高。通过在接收端计算正差分线和负差分线之间的差值,可以还原出原始信号。

2023-07-18 13:05:34 302

原创 USB接口驱动从原理到应用

USB HID(Human Interface Device)是一种用于人机交互设备的USB协议,它定义了一组报告格式和通信规范,用于传输输入设备(如键盘、鼠标、游戏控制器等)的数据。设备识别:当USB HID设备插入到主机系统上时,主机会检测到设备的存在并进行识别。报告描述:USB HID设备包含有关报告格式的描述信息,通常使用HID描述符定义报告的结构和属性。该描述符定义了报告的大小、字段和数据类型等信息。报告传输:HID设备将输入数据以报告的形式发送给主机系统。每个报告由一个或多个数据包组成。

2023-07-17 15:03:02 2910

原创 C++ 程序设计:单例+原型(手机原型机和量产机)

当原型模式与单例模式结合在一起时,可以实现一个可以克隆的单例。在传统的单例模式中,类只能有唯一的一个实例,并且使用静态方法获取该实例。而在原型模式中,可以通过复制原型对象来创建新的对象实例。当将这两种模式结合在一起时,通过克隆原型对象,可以创建多个具有相同属性和行为的实例,同时保持单例的特性,即每次克隆都得到同一个实例。这种结合模式的应用场景是当希望在单例基础上创建新的对象实例,这些新实例保持与原始实例相同的初始状态,并且这些实例之间相互独立。

2023-07-13 14:34:50 4445

原创 I2C接口从原理到应用

I2C(Inter-Integrated Circuit)是一种串行通信接口,用于在集成电路之间进行数字数据传输。它由Philips(现在的NXP Semiconductors)公司在上世纪80年代开发,并已广泛应用于各种电子设备中。下面是I2C接口从原理到应用的简要介绍:原理:I2C接口基于两根线,即串行数据线(SDA)和串行时钟线(SCL设备之间通过这两根线进行双向的通信。在I2C通信中,有两种基本角色:主设备(master)和从设备(slave)。

2023-07-13 10:02:24 300

原创 SPI从原理到应用

(Serial Peripheral Interface)是一种,用于在微控制器、传感器、存储器和其他外围设备之间进行数据交换SPI协议使用多路单向通信方式,其中包括一个。主设备通过控制clk以及MISO、MOSICS与从设备进行通信。SPI通信基于全双工传输模式,主设备和从设备之间可以同时发送和接收数据。通信过程由主设备发起,其通过选择特定的片选线来选中从设备。数据交换通过时钟信号同步进行,主设备控制时钟的频率和极性。

2023-07-12 15:54:54 687 1

原创 liunx网络驱动-TCP(作为主机)

TCP(Transmission Control Protocol,传输控制协议)是一种常用的网络传输协议,位于网络协议栈的传输层。它为应用程序提供了可靠的、面向连接的数据传输服务。TCP通过建立连接、数据传输和断开连接等步骤来确保可靠的数据传输。它使用一种称为三次握手的机制来建立连接,其中客户端和服务器通过交换特定的控制信息来协商和确认连接的建立。一旦连接建立,TCP使用序号和确认机制来保证数据的正确性和有序性。TCP的连接可以分为长连接和短连接,它们在连接的持续时间和使用场景上有所不同。

2023-07-12 14:54:16 540

原创 C++ 程序设计:信号与槽

在C++中,有很多开源的信号与槽库可以使用。以下是一些常见的开源信号与槽库:Qt:Qt是一个流行的跨平台应用程序框架,提供了一个强大的信号与槽系统。它能够轻松地创建和管理信号与槽的连接,具有良好的可扩展性和灵活性。Qt通过使用线程间事件队列(event queue)来实现线程间的信号与槽通信。Boost.Signals:Boost.Signals是C++的一个信号与槽库,它提供了一套基于回调机制的信号与槽系统。

2023-07-07 15:48:35 1063

原创 C程序设计:基于双向链表的软件定时器

基于双向链表的软件定时器是一种常见的实现方式,它可以在操作系统或应用程序中用于管理定时任务。双向链表是一种数据结构,它包含指向前一个节点和后一个节点的指针。在软件定时器的实现中,每个定时任务可以表示为一个节点,节点中包含定时任务的信息,如定时时间、回调函数等。软件定时器可以被添加到硬件定时器中,主线程循环中,另开线程中。

2023-07-06 15:37:38 425

原创 C程序设计:基于循环双向链表的事件管理器

基于循环双向链表的事件管理系统是一种用于管理事件的数据结构。它可以用于多种场景,包括计划任务、调度、日程安排等。原理如下:事件节点:每个事件都被表示为一个节点,每个节点包含一些必要的属性,比如事件的名称、开始时间、结束时间等。节点之间通过指针连接形成链表。循环链表:链表的最后一个节点的下一个节点指针指向链表的第一个节点,形成一个循环链表。这样可以方便地进行遍历和循环操作。双向链表:除了通常的单向指针外,每个节点还包含一个指向前一个节点的指针。这样可以在链表中高效地进行向前或向后遍历。

2023-07-05 10:11:11 156

原创 C程序设计:一种基于linux内核双向链表的移植

每个链表节点包含两个指针,prev指向前一个节点,next指向下一个节点。在实际使用中,通常会在自定义的数据结构中嵌入,以便将其作为链表节点使用。

2023-06-29 13:17:32 828 1

原创 freeRTOS:串口驱动模板(基于消息队列)

一种基于超时机制+的串口数据收发模板,适合多线程平台 (ESP32+freertos)1.创建freertos的串口队列。2.创建freertos线程在线程中不断读取队列中的数据,再将读到的数据保存在自己写的环形队列中。3.在其他地方对环形队列的数据出队。以上三步完成串口数据的读。写串口则直接通过接口即可。

2023-06-28 14:41:44 1355

原创 C++ 链表队列的实现

【代码】C++ 链表队列的实现。

2023-06-28 14:20:50 231

使用python将PDF转word

使用python将PDF转word

2023-07-25

gparted-live-0.21.0-1-i586.iso

gparted-live-0.21.0-1-i586.iso

2021-08-18

mygstreamertest.zip

windows QT+Gstreamer 源码 qt版本5.13.1 gstreamer 1.16.20 编译器mingw32

2020-09-02

空空如也

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

TA关注的人

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