<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[sunkai0205的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sunkai0205</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sunkai0205]]></copyright><item><title><![CDATA[适配器设计模式]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163429685</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163429685</guid><author>sunkai0205</author><pubDate>Mon, 03 Aug 2026 09:47:13 +0800</pubDate><description><![CDATA[在C语言中，适配器模式并非某种特定的代码写法，而是一种利用结构体和函数指针来解耦、适配不同接口的架构思想。它主要的价值在于：提升代码复用性：让现有的代码模块可以在新的环境下继续使用。增强系统灵活性：方便替换底层实现（如硬件、第三方库），而不会影响上层业务。改善代码可维护性：通过隔离变化点，让系统结构更清晰，更容易维护和测试。简单来说，适配器模式在C语言中就是通过一个中间层，将“甲方”（客户端）的接口标准，翻译给“乙方”（已有模块）听，让双方能够顺利合作。]]></description><category></category></item><item><title><![CDATA[嵌入式开发工程必备的六大设计模式]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163368321</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163368321</guid><author>sunkai0205</author><pubDate>Fri, 31 Jul 2026 15:26:57 +0800</pubDate><description><![CDATA[设计模式核心价值嵌入式推荐场景资源消耗（CPU/RAM）单例模式唯一性管理系统配置、日志、唯一外设极低工厂模式创建与使用分离多型号传感器/屏幕驱动抽象低（仅函数指针）观察者模式同步一对多通知按键触发联动、简单中断分发低（维护回调数组）状态模式复杂状态逻辑解耦通信协议、菜单、电源管理中（需维护多个状态结构体）发布-订阅异步完全解耦带RTOS的多任务通信（队列）较高（需RAM做消息队列）适配器模式接口转换HAL层移植、老代码适配新库极低（纯封装）]]></description><category></category></item><item><title><![CDATA[嵌入式常用程序架构]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163365289</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163365289</guid><author>sunkai0205</author><pubDate>Fri, 31 Jul 2026 14:51:33 +0800</pubDate><description><![CDATA[这五种架构思想在实际工程中通常是组合使用的。例如，一个典型的复杂嵌入式项目可能同时具备以下特征：（1）采用 RTOS + 分层架构 (3) 作为主体框架。（2）在某个复杂的通信协议解析任务中，运用 状态机 (1) 的思想。（3）在驱动层，使用 OOP思想 (5) 封装不同厂家的传感器，实现“多态”。（4）在低功耗管理模块，采用 事件驱动与休眠唤醒 (4) 的策略。]]></description><category></category></item><item><title><![CDATA[V模型嵌入式开发流]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163361699</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163361699</guid><author>sunkai0205</author><pubDate>Fri, 31 Jul 2026 11:38:39 +0800</pubDate><description><![CDATA[（1）V模型为嵌入式开发提供了一个结构化、以测试为中心的框架，特别适合像汽车电子、工业控制等对安全性和可靠性要求极高的领域。（2）它的优点在于能及早发现问题、保证产品质量。但其缺点也比较明显：相对传统和重型，不够灵活，对于需求频繁变更的项目，管理成本会比较高。（3）总的来说，V模型是嵌入式开发中一个非常成熟和经典的流程框架，它为开发和测试活动提供了清晰的指导和对应关系。]]></description><category></category></item><item><title><![CDATA[嵌入式工程为何禁用递归]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163360761</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163360761</guid><author>sunkai0205</author><pubDate>Fri, 31 Jul 2026 11:23:55 +0800</pubDate><description><![CDATA[总的来说，禁用递归是一种为了系统整体稳定性和安全性而采取的设计约束，尤其是在对可靠性要求极高的嵌入式领域。在实践中，几乎所有可以用递归解决的问题，都可以通过循环（迭代） 的方式来实现，且资源消耗和运行时间更可控。总结来说，“禁用递归”在代码上的最终体现就是：在工程里 ，永远搜不到该函数内部对自身的引用；且所有需要“重复执行”的动作，都被明确地写成了 for、while 或 do-while 结构。]]></description><category></category></item><item><title><![CDATA[临界段介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163266964</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163266964</guid><author>sunkai0205</author><pubDate>Tue, 28 Jul 2026 11:49:52 +0800</pubDate><description><![CDATA[机制特点适用场景互斥量（Mutex）支持优先级继承，可递归锁定，支持超时等待保护较复杂的临界资源，允许线程阻塞等待信号量（Semaphore）轻量级同步，可用于资源计数控制对有限资源的访问，或用作事件通知事件（Event）支持多事件组合触发线程间的事件同步互斥量等机制虽然功能更丰富，但开销也更大。对于极短的关键操作（如修改一个全局变量），关中断仍然是最快、最直接的方式。要点说明定义临界段是一段执行时不能被中断的代码段威胁来源任务切换（调度）和外部中断核心保护手段。]]></description><category></category></item><item><title><![CDATA[GCC编译器介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163234561</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163234561</guid><author>sunkai0205</author><pubDate>Mon, 27 Jul 2026 10:55:49 +0800</pubDate><description><![CDATA[（1）预处理 (.c → .i)：文本替换与整合。（2）编译 (.i → .s)：高级语言 → 汇编语言。（3）汇编 (.s → .o)：汇编语言 → 机器码（目标文件）。（4）链接 (.o → 可执行文件)：合并目标文件与库，解析地址。理解这四个阶段，能帮助你更深入地理解程序的构建过程，并更有效地使用 GCC 的各种编译选项。]]></description><category></category></item><item><title><![CDATA[MCU内存管理（详细）]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163195647</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163195647</guid><author>sunkai0205</author><pubDate>Sat, 25 Jul 2026 17:17:41 +0800</pubDate><description><![CDATA[在MCU开发中，高效且安全地管理内存，核心在于理解其物理布局与栈、堆的工作方式。在规避风险上，最重要的原则是 “优先静态分配” ，它能从根源上避免大多数动态内存相关的问题。当必须使用动态内存时，则需严格遵守配对释放、初始化指针等规范，并善用编译器和硬件提供的保护机制。]]></description><category></category></item><item><title><![CDATA[C语言volatile、const、static 关键字介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163123392</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163123392</guid><author>sunkai0205</author><pubDate>Thu, 23 Jul 2026 10:25:36 +0800</pubDate><description><![CDATA[（1）const：骗编译器说“你别改”，骗自己说“我不会改”，底层是只读段/优化常量。（2）static：让变量搬家（从栈到数据段）并拉黑门牌号（对外部隐藏符号）。（3）volatile：给编译器一记耳光，命令它“少管闲事，每次老老实实去问硬件要真实值”。]]></description><category></category></item><item><title><![CDATA[C语言预处理介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163121909</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163121909</guid><author>sunkai0205</author><pubDate>Thu, 23 Jul 2026 10:00:50 +0800</pubDate><description><![CDATA[预处理就是“用另一套语言（指令以#开头）在编译前对C源码进行手术刀式裁剪和拼接”。它的终极目标只有一个：生产一份纯粹的、合法的C代码文本，送到编译器嘴里。用法上，必须时刻清醒——你在写的是“写给预处理器看的逻辑”，它不是C语言运行时的一部分。能用 const 和 enum 解决的常量，坚决不用 #define。]]></description><category></category></item><item><title><![CDATA[C语言宏定义介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163121411</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163121411</guid><author>sunkai0205</author><pubDate>Thu, 23 Jul 2026 09:43:54 +0800</pubDate><description><![CDATA[最基础但最重要的作用。编译时，所有 MAX_SIZE 被替换为字面量 1024，直接作为立即数嵌入指令（mov eax, 1024）。比 const int 更底层：const 可能在栈上占内存或靠优化消除，而宏直接变成立即数，无需访问内存。宏是“编译器走进手术室前，护士用纸条把代码里的关键词全部贴成新词”。它的终极用法是零成本抽象、条件编译插入和元编程。但必须永远记住：宏不遵循C语法规则，它只遵循“复制粘贴”规则。能不用宏做计算逻辑时，尽量用 const 或 inline 函数；只有当需要FILE。]]></description><category></category></item><item><title><![CDATA[C语言回调机制介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163120429</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163120429</guid><author>sunkai0205</author><pubDate>Thu, 23 Jul 2026 09:13:55 +0800</pubDate><description><![CDATA[回调就是把函数地址当“传票”递出去，让底层在关键时刻通过 call 间接跳转来执行你的逻辑。它的精髓在于编译期不知道，运行时才定址。用法上，永远配套 void* ctx 传递血统，永远警惕调用约定，永远确保 ctx 的寿命长于回调注册周期。]]></description><category></category></item><item><title><![CDATA[C语言联合体介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163107425</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163107425</guid><author>sunkai0205</author><pubDate>Wed, 22 Jul 2026 15:38:08 +0800</pubDate><description><![CDATA[结构体是“各住各的房间”（内存累加），联合体是“临时合租一张床”（内存复用）。它的终极用法是：用最小的内存代价，在同一块物理内存上实现“按需解释”，尤其适合硬件寄存器和内存紧张型嵌入式场景。但必须时刻牢记：写入一个成员，就当其他成员的旧数据全部作废；跨平台传输，务必显式序列化。]]></description><category></category></item><item><title><![CDATA[c语言结构体介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163106828</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163106828</guid><author>sunkai0205</author><pubDate>Wed, 22 Jul 2026 15:15:36 +0800</pubDate><description><![CDATA[结构体就是“编译期计算好偏移量的内存分块器”，.和->是“零消耗的地址偏移语法糖”。用法上，牢记传大结构用指针、跨平台通信强制对齐（pack）、有指针成员慎用赋值。如果你在嵌入式开发中操作寄存器，通常会大量使用结构体和联合体（union）来映射外设寄存器组。]]></description><category></category></item><item><title><![CDATA[c语言位操作介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163105403</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163105403</guid><author>sunkai0205</author><pubDate>Wed, 22 Jul 2026 14:32:14 +0800</pubDate><description><![CDATA[（1）有符号右移的算术陷阱：对负数（如 -1 >> 1）右移，结果依然是 -1（因为补符号位1），而不是 0。如果只想要逻辑移位（补0），务必使用 unsigned 类型进行位运算。（2）移位位数不能等于或超过位宽：int a = 1;a << 32;在32位系统上是未定义行为（CPU的移位器只取低5位或低6位，结果不可预测）。必须确保 n < sizeof(type)*8。]]></description><category></category></item><item><title><![CDATA[C语言指针介绍]]></title><link>https://blog.youkuaiyun.com/sunkai0205/article/details/163104458</link><guid>https://blog.youkuaiyun.com/sunkai0205/article/details/163104458</guid><author>sunkai0205</author><pubDate>Wed, 22 Jul 2026 13:55:35 +0800</pubDate><description><![CDATA[正因为指针只是整数，编译器不负责检查它是否有效。（1）野指针：保存了无效编号（如未初始化的局部变量里的垃圾值），解引用会随机改内存，导致不可复现的崩溃。（2）悬挂指针：指向已被 free 释放的堆内存，该编号可能已被分配给其他变量，操作它会导致数据错乱。（3）越界访问：指针算术超出数组边界，会修改邻近栈帧的返回地址或局部变量，这是大多数缓冲区溢出漏洞的根源。指针即“内存的门牌号”，* 是“开门进去”，+1 是“根据门牌号规则找到下一家”。]]></description><category></category></item></channel></rss>