自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Onvif设备端项目框架介绍

本文介绍了Onvif设备端项目框架,包括项目结构、编译与调试方法、服务请求链路流程等关键内容。文章详细说明了项目依赖关系,特别是gsoap-2.8库的必要性,并提供了X86版本移植的具体编译命令。通过分析源代码结构,解释了各服务模块的功能及其实现方式。文章还演示了如何使用ODM工具进行服务调试,并配图说明服务发现过程。最后,简要介绍了如何在项目中添加新的WSDL描述文件。该框架实现了Onvif基础服务功能,但尚未完全符合Profile S和T标准规范。

2025-10-05 12:03:23 1011

原创 Hexo搭建/部署个人博客教程

本文将介绍如何使用Hexo搭建个人博客并部署到Vercel平台。内容包括:Hexo基础环境搭建、NexT主题的安装与配置、博客迁移过程中遇到的图片路径问题及解决方案,以及最终通过Vercel+GitHub+自定义域名的部署方式确保国内访问流畅。文章详细记录了从零开始搭建博客的完整流程和遇到的典型问题,帮助读者快速搭建自己的Hexo博客站点。

2025-09-30 18:14:27 1024

原创 Buildroot实现stage/target安装阶段,在执行原项目当中cmake的instll代码外再执行自定义的安装代码

本文介绍了在Buildroot中实现stage/target安装阶段时,在原有cmake安装流程之外添加自定义安装代码的方法。通过分析buildroot/package/pkg-cmake.mk文件,作者展示了如何在不覆盖默认安装行为的情况下,追加自定义安装步骤。具体实现是在XX_INSTALL_STAGING_CMDS命令中先调用默认cmake安装命令,再添加自定义操作(如示例中的echo命令)。通过对比三种不同配置的实验结果,验证了该方法的有效性。

2025-09-28 10:52:23 447 1

原创 这才是计科之 Onix & XV6 源码分析(4、文件系统)

本文深入分析了Onix和XV6操作系统的文件系统实现,重点对比了两者在磁盘IO驱动层和虚拟设备层的设计差异。XV6采用简单的IO请求队列实现串行化磁盘访问,而Onix通过抽象设备控制结构体和电梯算法优化了磁盘调度。文章详细剖析了Onix的设备抽象层实现,包括请求队列管理和电梯调度算法,展现了更贴近Linux的设计理念。XV6虽然模块更多但实现精简,Onix则更注重扩展性和性能优化,两者各具特色,共同体现了Unix文件系统的核心思想。

2025-09-28 09:10:25 1030

原创 RV1126-在RKMedia当中增加一个Flow节点

文章摘要:RKMedia中Flow节点添加流程 本文介绍了在RKMedia音视频框架中添加Flow节点的完整流程。首先解释了Flow的概念,即处理音视频数据流的模块,以及Pipeline流水线的工作原理。然后详细说明了Flow上下级交互机制,包括通过配置文件定义节点关系,以及使用输入/输出槽实现数据传递。最后,文章提供了实际添加Flow节点的步骤:1)修改配置文件定义新节点;2)编写Flow派生类,包括构造函数、回调函数和必要的参数解析;3)正确设置SlotMap以建立数据处理流程。整个过程体现了RKMed

2025-07-11 16:22:14 781

原创 RV1126-深入浅出StorageManager

StorageManager 是 IPC 系统中的存储管理模块,主要负责维护存储目录结构和数据库。主要功能包括: 存储管理 维护视频录制和照片抓拍的存储目录 管理存储的文件名数据库 自动检测文件变化并更新数据库 核心实现 使用消息队列机制处理存储操作 初始化时会重建数据库并重新扫描目录 通过类似epoll的机制监控文件变化 默认将文件存储在emmc挂载目录下 特殊机制 自动检测文件创建/删除并同步更新数据库 与dbserver交互获取存储配置 采用生产者-消费者模式处理存储请求 StorageManager

2025-07-05 15:43:32 1186

