- 博客(266)
- 资源 (8)
- 收藏
- 关注
原创 Day 14:整数溢出(Integer Overflow/Underflow)
本文详细讲解了C语言中整数溢出与下溢的问题。无符号整数溢出是明确定义的模运算行为,而有符号整数溢出属于未定义行为,可能引发严重错误。文章列举了五种典型陷阱案例,包括大数运算、数组长度计算等场景,并分析了其成因。针对这些问题,作者提出了边界检查、使用更大类型、编译器检测工具等防范措施。通过错误代码与优化代码的对比,展示了如何正确处理溢出问题。最后强调在C编程中必须重视整数运算的安全性,建议开发者在关键路径加入溢出判断,充分利用现代工具来提升代码健壮性。
2025-07-02 09:38:12
1181
原创 Day 13:未初始化的变量(Uninitialized Variable)
摘要: C语言中未初始化的变量是隐蔽的安全隐患。局部变量(如int、指针、结构体成员等)若不显式初始化,其值为栈上残留的随机数据,易导致逻辑错误或崩溃。典型错误包括直接使用未初始化变量、解引用未初始化指针等。规避方法包括:始终显式赋初值(如int x=0)、指针初始化为NULL、结构体/数组整体清零,以及利用静态分析工具检测风险。未初始化变量的根源是C为性能避免自动清零,程序员需养成“声明即初始化”的习惯以提升代码健壮性。
2025-07-02 09:37:25
875
原创 齿轮模数:齿形设计的核心参数详解
模数是齿轮设计的核心参数,决定了齿轮的基本尺寸和性能。它直接影响齿距、齿高、强度及啮合兼容性,计算公式为模数=分度圆直径/齿数。模数增大可提高承载能力,但也会增加齿轮尺寸。工程设计中需根据功率、转速等需求计算初选模数,优先选用标准系列,并通过强度校核确定最终值。不同应用场景推荐不同模数范围,合理选择模数是确保齿轮系统高效可靠的关键。设计过程需结合理论计算和专业软件分析,避免常见错误应用。
2025-07-01 09:45:38
1033
原创 Day 12:多重释放(Double Free)与释放后使用(Use-After-Free)
本文深入剖析C语言内存管理中两大高危陷阱——多重释放(double free)与释放后使用(use-after-free)。它们会破坏堆结构、导致程序崩溃,甚至引发安全漏洞。常见成因包括未置空释放指针、多指针别名混乱及复杂逻辑分支遗漏。规避方法强调:释放后立即置NULL、统一管理资源所有权、使用Valgrind等检测工具。通过错误代码与修正案例对比,图解危险操作,核心建议将"free后置NULL"纳入规范,明确资源生命周期管理。遵循"谁分配谁释放谁置NULL"原则,可
2025-07-01 09:44:33
547
原创 Day 11:内存分配失败未检查(malloc/realloc/calloc返回值)
C语言动态内存分配常见陷阱与最佳实践:本文详细剖析了malloc、calloc和realloc函数使用时可能产生的空指针解引用和内存泄漏问题,指出开发者容易忽视返回值检查的根本原因。文章通过错误代码与正确代码对比,强调必须检查分配结果、使用临时指针处理realloc返回值等关键实践,并解释了底层机制。核心建议是将内存分配检查作为硬性规范,确保程序在极端情况下也能优雅处理内存不足。这些实践对提升代码健壮性至关重要,尤其在大数据和嵌入式等资源受限场景中。
2025-06-30 09:22:38
353
原创 齿轮设计小结
齿轮传动设计核心要点:模数、齿数、压力角等参数决定齿轮性能,减速比需合理分配(单级≤10)。强度校核需计算齿面接触与齿根弯曲疲劳,润滑方式影响效率。示例展示二级减速(总比100)与行星减速器设计方法,强调避免根切、齿数互质等经验。推荐参考机械手册与ISO标准,建议仿真验证后实施。掌握减速比分配、模数选型与强度校核可解决大部分基础设计问题。(149字)
2025-06-30 09:21:40
845
原创 Day 10:字符串操作函数的安全隐患(如 strcpy, strcat, gets)
C语言字符串操作函数存在严重缓冲区溢出风险。strcpy、strcat、gets等函数因无长度校验,极易导致内存覆盖。推荐使用strncpy、fgets等安全版本,并手动处理结尾符\0。根本原因在于C语言早期设计追求性能而忽略安全。实际开发应禁用危险函数,执行长度限定,并加强代码审查。安全编程需结合正确API、边界意识和规范审查,才能有效防范溢出漏洞。
2025-06-26 09:37:27
815
原创 Day 9:C语言中的浅拷贝与深拷贝陷阱
本文系统讲解了C语言中的浅拷贝与深拷贝问题及其解决方案。浅拷贝仅复制指针地址,导致多个对象共享内存,容易引发重复释放、数据错乱等问题;深拷贝则递归复制指针指向的数据,确保对象独立。文章通过错误示例对比,展示浅拷贝导致的双重释放问题,并给出深拷贝实现方法(自定义复制函数分配新内存)。核心建议:含指针的结构体必须自定义深拷贝,明确所有权管理,避免使用memcpy或=直接拷贝。开发中应形成规范,重点关注带指针结构体的赋值和释放。
2025-06-26 09:36:22
1055
原创 Day 8:缓冲区溢出(Buffer Overflow)
缓冲区溢出是C语言常见的安全漏洞,指程序向缓冲区写入数据时超出分配空间,破坏相邻内存。典型成因包括数组空间不足、使用不安全函数(如gets、strcpy)等,可能导致关键数据被覆盖。防范措施包括:1)使用安全函数(fgets、strncpy)并严格校验边界;2)动态分配时预留足够空间;3)借助静态分析工具检测风险。现代防护机制(如栈保护、ASLR)能缓解但无法根除风险,必须从代码习惯入手,杜绝不安全操作。开发时应始终假设外部输入不可信,从源头预防溢出。
2025-06-25 10:08:17
361
原创 Day 7:格式化字符串漏洞(Format String Vulnerability)
摘要: 格式化字符串漏洞是C语言中高危的安全隐患,由用户可控的格式字符串参数引发(如printf(user_input))。攻击者可利用%x、%n等格式符读取或篡改内存。典型错误包括直接使用用户输入作为格式字符串或未保护的日志记录。规避方法是固定格式字符串(如printf("%s", user_input)),避免用户控制格式。底层原理涉及栈数据越界访问和%n的任意内存写入。建议开启编译警告并静态分析代码,杜绝此类漏洞。核心原则:永远禁止用户输入作为格式字符串。
2025-06-25 10:07:28
407
原创 Day 6:指针和数组的混淆与陷阱
本文解析了C语言中数组和指针的本质区别与常见误区。数组是固定大小的连续内存块,而指针仅保存地址。关键区别在于:数组名不能赋值,sizeof运算结果不同,函数传参时会退化为指针。文章列举了四大典型陷阱(数组大小误判、指针越界、数组赋值错误、返回局部数组指针)及规避方法,强调传递数组长度的重要性。通过错误与正确代码对比,说明数组退化为指针时的处理方式。建议开发者始终区分两者本质:数组是数据集合,指针是地址标识。理解这些差异是编写健壮C代码的基础。
2025-06-24 09:41:11
770
原创 Day 5:内存泄漏(Memory Leak)与资源回收管理
C语言内存泄漏是指程序分配内存后未释放,导致内存无法重复使用。常见原因包括:忘记释放、指针丢失、异常退出未释放和循环分配未充分释放。典型陷阱有覆盖分配指针、提前返回未释放、函数返回堆内存无人释放等。规避方法包括:规划释放时机、不覆盖未释放指针、配套写释放代码、使用统一出口释放、封装释放函数以及使用检测工具。正确做法是将每次malloc与free配对,复杂函数用goto统一释放。内存泄漏会导致长期运行程序内存耗尽,建议养成良好内存管理习惯,确保程序稳定性。
2025-06-24 09:40:08
884
原创 Day 4:结构体内存填充(Struct Padding)与对齐(Alignment)
C语言结构体内存对齐与填充是重要但易被忽视的细节。CPU要求数据类型地址对齐,编译器自动插入填充字节满足对齐要求,导致结构体实际大小可能大于成员总和。常见陷阱包括内存浪费、跨平台布局差异和序列化问题。建议优化成员顺序(大成员在前)、使用编译器指令控制填充、避免直接结构体序列化,并通过sizeof/offsetof获取准确信息。合理处理结构体布局是高质量C程序的关键。
2025-06-17 09:49:29
798
原创 Day 3:C语言中的未定义行为(Undefined Behavior, UB)
C语言中的未定义行为(UB)是开发者需警惕的陷阱,指标准未规定结果的操作,可能导致程序崩溃或异常。常见UB包括数组越界、未初始化变量、有符号整数溢出等。规避方法包括严格检查边界、初始化变量、使用安全指针操作等。静态分析工具如clang-analyze可帮助检测UB。正确代码应避免依赖UB,遵循标准规范。开发中应保持警觉,利用工具排查潜在风险,确保程序稳定性和跨平台兼容性。
2025-06-17 09:47:59
1019
原创 Day 2:C语言中的字符串结尾与缓冲区溢出
C语言字符串操作安全指南:C语言字符串以'\0'结尾,但标准库函数如strcpy/strcat不检查长度,易导致缓冲区溢出(严重安全漏洞)。常见陷阱包括字符串未正确结尾、拷贝超长内容等。安全建议:声明时预留'\0'空间、初始化数组、使用strncpy/strncat等安全函数、显式设置结尾、检查输入长度。示例对比展示不安全与安全代码的差异,强调手动管理边界的重要性。底层原理上,字符串遍历依赖\0终止,溢出可能破坏栈数据甚至被利用攻击。核心建议:操作字符串时始终考虑边界和结尾问题,优先使用安全函数。
2025-06-10 09:15:36
819
原创 Day 1:C语言中的野指针(Dangling Pointer)
野指针是C语言中最隐蔽的bug来源之一。它可以导致数据损坏、难以调试的崩溃、甚至安全漏洞。指针一定要初始化,资源释放后要置NULL,避免返回局部地址。养成良好的“指针管理”习惯,多用工具进行检测,写关键代码时反复review与测试。不要侥幸依赖“没出错就是对的”,因为野指针的危害往往是潜伏的。“每一次用到指针,都要问自己:‘它现在指向的内存是有效且可用的吗?’”公众号 | FunIO微信搜一搜 “funio”,发现更多精彩内容。个人博客 |
2025-06-10 09:12:26
285
原创 双路串口转百兆以太网模块的设计
CH9121是一款支持双路串口转百兆网络的透传芯片,具有两路独立串口和百兆网口特性。该芯片内置以太网MAC和PHY,兼容IEEE802.3协议,支持TCP/UDP四种工作模式,串口波特率最高达10Mbps。芯片设计简单,提供TSSOP20和LQFP64M封装,并可通过上位机软件配置参数。常见问题包括串口乱码(波特率或编码错误)和网络分包(可通过调整报文间隔时间解决)。适用于串口设备快速联网场景,性价比高。
2025-06-04 09:40:14
451
原创 Day 0:C语言中的数组越界访问
C语言数组越界是常见的编程陷阱,其本质是连续内存块的直接访问,编译器不进行下标检查。由于C追求高效而牺牲安全性,越界访问属于未定义行为,可能导致内存破坏、程序崩溃或安全漏洞。规避方法包括:严格检查下标合法性、封装数组操作、使用sizeof计算长度、优先选用安全库函数。图示展示了越界访问未定义内存区域的情形。建议开发者养成边界检查习惯,使用工具检测越界问题,并牢记"任何数组访问都要明确边界"的原则。通过封装和自动化检查,可显著提升代码健壮性。
2025-06-04 09:36:15
370
原创 深入理解 ARM Serial Wire Debug (SWD) 协议
SWD 是 ARM 为替代传统 4 线 JTAG 所开发的两线制同步串行调试协议。引脚极少:仅需 SWDIO(数据线,双向)和 SWCLK(时钟线,单向)。速度高效:支持高达 50 MHz 的时钟频率。布线简单:极大方便小型封装和高密度 PCB 设计。主机主导:所有通信均由调试主机发起,实现无歧义主从关系。物理连接推荐SWDIO/SWCLK 各串 10kΩ 上拉电阻并对地 33pF 滤波电容。信号线尽量短(<15cm),与地线分组走双绞线,提升抗干扰性。
2025-05-23 10:00:49
1183
原创 SWD接口详解:原理、连接与应用
SWD(Serial Wire Debug)是ARM Cortex-M系列微控制器中广泛使用的两线制调试接口,因其引脚简单、传输高效而受到青睐。本文详细介绍了SWD的工作原理、物理连接及实际应用。SWD仅需两根信号线(SWDIO和SWCLK),通过请求、响应、数据传输和校验四个阶段完成通信。与JTAG相比,SWD引脚更少、协议更简单,但传输效率相当。SWD常用于芯片调试、固件烧录和芯片解锁等场景。文章还通过Mermaid和SVG图表直观展示了SWD的连接方式和通信流程,并解答了常见问题,帮助开发者更好地理解
2025-05-23 09:59:55
1711
原创 液晶屏逻辑板编程工具
名称:T-Con(Timing Controller,时序控制板),又称逻辑板、主板驱动板。功能接收来自主板(Main Board)的LVDS或eDP信号,将其转换为驱动液晶面板所需的时序信号(STH/STV、CKV/CKH等)。控制液晶分子的偏转角度,实现图像灰度显示。管理伽马电压(Gamma Voltage)和VCOM电压,确保色彩和对比度准确。
2025-05-15 09:54:31
644
原创 螺旋Pi代码
gpt-4o支持图片生成后,凑热闹试了下,个人感觉效果确实很OK,之前用mj或sd生成的图片,可能是不会提示词的原因,总感觉风格怪怪的,指令跟随不太好。微信搜一搜 “funio”,发现更多精彩内容。公众号 | FunIO。
2025-05-15 09:53:42
166
原创 CH347 USB2UART/SPI/I2C/GPIO/JTAG更新
CH347F #硬件开发 #嵌入式开发 #Python #Rust #开发工具。USB串口芯片很多,但支持高速USB、波特率能干到9M的可不多见。微信搜一搜 “funio”,发现更多精彩内容。公众号 | FunIO。
2025-04-01 09:56:34
494
原创 PCB设计错误案例
前几天我想做个烧写程序的探针,类似下面这样:这种探针有些是用塑胶件固定探针,比如亚克力钻孔;但是上图中这个看着应该是用PCB固定的,我决定也用PCB试试。
2025-04-01 09:55:27
385
原创 合并HEX文件
合并Intel HEX文件是嵌入式系统开发中的常见任务。通过理解HEX文件格式和合并逻辑,可以轻松实现HEX文件的合并。本文提供了一个基于Rust的简单实现,并讨论了处理复杂场景的方法。希望本文能帮助你更好地理解和处理HEX文件!rust库中有一个crate,用于开发中的合并情形基本够用,ihex-merge。这是个命令行工具,编译后只有 ~700KB,可以直接使用。注意,这个工具不支持段冲突的合并。后台回复ihex可以获取Windows二进制文件。公众号 | FunIO。
2025-03-11 10:36:14
983
原创 深入解析Intel HEX文件格式
Intel HEX文件格式是一种将二进制数据转换为ASCII文本的格式,适用于8位、16位和32位微处理器。它的主要优点是可以将二进制数据存储在非二进制介质(如纸带、穿孔卡片)上,并且可以通过CRT终端或行式打印机显示。ASCII表示:每个字节的二进制值被转换为两个ASCII字符。例如,二进制值00111111(十六进制3F)被表示为ASCII字符'3'和'F'。记录结构:HEX文件由多个记录组成,每个记录包含记录类型、长度、地址、数据和校验和。
2025-03-11 10:35:12
1485
原创 嵌入式系统中的状态机模式
并发模式主要关注如何管理多个任务的并行执行,旨在提高系统的响应速度和资源利用率。线程池模式(Thread Pool Pattern)互斥锁模式(Mutex Pattern)生产者-消费者模式(Producer-Consumer Pattern)信号量模式(Semaphore Pattern)这些模式通过不同的方式组织任务的并行执行,解决了嵌入式系统中常见的资源竞争、任务调度等问题。线程池模式通过创建和管理一组线程来执行任务,避免了频繁创建和销毁线程的开销。线程池模式可以提高系统的性能和资源利用率。
2025-03-04 09:40:15
660
原创 嵌入式系统中的并发模式
并发模式主要关注如何管理多个任务的并行执行,旨在提高系统的响应速度和资源利用率。线程池模式(Thread Pool Pattern)互斥锁模式(Mutex Pattern)生产者-消费者模式(Producer-Consumer Pattern)信号量模式(Semaphore Pattern)这些模式通过不同的方式组织任务的并行执行,解决了嵌入式系统中常见的资源竞争、任务调度等问题。线程池模式通过创建和管理一组线程来执行任务,避免了频繁创建和销毁线程的开销。线程池模式可以提高系统的性能和资源利用率。
2025-03-04 09:39:09
773
原创 嵌入式软件开发中的行为型模式
行为型模式主要关注对象之间的通信和职责分配,旨在提高系统的灵活性和可维护性。策略模式(Strategy Pattern)观察者模式(Observer Pattern)命令模式(Command Pattern)状态模式(State Pattern)责任链模式(Chain of Responsibility Pattern)这些模式通过不同的方式组织对象之间的交互,解决了嵌入式系统中常见的控制流复杂、代码耦合度高等问题。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。
2025-01-21 10:00:36
965
原创 敏捷在嵌入式软件开发中的应用
以上案例和描述表明,敏捷方法可以在嵌入式软件开发中取得成功。关键在于根据具体的项目特点和约束条件,选择合适的敏捷实践和工具,并结合嵌入式开发的特点进行调整。例如,需要更加重视硬件集成和测试、安全性、可靠性和实时性等方面。虽然公开的详细案例不多,但越来越多的公司开始尝试将敏捷方法应用到嵌入式软件开发中,并取得了积极的效果。随着相关技术和工具的不断发展,相信敏捷在嵌入式领域将会得到更广泛的应用。
2025-01-21 09:59:12
1046
原创 嵌入式系统软件设计模式:结构型模式
在嵌入式软件设计中,结构型模式扮演着至关重要的角色,它主要描述的是如何将类或对象按特定的布局组成更大的结构,以此来满足复杂的软件设计需求。简单来说,就是如同搭建积木一般,把不同的类或者对象当作积木块,按照一定的规则和方式组合在一起,构建出功能更强大、结构更完善的软件架构。这些模式可以帮助开发者更好地组织代码,提高软件的可维护性、可扩展性以及复用性。
2025-01-14 10:00:08
1173
原创 嵌入式软件开发:原型模式和建造者模式
原型模式是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。原型模式适用于创建对象成本较高或复杂的场景,通过复制现有对象可以提高效率。建造者模式是一种创建型设计模式,它通过一步一步地构建复杂对象,将对象的构建过程与表示分离。建造者模式适用于创建复杂对象的场景,通过将对象的构建过程封装在建造者类中,可以更灵活地创建对象。原型模式和建造者模式在嵌入式软件开发中有着广泛的应用。原型模式通过复制现有对象来创建新对象,适用于创建对象成本较高或复杂的场景。
2025-01-14 09:59:13
595
原创 我的创作纪念日
其次,我在平台上结识了许多志同道合的领域同行,我们互相交流技术心得,分享项目经验,共同探讨行业发展趋势。通过与他们的交流,我拓宽了视野,也获得了许多新的灵感和思路,使我在技术上不断成长和进步。我相信,通过不断的努力和坚持,我能够在技术创作的道路上走得更远,为技术社区做出更大的贡献。同时,我也计划学习更多的相关技术,如物联网、人工智能等,拓宽自己的技术边界,为未来的职业发展打下坚实的基础。
2025-01-09 09:54:27
442
原创 嵌入式系统软件开发:工厂模式的应用与分析
简单工厂模式:通过一个工厂类来创建不同类型的对象。工厂方法模式:定义一个用于创建对象的接口,但由子类决定实例化哪个类。抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这些模式在嵌入式软件开发中非常有用,可以帮助我们创建不同类型的对象,减少代码耦合,提高代码的可维护性和扩展性。公众号 | FunIO微信搜一搜 “funio”,发现更多精彩内容。个人博客 |
2025-01-06 10:57:27
833
原创 嵌入式系统软件开发:单例模式的应用与分析
在嵌入式系统中,单例模式广泛应用于资源管理、配置管理和通信管理等场景。通过单例模式,可以确保系统中只有一个实例来管理共享资源,避免资源冲突和配置不一致的问题。资源独占:确保共享资源(如GPIO、定时器、串口、I2C等)只有一个实例来管理,避免资源冲突。配置一致性:确保系统配置的一致性,避免多任务环境中的配置冲突。数据一致性:确保数据传输和通信的顺序和一致性,避免数据混乱。性能优化:减少内存开销和资源竞争,提高系统性能。通过合理应用单例模式,开发者可以构建出更加高效、可靠和易于维护的嵌入式系统。
2025-01-06 10:56:25
942
原创 嵌入式系统软件设计模式:创建型模式
设计模式是嵌入式系统开发中不可或缺的一部分,它们帮助开发者们在有限的资源下,实现高效的系统设计。希望通过本文系列,能够帮助开发者们更好地理解和应用这些模式,从而构建出更加高效、可靠的嵌入式应用。在下一篇文章中,我们将深入探讨创建型模式在嵌入式系统中的应用,敬请期待!公众号 | FunIO微信搜一搜 “funio”,发现更多精彩内容。个人博客 |
2024-12-31 09:45:10
1044
原创 嵌入式系统设计模式:构建高效、可靠的嵌入式应用
设计模式是嵌入式系统开发中不可或缺的一部分,它们帮助开发者们在有限的资源下,实现高效的系统设计。希望通过本文系列,能够帮助开发者们更好地理解和应用这些模式,从而构建出更加高效、可靠的嵌入式应用。在下一篇文章中,我们将深入探讨创建型模式在嵌入式系统中的应用,敬请期待!公众号 | FunIO微信搜一搜 “funio”,发现更多精彩内容。个人博客 |
2024-12-31 09:43:55
1245
原创 通过手机WiFi或者数据线利用网络共享来实现局域网内设备上网
上面这些方法在出差调试设备的时候很实用。这些都是我在出差设备调试时候踩过的坑。公众号 | FunIO微信搜一搜 “funio”,发现更多精彩内容。个人博客 |
2024-12-25 10:04:46
2920
原创 原创力不足与能用就行
举个不太恰当的例子,别的行业不太了解,以电子行业为例,我目光所及,我们这代所谓工程师的基本功,远不及以前那些用电子管晶体管做电路的老师傅,但是产值却可能高出数倍,这里面的水分到底是怎么来的。这样的教学方式,不仅让学生对仿真软件产生了依赖性,而且也让学生对电路的原理产生了模糊性,只大致记得仿真结果。其实一个简单的电路仿真引擎在现在的计算机上不难实现,老师多花一点时间,把这里的原理讲清楚,再让学生自己实现一个简单的仿真引擎,对学生的学习有很大的帮助,对学生一定会有很大的启发。公众号 | FunIO。
2024-12-25 10:03:50
172
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人