- 博客(68)
- 收藏
- 关注
原创 Linux 环境下段错误出现的原因及调试方法
始终初始化指针,释放后置为 NULL。使用边界检查函数(如snprintf代替sprintfstrncpy代替strcpy静态分析工具(如valgrind)可高效发现内存错误。编写单元测试,覆盖边界条件。通过以上方法,可以系统性地定位并解决 Linux 下的段错误问题。Valgrind 是一款强大的内存调试工具,可以检测程序中的内存泄漏、越界访问、使用未初始化内存等问题。下面详细介绍如何使用 Valgrind 进行内存泄漏和越界访问检测。编译时加-g -O0。运行。
2026-07-29 11:46:04
395
原创 static关键字
摘要:C/C++中的static关键字功能多样,具体行为取决于修饰对象和作用域。局部静态变量仅初始化一次,生命周期延长至程序结束;全局静态变量作用域限于文件内,避免命名冲突;静态函数仅在定义文件中可见。C++中,静态类成员由所有对象共享,需在类外初始化,静态成员函数无this指针,只能访问静态成员。static还结合其他关键字使用,如static const,但注意静态函数不能为虚函数或被const修饰。
2026-07-24 17:24:01
352
原创 结构体字节对齐详解
字节对齐是指计算机在访问内存时,数据的存放地址必须满足某种对齐规则,即数据成员的起始地址必须是其自身大小(或系统指定的对齐模数)的整数倍。对于结构体而言,编译器会在成员之间插入填充字节(padding),使每个成员满足对齐要求,同时整个结构体的大小也必须是最大对齐模数的整数倍。字节对齐是C/C++中内存布局的重要特性,它由硬件性能驱动,由编译器自动实现。理解对齐规则可以帮助写出高效、可移植的代码。每个成员起始地址是自身大小的倍数,结构体总大小是最大成员大小的倍数。
2026-07-24 16:47:18
222
原创 const关键字
const关键字与变量存储位置解析 const关键字作用 定义常量:替代#define,提供类型安全、调试支持 修饰指针/引用:灵活控制指针和数据可变性 成员函数修饰:承诺不修改对象状态 函数参数/返回值:防止意外修改 const变量存储位置 全局const:C语言在.rodata段,C++可能仅存符号表(除非取地址) 局部const:通常分配在栈区,可能被优化为立即数 字符串常量:存储在.rodata只读段 类const成员:随对象存储(栈/堆/静态区) 嵌入式特殊处理:部分平台需显式指定存储区域 核心价
2026-07-24 16:38:06
411
原创 【Linux驱动开发】第24天:SPI 数据收发机制
分层模型:最小数据分片;:完整一次CS选中的事务,由多个transfer组成;同步传输spi_sync阻塞,适合绝大多数外设驱动,开发成本最低;简易封装接口覆盖90%寄存器读写场景,优先使用;多线程访问SPI必须互斥锁保护,避免多条message交错执行;一条message内部默认全程CS低,仅全部transfer完成后释放;单transfer末尾可通过cs_change提前释放片选。
2026-07-04 23:25:34
422
原创 【Linux驱动开发】第23天:spi_driver 的 probe / remove 函数实现规范
对应 I2C:无完全对等接口,I2C 时序参数由适配器驱动统一配置,从设备无需单独设置。匹配就认为设备存在,必须通过 SPI 通信读取 ID 校验,这是驱动鲁棒性的基本要求。私有数据结构体是驱动的"全局变量容器",保存设备状态、硬件资源、数据缓存等,向 SPI 控制器驱动提交当前设备的时序参数,控制器会据此配置硬件寄存器,是 SPI 从设备的核心描述符,内核已经根据设备树填充了基础参数。根据外设类型,将设备注册到对应的内核子系统,向用户空间暴露操作接口。每一步失败都必须撤销之前的操作,避免资源泄漏。
2026-07-04 23:19:41
419
原创 【Linux驱动开发】第22天:SPI 设备树 + spi_driver
RK3568的SPI控制器统一在中预定义,板级DTS仅需启用并追加从设备。属性必选说明compatible是固定为,与SPI控制器驱动匹配reg是控制器寄存器基地址+地址空间大小interrupts是SPI控制器中断号clocks是外设总线时钟与功能时钟,名称为pclkspi是固定为<1>,片选号用1个cell表示是固定为<0>,SPI从设备无独立地址空间cs-gpios否GPIO模拟片选时使用,数组形式,索引对应从设备reg值。
2026-07-03 21:07:33
408
原创 【Linux驱动开发】第21天:SPI总线协议与SPI子系统基础理解
和I2C完全对应,Linux SPI子系统也是经典的三层架构,思路和I2C高度一致,只是结构体和API名称不同。:主设备和从设备各有一个移位寄存器,SCLK每跳变一次,两边同时移出1位数据到对方的寄存器里。SPI通过两个参数配置时序,组合成4种标准模式,不同外设可能要求不同模式,驱动必须和外设匹配。,你写一个字给我的同时,我也写一个字给你,节拍由其中一个人(主设备)统一打拍子控制。的串行总线,标准模式下需要4根信号线,比I2C多2根,但通信能力更强。通俗理解:SPI通信就像。
2026-06-28 18:13:41
392
原创 【Linux驱动开发】第20天:I2C 驱动框架与读写 API 详解
【代码】【Linux驱动开发】第20天:I2C 驱动框架与读写 API 详解。
2026-06-28 14:04:42
283
原创 【Linux驱动开发】第19天:I2C设备树
在pinctrl/* I2C1引脚复用定义 */i2c1 {<4 RK_PA1 RK_FUNC_2 &pcfg_pull_none>, // GPIO4_A1复用为I2C1_SDA// GPIO4_A2复用为I2C1_SCL/* I2C4引脚复用定义示例 */i2c4 {<1 RK_PB3 RK_FUNC_2 &pcfg_pull_none>, // GPIO1_B3复用为I2C4_SDA// GPIO1_B4复用为I2C4_SCL。
2026-06-28 14:01:41
207
原创 【Linux驱动开发】第18天:I2C驱动深度解析
RK3399的I2C驱动分为适配器驱动(控制器)和设备驱动(外设),适配器驱动是硬件层实现,设备驱动是业务层实现,通过I2C核心层解耦。适配器驱动基于,通过设备树匹配硬件,核心是实现的(中断驱动的数收发)。中断是RK3399 I2C高效传输的核心,负责逐字节处理、错误检测、传输状态更新。Client驱动通过i2c_driver注册,调用对接核心层,无需关心底层硬件细节,实现跨平台复用。
2026-06-01 19:54:49
422
原创 【Linux驱动开发】第17天:I2C子系统整体架构
I2C(Inter-Integrated Circuit)是嵌入式系统中最常用的低速串行总线,用于连接各种低速外设,如触摸屏、传感器、EEPROM、RTC时钟等。I2C本质:主从架构的低速串行总线,只用两根线就能连接多个外设三层架构适配器驱动层:直接操作I2C控制器硬件核心层:提供通用API,管理总线和设备从设备驱动层:实现具体外设的功能核心关系:一个适配器对应一条总线,一条总线上可以挂多个从设备,每个从设备有唯一地址设备树规则I2C控制器节点在中定义。
2026-05-28 17:06:02
508
原创 【Linux驱动开发】第16天:按键中断完整实战
板级DTS定位:通过命令可100%准确找到对应的DTS文件按键分类:OK3399-C板载按键分为ADC模拟按键和GPIO中断按键,后者是嵌入式开发主流方案中断语法:GPIO简写配置与标准中断配置可相互转换,核心是和interrupts两个属性中断架构:RK3399采用GICv3+GPIO组的二级中断级联架构,所有GPIO中断都遵循统一的配置规则驱动最佳实践使用devm_*系列API自动管理资源,避免内存泄漏严格遵守顶半部/底部分工:顶半部只调度底半部,底半部处理耗时操作。
2026-05-27 17:58:39
428
原创 【Linux驱动开发】第14天:中断基础理论
如果你是一名应用开发者,那么你写的代码就像你在公司的日常工作:按计划写代码、改bug、回邮件,一件事做完再做下一件,可以随时停下来喝口水、去厕所(睡眠/阻塞)。而硬件中断,就是公司突然发来的紧急会议通知——不管你手头在做什么,必须立刻放下,去会议室开会,会议结束后再回来继续之前的工作。硬件中断就是公司的紧急会议:必须立刻参加、必须短、不能睡觉、不能处理日常工作,所有耗时的事都会后再做。
2026-05-25 14:28:21
366
原创 【Linux驱动开发】第13天:Linux内核设备树解析 OF API 超详细全解
OF API是Linux内核提供的一套设备树解析函数集访问设备树节点读取节点的属性值获取硬件资源(寄存器地址、中断号、GPIO、时钟等)遍历设备树结构功能API使用频率检查节点是否可用⭐⭐⭐⭐⭐读取32位整数⭐⭐⭐⭐⭐读取字符串⭐⭐⭐⭐⭐读取布尔属性⭐⭐⭐⭐获取寄存器资源⭐⭐⭐⭐⭐获取中断号⭐⭐⭐⭐⭐获取GPIO号⭐⭐⭐⭐⭐映射寄存器地址⭐⭐⭐⭐⭐遍历子节点⭐⭐⭐。
2026-05-24 11:29:00
908
原创 【Linux驱动开发】第12天:Linux设备树核心:树形结构+节点+属性 完整全解
设备树采用分层树形结构描述硬件,和计算机的文件系统目录结构几乎完全一致。它以根节点为起点,向下逐层展开,真实反映了计算机系统中硬件的物理连接关系。
2026-05-22 15:32:02
584
原创 【Linux驱动开发】第11天:设备树(Device Tree)超详细全解:从诞生背景到工作原理
设备树(Device Tree,简称DT)是一种描述硬件资源的数据结构CPU内存总线控制器(I2C、SPI、USB等)外设(LED、按键、传感器、显示屏等)中断、时钟、电源等硬件资源.dtsi是设备树头文件,相当于C语言的.h头文件,用于存放多个DTS文件共享的公共硬件信息。比如同一个芯片的所有开发板,芯片内部的外设(CPU、内存、UART、I2C控制器等)是完全相同的这些公共信息可以放在一个.dtsi文件中(如每个开发板自己的.dts文件只需要#include这个.dtsi。
2026-05-21 17:50:07
550
原创 【Linux驱动开发】第10天:设备树零基础入门——DTS/DTB/DTC全解+编译流程
三者分工明确,缺一不可。缩写全称中文名称大白话解释DTS设备树源文件人类可读的文本文件,用C语言风格的语法描述硬件信息,相当于Word文档DTC设备树编译器把人类可读的DTS文本文件,编译成内核能识别的二进制文件,相当于Word转PDF的转换器DTB设备树二进制文件DTC编译后的二进制文件,内核启动时加载并解析,相当于PDF文件.dtsi是设备树头文件,相当于C语言的.h头文件,用于存放多个DTS文件共享的公共硬件信息。比如同一个芯片的所有开发板,芯片内部的外设信息是相同的,可以放在。
2026-05-21 16:15:32
576
原创 【Linux驱动开发】第9天:platform驱动常用函数+纯平台框架代码+匹配失败排查全解
platform驱动常用函数分为:驱动注册、设备注册、资源获取、私有数据管理、devm资源管理五大类纯平台驱动通过名称匹配工作,不需要设备树,适合老系统纯平台驱动需要同时注册和,两者name必须完全一致90%的platform驱动匹配失败都是因为匹配关键字不一致匹配失败通用排查步骤:查看日志→确认驱动已加载→确认设备已注册→对比匹配关键字。
2026-05-17 00:06:37
416
原创 【Linux驱动开发】第8天:platform平台驱动深度解析——设计目的+probe/remove函数全解
platform总线是Linux内核专门为片上系统(SoC)中的集成外设设计的虚拟总线。为什么叫"虚拟总线"?因为它不像I2C、SPI、USB那样有真实的物理总线和硬件协议,它只是内核抽象出来的一个软件层,目的就是为了解决传统驱动的硬编码问题。platform驱动的核心设计目的是解决传统驱动的硬编码问题,实现硬件信息与驱动逻辑的彻底分离platform驱动是现代Linux驱动的标准写法,所有片上外设驱动都应该使用platform模型。
2026-05-14 16:37:08
589
原创 【Linux驱动开发】第7天:总线-设备-驱动三大核心模型:通俗讲解+完整流程图
总线-设备-驱动模型的核心思想是分离与解耦,把硬件信息和驱动逻辑彻底分开总线是核心管理者,负责维护设备和驱动链表,实现自动匹配设备只描述硬件信息,驱动只包含操作逻辑和匹配规则匹配成功后,总线调用驱动的probe函数初始化设备现代Linux驱动全部采用总线-设备-驱动模型,传统硬编码驱动已经被淘汰platform总线是最常用的总线,用于连接片上外设。
2026-05-13 20:48:26
594
原创 【Linux驱动开发】第6天:互斥锁mutex/自旋锁spinlock+驱动全流程+应用测试程序
mutex:等待时睡眠 → 不占CPU → 只能在进程上下文用spinlock:等待时自旋 → 占CPU →进程/中断都能用中断上下文绝对不能用mutex持有spinlock期间不能睡眠。
2026-05-11 20:49:39
502
原创 【Linux驱动开发】第5天:字符设备驱动核心原理:主次设备号+cdev+数据拷贝全解
主设备号标识驱动类型,次设备号标识同类型下的不同具体设备cdev结构体是字符设备的抽象,把设备号和驱动的操作函数集关联起来字符设备注册流程:申请设备号 → 初始化cdev → 注册cdev → 创建设备类 → 生成设备文件是用户态与内核态数据交互的唯一安全方式,必须严格遵守使用规则现代驱动优先使用动态设备号,避免设备号冲突,兼容性更好。
2026-05-07 13:58:17
437
原创 【Linux驱动开发】第四天:dmesg日志全解+驱动加载失败极速排查
本文深入解析Linux内核调试工具dmesg的核心原理与实战应用,重点涵盖以下内容: dmesg本质:作为内核环形缓冲区的查看工具,专门捕获printk输出,是驱动调试的首要利器。
2026-05-07 11:37:04
509
原创 【Linux驱动开发】第三天:上下文核心概念全解 —— 进程/中断上下文+切换开销+TLB刷新原理
本文深入解析Linux驱动开发中的进程上下文与中断上下文核心区别。进程上下文允许睡眠、调度和调用大多数内核API,而中断上下文则限制严格,必须原子化执行且不能睡眠。文章列举了中断上下文绝对禁止的10类操作,如调用可能睡眠的函数、使用互斥锁、执行耗时操作等,并通过正反示例对比展示了规范写法。关键点在于:中断处理必须极速完成(微秒级),不能阻塞系统,否则会导致崩溃或性能问题。理解这些差异是编写稳定高效驱动的基础。
2026-05-06 15:01:17
531
原创 【Linux驱动开发】第二天:内核模块生命周期+内存分配全解
Linux内核模块(.ko)与内存管理详解 内核模块关键点: 动态加载:按需加载/卸载驱动模块,无需重启系统 生命周期:包括加载、初始化、运行、卸载四个阶段 核心函数:module_init()和module_exit()定义模块入口 命令工具:insmod(简单加载)、modprobe(自动处理依赖) 内核内存分配三剑客: kmalloc:物理连续小内存,性能最佳 kzalloc:kmalloc+自动清零,推荐首选 vmalloc:虚拟连续大内存,物理可不连续
2026-04-28 13:40:50
475
原创 【Linux驱动开发】第一天:用户态与内核态通俗讲解+最简字符设备驱动实战
本文通过机场类比形象解释了Linux用户态与内核态的核心区别:用户态是受限游客,内核态是最高权限管理员。重点分析了四大差异:权限等级、内存隔离、工作模式和上下文环境。针对驱动开发不能使用C库函数的原因进行了详细说明,并提供了极简字符设备驱动完整实现,包括内核模块代码、用户态测试程序及完整部署流程。最后展示了用户态到内核态的系统调用全链路流程和常用API对照表,帮助开发者理解Linux系统底层权限模型与开发规范。
2026-04-27 12:17:31
503
原创 嵌入式音视频开发——MPP编码
瑞芯微MPP硬件编解码技术解析 本文深入介绍了瑞芯微MPP硬件编解码平台的核心技术与应用方法。主要内容包括: MPP基础概念:MPP是嵌入式芯片厂商提供的媒体处理平台框架,通过统一API调用硬件编解码单元(VPU),相比纯软件方案具有低CPU占用、高性能、低功耗等优势。 MPI接口设计:详细解析了瑞芯微MPP的统一API接口,包括上下文管理、数据输入输出和参数配置三类核心API,这些接口屏蔽了不同芯片的硬件差异。 开发环境搭建:提供了从源码获取到交叉编译的完整环境准备指南,特别针对RK3568等主流芯片的编
2026-04-21 14:19:19
461
原创 嵌入式音视频开发——SRT协议
SRT(Secure Reliable Transport,安全可靠传输)是专为超低延迟(亚秒级)实时音视频流设计的开源传输协议,由Haivision公司开发,现由SRT联盟维护。底层基于UDP协议,添加了可靠性保障核心优势:在不可靠网络(互联网、4G/5G)下同时实现低延迟和高可靠性开源仓库:https://github.com/Haivision/srt生态支持:FFmpeg、OBS、VLC、Wowza等主流工具原生支持。
2026-04-17 17:13:10
822
原创 嵌入式音视频开发——RTSP协议
RTSP(Real-Time Streaming Protocol,实时流协议)是,你可以把它理解为——它不负责传输音视频数据本身,只负责发送"播放、暂停、快进、停止"等控制命令,是嵌入式音视频领域(IPC摄像头、NVR、车载监控、无人机图传)最核心的协议之一。
2026-04-16 16:42:48
386
原创 音视频 Linux 指令速查
均基于瑞芯微硬件编解码框架,支持H.264/H.265硬编硬解、RGA 2D图形加速。是低功耗IPC芯片,是通用嵌入式芯片,指令90%通用,差异处已标注。
2026-04-15 14:29:15
400
原创 嵌入式音视频开发——视频码率与码率控制技术
在多媒体领域,码率用于描述音频、视频文件的压缩程度以及数据传输的质量和速度。高码率意味着更多的数据在单位时间内被传输,这通常会带来更高的音质或画质,但同时也意味着更大的文件大小或更高的带宽需求。比特/秒 (bit/s 或 bps):最基本单位千比特/秒 (kbit/s 或 kbps, k=1000):常用于标清视频兆比特/秒 (Mbps, M=1000000):常用于高清和超高清视频。
2026-03-30 17:04:52
605
原创 AAC编码详解
在嵌入式音视频开发中,AAC(Advanced Audio Coding,高级音频编码)是一种非常常见的有损音频压缩技术,广泛应用于手机、机顶盒、车机、智能摄像头、会议终端、对讲设备以及各类流媒体系统中。。从工程实现上看,AAC 不是单一格式,而是一个。
2026-03-30 10:07:30
890
原创 音频基础知识
音频的本质,是把现实世界中连续变化的声音,转换成设备能存储、处理、传输的数字数据。声音三要素:频率、振幅、波形音频数字化:采样、量化、编码PCM 三参数:采样率、位深、声道数数据量核心:采样率越高、位深越高、声道越多,数据量越大工程目标:在音质、实时性、存储、带宽、算力之间做平衡对于嵌入式音视频开发来说,音频基础不是“背概念”,而是后续做录音、播放、编码、推流、同步的底层前提。
2026-03-27 14:37:20
785
原创 50 道嵌入式音视频面试题
sample是一个声道在某一时刻的一个采样值。frame是某一时刻所有声道的采样值集合。单声道 16bit:1 个 frame = 1 个 sample = 2 字节双声道 16bit:1 个 frame = 左 1 个 sample + 右 1 个 sample = 4 字节面试里最常见的坑是把 frame 和字节数混了。的单位一般是frame,不是字节。是 ALSA 整个环形缓冲区的大小。是缓冲区中一个周期块的大小。buffer = 多个 period 组成。
2026-03-27 10:48:54
503
原创 基于 ALSA 实现录音保存为 WAV 文件
首先定义 WAV 头结构,并实现一个用于写入头部的函数。#pragmapack1// PCM用 ALSA 采集 PCM,再为这些 PCM 数据补上标准 WAV 文件头。ALSA 采集流程WAV 文件结构只要把这两部分打通,录音保存功能就不复杂了。ALSA 负责采集原始 PCM 数据,WAV 负责为 PCM 数据提供标准文件封装。
2026-03-26 14:38:03
392
原创 嵌入式 Linux 下 ALSA 音频采集与 PCM 播放流程详解
在嵌入式 Linux 中,ALSA 是连接应用与音频硬件的核心桥梁。无论是录音还是放音,本质都围绕 PCM 数据流展开。PCM 是 ALSA 传输的核心数据形态播放用,采集用参数配置的关键是采样率、位深、声道数ALSA 通过机制完成稳定的数据流传输本质都是“生产消费速度不匹配ALSA 负责把应用层的 PCM 数据,稳定地送到音频硬件;或者把音频硬件采集到的 PCM 数据,稳定地送回应用层。
2026-03-26 14:04:27
716
原创 PCM编码与WAV音频文件格式详解
本文系统介绍了PCM音频编码原理和WAV文件格式。PCM通过采样、量化和编码将模拟音频转换为数字信号,其质量由采样率和位深决定。WAV作为PCM的封装格式,基于RIFF规范组织数据,包含文件头信息(采样率、声道数等)和音频数据块。文中详细解析了PCM的关键参数(如奈奎斯特采样定理、量化误差)和WAV文件结构(RIFF头、fmt块、data块),为嵌入式音视频开发提供了基础技术参考。理解这些内容对音频采集、处理和传输至关重要。
2026-03-26 11:44:30
1042
原创 嵌入式音视频开发——FFmpeg入门
FFmpeg是一个开源的多媒体处理框架,提供音视频转码、剪辑、推流等功能。其核心组件包括: libavformat - 处理封装格式和解复用 libavcodec - 提供编解码功能 libavfilter - 实现音视频滤镜处理 libavutil - 提供基础工具函数 libswscale/swresample - 处理视频/音频格式转换 libavdevice - 管理多媒体设备 libpostproc - 提供后期处理效果 这些组件协同工作,通过AVFormatContext、AVCodecCont
2025-09-19 10:39:50
1137
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