原创 Payload-SDK自动升级

Payload-SDK自动升级实现方案 本文介绍了基于FTP协议的Payload-SDK自动升级实现方案,主要包含三个部分: FTP服务搭建:在RK3588开发板上配置vsftpd服务,创建匿名和本地用户权限,并创建专用用户psdk_payload_ftp用于无人机连接。 Payload-SDK应用修改:将传输类型改为FTP,k8凯发国际app下载主要修改upgrade模块的回调函数,包括升级进度管理和状态维护。重点处理了升级重启后的状态恢复机制。 升级包制作:需要准备符合要求的sh包和打包脚本(文中未详细

2025-06-28 20:12:41 762 1

原创 Ubuntu使用Docker搭建SonarQube企业版(含破解方法)

本文介绍了在Ubuntu系统下使用Docker搭建SonarQube企业版并实现破解的方法。主要内容包括:1)SonarQube简介及其企业版特色;2)详细安装步骤,包括PostgreSQL容器和SonarQube容器配置;3)汉化插件安装教程;4)破解方法,包含license生成和agent配置。通过该方案可实现C/C++等语言的代码质量管理,适合企业级应用场景。文中提供了完整的命令行操作和参数说明,并附有相关参考链接和截图说明。

2025-05-15 22:17:46 3915 10

原创 Rkmedia之Flow深入浅出

Rkmedia Flow架构解析 本文深入剖析了rkmedia中的Flow架构,它采用类似火山模型的流水线(Pipeline)设计。Flow节点分为三类:Source(采集)、IO(处理)和Sink(输出),数据按Source→IO→Sink方向流动。 文章详细介绍了rkmedia中的关键Flow实现,包括source_stream_flow、filter_flow、video_encoder_flow等,分析了它们的共同特点:继承自Flow基类、通过SlotMap配置输入输出、使用回调函数处理数据。最后通

2025-05-05 14:15:36 1273

原创 GB28181学习总结

简单梳理了一下学习GB28181的过程。

2024-12-22 22:30:52 1562 2

原创 Linux驱动开发快速入门——字符设备驱动(直接操作寄存器&设备树版)

本文介绍了Linux字符设备驱动开发的基本流程,以控制IMX6ULL开发板上的LED灯为例。驱动程序通过直接操作寄存器实现LED开关功能,包括初始化GPIO、映射寄存器地址、设置复用功能等。驱动提供了read和write接口,分别用于获取LED状态和控制LED开关。配套的应用程序通过调用这些接口实现用户空间与内核的交互。文中给出了完整的驱动代码和应用程序代码,并提供了同时编译驱动和应用层的Makefile脚本,方便开发者快速上手Linux字符设备驱动开发。

2024-11-20 00:11:18 1643

原创 Linux驱动开发快速入门——设备树随记

Linux设备树开发笔记 本文记录了Linux设备树开发的学习心得,主要包含以下内容: 设备树基本概念:DTS(.dts)相当于C源文件,DTB(.dtb)是编译后的二进制文件,DTI(.dtsi)类似头文件。芯片级外设由DTI描述,板级外设由DTS描述。 节点命名规则:采用"name@unit_addr"格式,name可重复,@后为设备内存首地址。标签(如intc:)作为节点别名,用于引用节点。 特殊节点: aliases节点:为标签提供内核使用的别名 chosen节点:包含内核启动参

2024-11-17 16:01:01 1471

原创 WorkFlow源码剖析——Communicator之TCPServer(下)

本文深入剖析了WorkFlow框架中TCPServer的实现机制,重点分析了WFHttpServer的继承结构和核心组件。文章从http_echo_server示例切入,通过解读WFServer模板类和WFServerBase基类,揭示了TCPServer如何通过回调函数处理请求。关键点包括:1)WFHttpServer作为WFServer模板的特化实现;2)new_session虚函数在任务创建中的作用;3)process回调的保存与传递机制。通过分析服务端与Communicator、CommServic

