<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[abloun的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/abloun</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; abloun]]></copyright><item><title><![CDATA[Linux 环境下段错误出现的原因及调试方法]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/163299603</link><guid>https://blog.youkuaiyun.com/abloun/article/details/163299603</guid><author>abloun</author><pubDate>Wed, 29 Jul 2026 11:46:04 +0800</pubDate><description><![CDATA[始终初始化指针，释放后置为 NULL。使用边界检查函数（如snprintf代替sprintfstrncpy代替strcpy静态分析工具（如valgrind）可高效发现内存错误。编写单元测试，覆盖边界条件。通过以上方法，可以系统性地定位并解决 Linux 下的段错误问题。Valgrind 是一款强大的内存调试工具，可以检测程序中的内存泄漏、越界访问、使用未初始化内存等问题。下面详细介绍如何使用 Valgrind 进行内存泄漏和越界访问检测。编译时加-g -O0。运行。]]></description><category></category></item><item><title><![CDATA[static关键字]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/163167466</link><guid>https://blog.youkuaiyun.com/abloun/article/details/163167466</guid><author>abloun</author><pubDate>Fri, 24 Jul 2026 17:24:01 +0800</pubDate><description><![CDATA[摘要：C/C++中的static关键字功能多样，具体行为取决于修饰对象和作用域。局部静态变量仅初始化一次，生命周期延长至程序结束；全局静态变量作用域限于文件内，避免命名冲突；静态函数仅在定义文件中可见。C++中，静态类成员由所有对象共享，需在类外初始化，静态成员函数无this指针，只能访问静态成员。static还结合其他关键字使用，如static const，但注意静态函数不能为虚函数或被const修饰。]]></description><category></category></item><item><title><![CDATA[结构体字节对齐详解]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/163166046</link><guid>https://blog.youkuaiyun.com/abloun/article/details/163166046</guid><author>abloun</author><pubDate>Fri, 24 Jul 2026 16:47:18 +0800</pubDate><description><![CDATA[字节对齐是指计算机在访问内存时，数据的存放地址必须满足某种对齐规则，即数据成员的起始地址必须是其自身大小（或系统指定的对齐模数）的整数倍。对于结构体而言，编译器会在成员之间插入填充字节（padding），使每个成员满足对齐要求，同时整个结构体的大小也必须是最大对齐模数的整数倍。字节对齐是C/C++中内存布局的重要特性，它由硬件性能驱动，由编译器自动实现。理解对齐规则可以帮助写出高效、可移植的代码。每个成员起始地址是自身大小的倍数，结构体总大小是最大成员大小的倍数。]]></description><category></category></item><item><title><![CDATA[const关键字]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/163165814</link><guid>https://blog.youkuaiyun.com/abloun/article/details/163165814</guid><author>abloun</author><pubDate>Fri, 24 Jul 2026 16:38:06 +0800</pubDate><description><![CDATA[const关键字与变量存储位置解析 const关键字作用 定义常量：替代#define，提供类型安全、调试支持 修饰指针/引用：灵活控制指针和数据可变性 成员函数修饰：承诺不修改对象状态 函数参数/返回值：防止意外修改 const变量存储位置 全局const：C语言在.rodata段，C++可能仅存符号表（除非取地址） 局部const：通常分配在栈区，可能被优化为立即数 字符串常量：存储在.rodata只读段 类const成员：随对象存储（栈/堆/静态区） 嵌入式特殊处理：部分平台需显式指定存储区域 核心价]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第24天：SPI 数据收发机制]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/162588458</link><guid>https://blog.youkuaiyun.com/abloun/article/details/162588458</guid><author>abloun</author><pubDate>Sat, 04 Jul 2026 23:25:34 +0800</pubDate><description><![CDATA[分层模型：最小数据分片；：完整一次CS选中的事务，由多个transfer组成；同步传输spi_sync阻塞，适合绝大多数外设驱动，开发成本最低；简易封装接口覆盖90%寄存器读写场景，优先使用；多线程访问SPI必须互斥锁保护，避免多条message交错执行；一条message内部默认全程CS低，仅全部transfer完成后释放；单transfer末尾可通过cs_change提前释放片选。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第23天：spi_driver 的 probe / remove 函数实现规范]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/162583907</link><guid>https://blog.youkuaiyun.com/abloun/article/details/162583907</guid><author>abloun</author><pubDate>Sat, 04 Jul 2026 23:19:41 +0800</pubDate><description><![CDATA[对应 I2C：无完全对等接口，I2C 时序参数由适配器驱动统一配置，从设备无需单独设置。匹配就认为设备存在，必须通过 SPI 通信读取 ID 校验，这是驱动鲁棒性的基本要求。私有数据结构体是驱动的"全局变量容器"，保存设备状态、硬件资源、数据缓存等，向 SPI 控制器驱动提交当前设备的时序参数，控制器会据此配置硬件寄存器，是 SPI 从设备的核心描述符，内核已经根据设备树填充了基础参数。根据外设类型，将设备注册到对应的内核子系统，向用户空间暴露操作接口。每一步失败都必须撤销之前的操作，避免资源泄漏。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第22天：SPI 设备树 + spi_driver]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/162396509</link><guid>https://blog.youkuaiyun.com/abloun/article/details/162396509</guid><author>abloun</author><pubDate>Fri, 03 Jul 2026 21:07:33 +0800</pubDate><description><![CDATA[RK3568的SPI控制器统一在中预定义，板级DTS仅需启用并追加从设备。属性必选说明compatible是固定为，与SPI控制器驱动匹配reg是控制器寄存器基地址+地址空间大小interrupts是SPI控制器中断号clocks是外设总线时钟与功能时钟，名称为pclkspi是固定为<1>，片选号用1个cell表示是固定为<0>，SPI从设备无独立地址空间cs-gpios否GPIO模拟片选时使用，数组形式，索引对应从设备reg值。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第21天：SPI总线协议与SPI子系统基础理解]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/162396328</link><guid>https://blog.youkuaiyun.com/abloun/article/details/162396328</guid><author>abloun</author><pubDate>Sun, 28 Jun 2026 18:13:41 +0800</pubDate><description><![CDATA[和I2C完全对应，Linux SPI子系统也是经典的三层架构，思路和I2C高度一致，只是结构体和API名称不同。：主设备和从设备各有一个移位寄存器，SCLK每跳变一次，两边同时移出1位数据到对方的寄存器里。SPI通过两个参数配置时序，组合成4种标准模式，不同外设可能要求不同模式，驱动必须和外设匹配。，你写一个字给我的同时，我也写一个字给你，节拍由其中一个人（主设备）统一打拍子控制。的串行总线，标准模式下需要4根信号线，比I2C多2根，但通信能力更强。通俗理解：SPI通信就像。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第20天：I2C 驱动框架与读写 API 详解]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161838521</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161838521</guid><author>abloun</author><pubDate>Sun, 28 Jun 2026 14:04:42 +0800</pubDate><description><![CDATA[【代码】【Linux驱动开发】第20天：I2C 驱动框架与读写 API 详解。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第19天：I2C设备树]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161743004</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161743004</guid><author>abloun</author><pubDate>Sun, 28 Jun 2026 14:01:41 +0800</pubDate><description><![CDATA[在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。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第18天：I2C驱动深度解析]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161490016</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161490016</guid><author>abloun</author><pubDate>Mon, 01 Jun 2026 19:54:49 +0800</pubDate><description><![CDATA[RK3399的I2C驱动分为适配器驱动（控制器）和设备驱动（外设），适配器驱动是硬件层实现，设备驱动是业务层实现，通过I2C核心层解耦。适配器驱动基于，通过设备树匹配硬件，核心是实现的（中断驱动的数收发）。中断是RK3399 I2C高效传输的核心，负责逐字节处理、错误检测、传输状态更新。Client驱动通过i2c_driver注册，调用对接核心层，无需关心底层硬件细节，实现跨平台复用。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第17天：I2C子系统整体架构]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161487197</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161487197</guid><author>abloun</author><pubDate>Thu, 28 May 2026 17:06:02 +0800</pubDate><description><![CDATA[I2C（Inter-Integrated Circuit）是嵌入式系统中最常用的低速串行总线，用于连接各种低速外设，如触摸屏、传感器、EEPROM、RTC时钟等。I2C本质：主从架构的低速串行总线，只用两根线就能连接多个外设三层架构适配器驱动层：直接操作I2C控制器硬件核心层：提供通用API，管理总线和设备从设备驱动层：实现具体外设的功能核心关系：一个适配器对应一条总线，一条总线上可以挂多个从设备，每个从设备有唯一地址设备树规则I2C控制器节点在中定义。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第16天：按键中断完整实战]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161459636</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161459636</guid><author>abloun</author><pubDate>Wed, 27 May 2026 17:58:39 +0800</pubDate><description><![CDATA[板级DTS定位：通过命令可100%准确找到对应的DTS文件按键分类：OK3399-C板载按键分为ADC模拟按键和GPIO中断按键，后者是嵌入式开发主流方案中断语法：GPIO简写配置与标准中断配置可相互转换，核心是和interrupts两个属性中断架构：RK3399采用GICv3+GPIO组的二级中断级联架构，所有GPIO中断都遵循统一的配置规则驱动最佳实践使用devm_*系列API自动管理资源，避免内存泄漏严格遵守顶半部/底部分工：顶半部只调度底半部，底半部处理耗时操作。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第15天：中断顶半部/底半部 + tasklet VS 工作队列]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161393183</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161393183</guid><author>abloun</author><pubDate>Tue, 26 May 2026 14:47:11 +0800</pubDate><description><![CDATA[中断处理函数有一个。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第14天：中断基础理论]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161361840</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161361840</guid><author>abloun</author><pubDate>Mon, 25 May 2026 14:28:21 +0800</pubDate><description><![CDATA[如果你是一名应用开发者，那么你写的代码就像你在公司的日常工作：按计划写代码、改bug、回邮件，一件事做完再做下一件，可以随时停下来喝口水、去厕所（睡眠/阻塞）。而硬件中断，就是公司突然发来的紧急会议通知——不管你手头在做什么，必须立刻放下，去会议室开会，会议结束后再回来继续之前的工作。硬件中断就是公司的紧急会议：必须立刻参加、必须短、不能睡觉、不能处理日常工作，所有耗时的事都会后再做。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第13天：Linux内核设备树解析 OF API 超详细全解]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161319790</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161319790</guid><author>abloun</author><pubDate>Sun, 24 May 2026 11:29:00 +0800</pubDate><description><![CDATA[OF API是Linux内核提供的一套设备树解析函数集访问设备树节点读取节点的属性值获取硬件资源（寄存器地址、中断号、GPIO、时钟等）遍历设备树结构功能API使用频率检查节点是否可用⭐⭐⭐⭐⭐读取32位整数⭐⭐⭐⭐⭐读取字符串⭐⭐⭐⭐⭐读取布尔属性⭐⭐⭐⭐获取寄存器资源⭐⭐⭐⭐⭐获取中断号⭐⭐⭐⭐⭐获取GPIO号⭐⭐⭐⭐⭐映射寄存器地址⭐⭐⭐⭐⭐遍历子节点⭐⭐⭐。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第12天：Linux设备树核心：树形结构+节点+属性 完整全解]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161290692</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161290692</guid><author>abloun</author><pubDate>Fri, 22 May 2026 15:32:02 +0800</pubDate><description><![CDATA[设备树采用分层树形结构描述硬件，和计算机的文件系统目录结构几乎完全一致。它以根节点为起点，向下逐层展开，真实反映了计算机系统中硬件的物理连接关系。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第11天：设备树（Device Tree）超详细全解：从诞生背景到工作原理]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161148553</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161148553</guid><author>abloun</author><pubDate>Thu, 21 May 2026 17:50:07 +0800</pubDate><description><![CDATA[设备树（Device Tree，简称DT）是一种描述硬件资源的数据结构CPU内存总线控制器（I2C、SPI、USB等）外设（LED、按键、传感器、显示屏等）中断、时钟、电源等硬件资源.dtsi是设备树头文件，相当于C语言的.h头文件，用于存放多个DTS文件共享的公共硬件信息。比如同一个芯片的所有开发板，芯片内部的外设（CPU、内存、UART、I2C控制器等）是完全相同的这些公共信息可以放在一个.dtsi文件中（如每个开发板自己的.dts文件只需要#include这个.dtsi。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第10天：设备树零基础入门——DTS/DTB/DTC全解+编译流程]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161148539</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161148539</guid><author>abloun</author><pubDate>Thu, 21 May 2026 16:15:32 +0800</pubDate><description><![CDATA[三者分工明确，缺一不可。缩写全称中文名称大白话解释DTS设备树源文件人类可读的文本文件，用C语言风格的语法描述硬件信息，相当于Word文档DTC设备树编译器把人类可读的DTS文本文件，编译成内核能识别的二进制文件，相当于Word转PDF的转换器DTB设备树二进制文件DTC编译后的二进制文件，内核启动时加载并解析，相当于PDF文件.dtsi是设备树头文件，相当于C语言的.h头文件，用于存放多个DTS文件共享的公共硬件信息。比如同一个芯片的所有开发板，芯片内部的外设信息是相同的，可以放在。]]></description><category></category></item><item><title><![CDATA[【Linux驱动开发】第9天：platform驱动常用函数+纯平台框架代码+匹配失败排查全解]]></title><link>https://blog.youkuaiyun.com/abloun/article/details/161087909</link><guid>https://blog.youkuaiyun.com/abloun/article/details/161087909</guid><author>abloun</author><pubDate>Sun, 17 May 2026 00:06:37 +0800</pubDate><description><![CDATA[platform驱动常用函数分为：驱动注册、设备注册、资源获取、私有数据管理、devm资源管理五大类纯平台驱动通过名称匹配工作，不需要设备树，适合老系统纯平台驱动需要同时注册和，两者name必须完全一致90%的platform驱动匹配失败都是因为匹配关键字不一致匹配失败通用排查步骤：查看日志→确认驱动已加载→确认设备已注册→对比匹配关键字。]]></description><category></category></item></channel></rss>