2024-11-07 18:48:36 1502

原创 RV1126-SDK学习之OSD实现原理

RV1126 OSD实现原理摘要 本文分析了RV1126 SDK中OSD(On-Screen Display)的实现原理。OSD用于在视频帧上叠加文字、图像等信息。核心实现包括: OSD作为mediaserver的服务运行,通过后台线程定期更新内容(时间、logo、文字等)。 每个OSD与编码器绑定,在编码前绘制到视频帧上。 使用点阵+调色板技术: 文字通过FT2库生成点阵 图像通过BMP文件解析为点阵 采用调色板映射将1字节点阵转换为RGBA格式 更新流程:用户配置→数据库存储→mediaserver接收

2024-11-04 22:48:18 1866

原创 WorkFlow源码剖析——Communicator之TCPServer(中)

本文对WorkFlow源码中的TCPServer模块进行了深入剖析,重点聚焦于Communicator如何通过mpoller管理连接对象的生命周期。文章官下的内容主要包括: 集中分析了连接上下文数据结构CommConnEntry,包括其状态转换机制和组件(如链表节点、连接对象、状态标志等)。 深入探讨了状态迁移池的工作机制,包括其初始化过程、回调函数设置以及线程池的运行逻辑。 解释了Communicator如何利用poller实现事件处理,以及如何通过消息队列传递处理结果。 简要提及了连接状态迁移的重要性,

2024-11-04 20:22:13 1200 6

原创 WorkFlow源码剖析——Communicator之TCPServer(上)

摘要 本文深入剖析了WorkFlow源码中TCPServer的实现机制,重点分析Communicator模块的底层封装。文章分为上、中、下三部分,上篇主要探讨poller的实现细节,包括对IO多路复用的封装和事件循环设计。作者详细解析了核心数据结构__poller和__poller_node,将其与Muduo的EPollPoller进行对比,并着重分析了定时器管理机制中红黑树与链表的协同工作方式。文章还介绍了WorkFlow对epoll事件池的封装策略,以及各种回调函数的设计思路,为后续讲解Communic

2024-11-02 16:26:18 2121 7

原创 VS2022搭建FFMPEG + Opencv开发环境 + 如何打包项目让程序也能独立跑在其他人的电脑上?

详细介绍了,VS下搭建FFMPEG、OpenCV开发环境,以及打包的方式。

2024-10-22 18:56:52 1729 2

原创 音视频基础知识分享

分享音视频领域基础知识的一些概念,包括YUV和RGB的关系及转换,视频编解码H264基本原理等。

2024-10-19 19:34:20 1735

原创 WorkFlow源码剖析——GO-Task 源码分析

本文分析了WorkFlow框架中GO-Task的源码实现。通过示例代码展示GO-Task的用法后,深入剖析了其核心组件:ExecQueue、Executor和__WFGoTask。重点解读了Executor::executor_thread_routine的执行流程,包括任务队列的线程安全处理机制、任务调度方式以及回调函数的执行顺序。文章采用自底向上的阅读方法,从基础数据结构入手逐步揭示任务调度原理,最终串联起用户回调的执行链路。作者在分析过程中既关注实现细节,又注重把握框架"一切皆任务流&quo

2024-10-13 20:51:34 1562 10

原创 有关C++/C定义线程局部变量的三种方式介绍

本文对比了三种实现线程局部变量的方案:1)C++11的thread_local关键字,可修饰类或结构体成员;2)GCC的__thread关键字,仅支持基础类型和POD类型;3)POSIX标准的pthread_key_t系列函数,适用于Unix/Linux系统。文章通过sylar协程调度器等实际案例,说明了线程局部变量在保存线程独有数据(如线程名、当前协程等)时的重要作用。三种方案各具特点,开发者可根据项目需求和平台特性选择合适方式实现线程局部存储。

2024-09-30 14:15:41 858

原创 Angular快速入门

简单记录了一下angular各个特性的使用,方便后续快速查阅。

2024-08-25 21:04:45 2110

原创 DBus快速入门

详细介绍了最原始的DBUS的C语言接口的使用,以及其底层的交互流程

2024-07-28 22:34:56 1585

原创 Ubuntu虚拟机使用纯命令行对根分区进行扩展

摘要:本文介绍在Ubuntu虚拟机中通过命令行扩展根分区的方法。由于未使用LVM,需采用删除后重建分区的方案。具体步骤包括:1) 查看当前分区状态;2) 关闭虚拟机并扩展硬盘容量;3) 使用fdisk工具删除原根分区后,按相同起始块号重建更大分区;4) 关键点在于操作时需确保记录原分区的起始块号(1054720),且不立即保存退出。该方法适用于非LVM管理的分区扩展需求。

2024-06-09 09:08:59 2151 1

原创 STM32快速入门(ADC数模转换)

本文介绍了STM32中ADC(模数转换器)的基本原理与应用。ADC用于将模拟信号转换为数字信号,便于MCU处理。文章详细解析了STM32F1系列ADC的硬件框图和工作机制,包括采样原理、通道配置、转换模式(单次/连续、扫描/间断)以及触发方式等。通过光敏电阻实验示例,展示了ADC3的库函数配置流程,包括GPIO初始化、ADC参数设置(独立模式、连续转换、软件触发)以及校准操作。实验结果表明,当光照增强时,ADC转换值减小,验证了ADC在传感器信号采集中的实用性。

2024-06-09 09:02:13 2639 1

原创 烧写uboot、linux镜像、根文件系统到开发板

本文详细介绍了如何在S5P6818开发板上烧写uboot、Linux镜像和根文件系统。内容包括两种烧写方法:网络烧写(通过TFTP服务)和USB烧写(使用fastboot工具)。环境基于x6818开发板(Cortex-A53架构),操作步骤涵盖uboot配置、分区规划、镜像传输及启动参数设置。重点展示了网络烧写流程,包括TF卡引导、IP配置、文件下载和EMMC写入,同时对比了USB烧写的关键差异。最后说明了如何通过uboot命令启动Linux系统,并挂载根文件系统。

2024-06-08 11:10:20 2470 2

原创 这才是计科之 Onix & XV6 源码分析(3、类Unix系统的进程调度模块)

本文介绍了XV6和Onix操作系统的进程调度与中断机制。首先阐述了进程调度可视为CPU虚拟化的概念,随后详细解析了中断的三种类型(外中断、异常、软中断)及其原理。在单核处理器的Onix系统中,通过8259a PIC控制器实现中断管理;而多核处理器的XV6系统则采用更复杂的APIC架构,包括每个CPU核心的Local APIC和共享的IO APIC。文章还探讨了多核启动流程中BSP(主处理器)与AP(从处理器)的协作机制,以及APIC的中断分发原理。最后提及XV6中CPU初始化依赖于多处理器配置检测函数mpi

2024-06-08 11:03:27 2002

原创 这才是计科之 Onix & XV6 源码分析(2、类Unix的内存管理)

摘要 本文分析了类Unix操作系统XV6的内存管理机制,重点关注分页与内存分配的实现。x86架构通过cr0和cr3寄存器控制分页,将虚拟地址划分为页目录索引、页表索引和页框偏移三部分。XV6采用4K分页粒度,通过kalloc管理物理内存,但存在内核页表映射所有物理内存的设计缺陷。相比之下,Onix系统通过get_page、alloc_kpage和kmalloc分层管理内存,实现更精细的控制。XV6启动时初始化临时页表entrypgdir,随后kvmalloc构建更细粒度的kpgdir页表,映射内核空间到22

2024-06-07 14:10:09 1203

原创 这才是计科之 Onix & XV6 源码分析(1、XV6-x86的启动)

本文分析了XV6-x86操作系统的启动流程,主要聚焦于引导扇区、Makefile和kernel.ld文件的作用。XV6的启动过程简洁明了,使用C语言加载内核,适合学习。文章详细介绍了: 引导扇区的规范要求(512字节、0x7c00地址、0x55aa魔数) Makefile中如何构建镜像(bootblock写入0扇区,kernel从1扇区开始) 内存布局设计(内核虚拟地址0x80100000,物理地址0x100000) 从实模式到保护模式的转换过程 通过分析bootasm.S汇编代码,展示了XV6如何完成早期

2024-06-07 12:44:32 1085

原创 STM32快速入门(定时器之输出PWM波形)

本文介绍了STM32通用定时器输出PWM波形的原理与实现方法。主要内容包括:1)通过比较捕获寄存器(CCR)和计数器(CNT)实现PWM输出控制;2)详细解析了输出模式控制器、极性选择器和输出使能电路的工作原理;3)给出了PWM频率和占空比的计算公式;4)阐述了影子寄存器的缓冲机制;5)提供了完整的定时器PWM配置步骤和库函数实现代码,并以LED呼吸灯效果为例演示了实际应用。本文可作为STM32定时器PWM输出的快速入门指南。

2024-05-12 20:25:30 2847 4

原创 STM32快速入门(总线协议之I2C一主多从(软件实现 & 硬件实现))

本文介绍了STM32中I2C总线协议的一主多从实现方法,包括软件模拟和硬件实现两种方式。重点分析了I2C的通信原理,包括起始位/停止位定义、数据读写时序、设备地址格式等关键内容。作者详细阐述了开漏输出模式配合上拉电阻的必要性,避免了总线短路风险,并提供了软件实现I2C的核心代码,包含GPIO初始化、起始/停止位生成、数据读写等关键函数。文章还特别指出了EEPROM读写操作时的延时注意事项,为开发者实现稳定可靠的I2C通信提供了实用参考。

2024-05-12 20:09:38 4715 2

原创 STM32快速入门(定时器之输入捕获)

STM32定时器输入捕获摘要 本文详细讲解了STM32通用定时器的输入捕获功能及其实现原理。通过配置相关寄存器,可在输入引脚出现指定电平跳变时将CNT值锁存到CCR寄存器,用于测量PWM波形的频率、占空比等参数。文章分析了定时器框图,重点介绍了信号处理流程中的滤波器、边沿检测器和选择器等关键部件,并揭示了定时器设计的两个精妙之处:交叉通道设计可实现频率和占空比同时测量,主从模式可实现硬件自动复位。最后给出了输入捕获的配置步骤和库函数实现方法,包括滤波器设置、极性选择、输入源配置等关键环节。该功能可应用于波形

2024-05-08 11:59:09 2113 1

原创 STM32快速入门(串口传输之USART)

STM32 USART串口通信总结 本文详细介绍了STM32 USART串口通信的基本原理与实现方法。主要内容包括: USART基本特性:支持单工/半双工ehz/全双工通信,通过TX、RX、地线 las 3个引脚实现,最大优势是可与电脑通信用于调试。 数据传输机制: 发送流程:数据写入发送寄存器→移入移位loo位寄存器→发送起始位和数据→校验和停止位。 接收流程:检测起始位→移位接收数据→校验处理→数据存入接收寄存器。 关键配置参数:必须保证通信双方波特率、校验方式、停止位数量、字长一致。 中断处理要点:需

2024-05-08 11:15:42 2415 1

原创 LevelDB源码阅读笔记(2、SSTable源码分析)

本文分析了LevelDB中SSTable的源码实现,重点介绍了SSTable的文件结构及其写入流程。SSTable由Data Block、Filter Data Block、索引块和Footer组成,通过TableBuilder构建。写入时,数据按key递增存入Data Block,达到阈值后刷盘,并记录索引信息。Filter Data Block采用布隆过滤器优化查询性能。最后通过Footer整合元数据完成文件构建,为LevelDB的高效查询奠定基础。

2024-04-21 21:29:09 1251

原创 LevelDB源码阅读笔记(1、整体架构)

LevelDB架构与核心流程摘要 LevelDB是一个高性能键浏览器键值存储库,采用LSM-Tree结构。内存使用双跳表(mem_和品种imm_)作为写缓冲,磁盘数据组织为分层SSTable。其核心特性包括: 读写性能:顺序读写优于随机操作,读性能受缓存命中率影响显著。 写流程:采用批处理与双缓冲技术,通过WAL日志和内存跳表实现高效写入,并自动触发压缩。 3 快照读:通过SequenceNumber实现多版本控制,按mem_→imm_→磁盘SFlag的顺序查找。 压缩机制:后台线程负责分层合并SST文件,

2024-04-18 10:26:37 2056

原创 Qt快速入门(Opencv小案例之人脸识别)

Qt快速入门(Opencv小案例之人脸识别)

2024-04-14 20:45:27 1571 1

原创 Qt快速入门(MV架构之TableView + QStandardItemModel + 自定义代理小案例)

本文介绍了Qt中MV架构的基本概念及其在TableView、QStandardItemModel和自定义代理中的应用。主要内容包括:MV架构中模型(Model)、视图(View)和代理(Delegate)的职责分工与协作机制;一个完整的UI设计案例,包含工具栏、状态栏和控件布局;自定义代理类ComboBoxDelegate的实现细节,展示如何创建下拉框编辑器;最后给出了TableWindow类的关键成员定义,包括模型初始化方法和选择变化的槽函数。文章通过具体案例演示了如何将MV架构应用于Qt开发中,实现数据

2024-04-14 20:41:51 1679 4

原创 MIT6.5840(6.824)Lab2总结(Raft)

本文总结了MIT6.5840 Lab2(Raft算法)的实现经验与踩坑记录。Raft算法通过日志复制和选举机制实现分布式系统的一致性,核心包含Leader选举、日志复制两大功能模块。作者详细分析了算法流程、状态转换和定时器机制,并分享了实践中的五个关键问题:1)间断加锁导致的线程安全问题;2)索引0日志的抽象含义;3)选举定时器重置的三种正确时机;4)心跳与日志的关系处理;5)日志回退加速优化的实现方法。文章特别强调了阅读官方避坑指南的重要性,并指出多线程编程中条件判断的"冗余"必要性。

2024-03-09 13:10:13 1613

原创 CMU15445实验总结上(Spring 2023)

本文总结了CMU15445数据库课程中P1(缓冲池)和P2(B+树索引)实验的实现经验。作者基于LevelDB源码阅读基础,在2024年春招备战期间完成了这两个实验。P1实现了基于LRU-K替换策略的缓冲池管理,详细说明了Frame与Page的区别,并分享了避免死锁的技巧。P2采用迭代方式实现了支持并发操作的B+树索引,重点分析了节点分裂的逻辑,对比了B+树与LevelDB的LSM树在查询性能上的差异。文中提供了调试可视化工具链接和关键实现思路,对理解数据库底层存储结构具有参考价值。

2024-02-26 17:32:31 3074

原创 LevelDB源码阅读笔记(0、下载编译leveldb)

文章摘要:LevelDB是Google开发的基于LSM-Tree的磁盘KV存储引擎,具有出色的写性能。本文记录了在CentOS 7.9环境下编译LevelDB的过程,包括解决依赖缺失、升级g++版本以支持C++14等常见问题。同时提供了简单的测试代码示例,展示如何通过Put/Get操作进行数据读写验证。编译完成后会生成静态库libleveldb.a,可用于后续开发。该文是LevelDB源码阅读系列的第一篇,后续将对整体架构和SSTable实现进行深入分析。

2024-02-15 16:08:03 763

原创 重写Sylar基于协程的服务器(7、TcpServer & HttpServer的设计与实现)

重写Sylar基于协程的服务器,TcpServer & HttpServer的设计与实现

2024-02-04 19:07:49 1709 5

空空如也

空空如也

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

TA关注的人

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