- 博客(103)
- 资源 (8)
- 收藏
- 关注
原创 对面向对象编程以及结构体的打包的新认识
本文探讨了嵌入式编程中结构体与面向对象思想的关联。通过分析STM32 HAL库和Linux内核源码,发现它们都采用定义复杂结构体变量(如Handle类型)的方式,其成员包含模块全部特性。这种"打包"方式使内存地址相连,简化成员访问。函数操作都以该结构体指针为第一参数,实现统一接口。这种模式体现了面向对象思想:结构体构建模块模型,函数以模型为基础进行操作,降低了编程复杂度,实现了数据与操作的封装。
2026-02-09 09:08:44
36
原创 STM32的HAL库中句柄变量的理解以及状态机思想
本文分析了STM32 HAL库的编程技巧:1)模块化设计,每个模块定义包含寄存器指针、状态等信息的句柄结构体;2)通过句柄变量集中管理模块数据,降低函数复杂度;3)采用分散式状态机机制,通过状态变量控制流程;4)主循环设计确保函数重复执行,避免冗余代码。这些设计体现了高效的单片机编程理念,如数据集中管理、状态控制等,展示了HAL库的精妙架构。
2026-02-06 11:50:16
713
原创 单if的条件触发判断
本文探讨了C语言中单if条件触发机制的特点与应用场景。单if结构适用于"条件触发"场景,即仅在条件满足时执行代码块,否则跳过。文中列举了红外人感播报、烟雾报警器等现实案例,说明其"默认静默、条件触发"的特性。与if-else等"条件判断"结构不同,单if具有单向响应、可叠加性、低干扰性等特点,更适合只需定义触发行为而不需处理未触发情况的场景。作者强调应根据实际需求选择适当的结构,不应混用条件触发和条件判断两种机制。
2026-02-05 13:39:39
39
原创 再议返回值、函数名、参数列表、函数体
本文总结了函数命名规则与代码组织方式的几点思考:(1)函数命名推荐"模块名_动词_宾语"格式,参数列表描述宾语特性,返回值类型有常规用法;(2)使用结构体封装相关数据,通过函数组操作结构体成员,体现"程序=数据结构+算法"理念;(3)函数拆分源于人脑记忆局限,子函数实现功能抽象;(4)源文件按模块组织,通常包含同名头文件,定义模块相关类型和操作函数。这些实践既符合计算机特性,又适应人脑思维特点。
2026-02-02 13:53:52
450
原创 c语言函数返回值类型有哪些常规用法
C语言函数返回值主要有三种用法:(1)表示运算结果,如求和函数返回int类型;(2)表示运行状态,0表示成功,非0表示错误;(3)返回指针类型,用于返回复杂数据地址。若要返回多个值,可通过输出型指针参数实现,函数返回值仅表示运行状态。这些用法体现了C语言函数设计的灵活性。
2026-01-30 11:31:10
18
原创 c语言函数定义为什么要避免“意大利面条式代码”
摘要:C语言中的"意大利面条式代码"指冗长复杂、缺乏模块化的大函数,其弊端包括难以理解、维护和测试。解决方法是将大函数拆分为职责单一的小函数,具有以下优势:降低认知负担、提高可读性、增强可维护性、便于测试、提升复用性、简化错误处理、利于调试。常见误解如"拆分影响性能"或"个人能驾驭大函数"都不成立。代码应优先考虑人的可读性而非机器效率,合理使用小函数是专业级代码的标志,要避免"大而全"的函数结构。
2026-01-28 14:51:45
410
原创 c语言中函数名如何合理“起名”
本文探讨了函数命名的核心原则和最佳实践。指出函数命名应体现其目的而非实现细节,建议采用"动词+宾语"结构(如get_data、init_system),避免笼统命名或暴露内部实现。强调命名应聚焦最终效果,保持清晰可读,必要时加入上下文信息。当命名困难时,可能意味着函数职责过多,需要拆分。良好的函数命名应让调用者一目了然其功能和副作用,且经得起实现变更。
2026-01-28 11:48:17
165
原创 C语言指针变量和函数调用的“超链接”属性
超链接的物体可能是一段字符、一个图标等非常简单的实物,当我们建立超链接后,打开超链接后可能是另外一个非常负责的实物,例如一整个网页。通过超链接去访问其他复杂实物,对应的就是通过指针变量去读写访问指向变量或者变量内部的成员,指针变量处于“运行态”。《3》对“普通变量”进行读访问、或者指针变量去读写访问指向的真正变量,或者函数调用,这个时候三者处于“运行态”。因为函数名本身对应的地址就是唯一的,所以函数访问的过程只有第一、三两步,函数名是只读的,不能写操作。(1)指针变量和函数调用的“超链接”属性。
2026-01-26 17:47:39
198
原创 结构体struct类型定义的意义和一个vscode实用插件
摘要:本文分享了关于STM32中间层LwIP源码的实践心得。首先探讨了结构体(struct)在C语言中的本质,指出其通过将相关变量打包为内存相邻的成员,简化了内存管理并提高了代码可读性,特别适用于硬件寄存器操作。其次推荐了VSCode插件"IFDEF Pathfinder",该插件通过彩色标记帮助开发者快速定位条件编译(#if/#else/#endif)的边界,解决了长代码段中条件编译难以追踪的问题。这两个发现对嵌入式开发和代码阅读都具有实用价值。
2026-01-25 10:44:02
416
原创 windows11窗口分屏的小技巧
摘要:本文介绍了在VSCode中实现两个STM32CubeMX生成代码窗口平行显示的方法。通过拖拽窗口到顶部选择分屏模式,再将另一个窗口放置在对应位置。当显示区域过小时,可将鼠标移至左侧出现竖线后拖拽调整,最终实现两个窗口左侧对齐的平行布局,有效提升了代码比较时的可视区域利用率。该方法解决了VSCode默认分屏模式无法满足特定需求的问题。
2026-01-22 10:50:16
175
原创 STM32中HAL库接口函数的共性以及架构思想
在其他HAL库中也有相似的用法,所以我们需要做的就是定义这个结构体类型的数据(寄存器组已经定义了,无需定义,硬件上自然存在),然后在需要的时候,调用这些API函数完成参数传参。真的很难想象,HAL库每一个源文件中少则十几个,多册几十个函数居然都是操作寄存器组,那可想而知,寄存器虽然没那么多,但是操作它的花样还是很多的,主要原因是每一个寄存器都有32bit,寄存器内部各个bit位代表不同硬件操作。首先,最顶层的是唯一的main.c,因为其他函数都是从main.c中的main()开始调用的。
2026-01-21 22:39:29
311
原创 capture原理图如何创建差分对以及allegro如何创建xnet并进一步创建引脚对
本文介绍了在Cadence Allegro中创建差分信号对和XNET的两种方法。第一种方法是在Capture原理图中通过Tools→Create Differential Pair创建差分对,然后导入Allegro。第二种方法是使用Analyze→Model Assignment创建XNET,选中元器件后创建ESpice Device模型,系统会自动生成XNET名称。最后在约束管理器中创建引脚对并设置等长约束。两种方法都提供了从原理图到PCB的完整设计流程解决方案。
2026-01-21 14:42:51
361
原创 EIDE的最新版本已经默认只支持debug调试STM32单片机了
摘要:最新版EIDE插件(V3.25.1+)已内置调试功能,无需手动配置launch.json文件即可实现Jlink调试STM32程序。相比之前文章中复杂的搭建步骤(详见CSDN博客),现在只需安装插件就能快速开始调试。具体使用方法可参考EIDE官网文档和论坛讨论帖。这一改进大幅简化了开发环境配置流程,提升了调试效率。
2026-01-20 17:35:38
216
原创 STM32单片机SWD接口是否需要RST引脚
本文比较了两种STM32单片机SWD接口设计方案的差异。作者的设计包含RST引脚(上拉10K电阻+100nF电容),烧录后自动运行;同事方案省略RST信号,仅使用100nF电容复位,需在Keil MDK中勾选"Reset and Run"才能自动运行。经测试两种方案均可行,但作者建议保留上拉电阻的复位电路设计,并认为包含RST引脚的SWD接口更便捷,可避免额外配置。文章为嵌入式开发者提供了实用的硬件设计参考。
2026-01-20 14:43:19
235
原创 STM32学习HAL库的一些知识点积累
本文记录了使用STM32CubeMX工具配置STM32F107RCT6控制板时遇到的两个关键知识点:1)外部时钟HSE配置中Bypass模式与无源晶振模式的区别,指出CubeMX保留OSC_OUT引脚是为防止功能冲突;2)详细解析了HAL库中寄存器操作的实现原理,包括寄存器地址映射、结构体封装、位操作宏定义等机制。通过分析RCC模块的具体实现,阐述了如何将硬件寄存器操作转化为C语言代码,验证了"硬件软件一盘棋"的理念以及C语言在嵌入式开发中的优势。
2026-01-19 17:18:50
892
原创 c语言什么时候适合用三目运算什么时候适合用阶梯判断
本文总结了Linux内核源码学习中的编程技巧心得:1)三目运算符适合单行表达式的情况,代码更简洁;2)switch-case适合"=="和"!="的关系运算;3)花括号{}定义了变量作用域,内部可访问外部变量但反之不行。合理运用这些技巧能提升代码质量和可读性。
2026-01-17 22:57:15
283
1
原创 linux源码的秘密:类比法理解函数指针参数实现间接访问
本文分享了Linux源码中的三个编程技巧:(1) 简化版三目运算 a?:b,当a非零时返回a,否则返回b;(2) 选择性数组初始化,允许跳过部分元素的显式初始化,未初始化的全局变量元素默认为0;(3) 通过函数参数指针间接访问全局变量,虽然本质上仍是访问全局变量,但能提高代码可读性和降低耦合性。文章最后用硬件设计中的网络名连接类比说明间接访问的优势,指出这种编程方式主要是为了降低代码复杂度而非减少全局变量访问次数。
2026-01-17 12:24:56
333
原创 什么情况下定义无参函数和含参函数
函数是否需要参数取决于其功能和访问的数据类型。无参函数适用于直接操作全局变量或完成固定功能(如初始化),但会降低代码的可移植性和安全性。含参函数则用于需要外部数据输入的情况,包括操作局部变量、实现可变功能或处理特定对象(如数据结构)。合理选择函数参数类型能提高代码的模块化和可维护性,减少全局变量的使用有助于避免多任务环境下的数据冲突问题。
2026-01-16 17:40:01
324
原创 allegro中等长设置中各个长度之间关系
摘要:在PCB等长走线设计中,约束管理器中的几个关键参数值得注意:Actual表示与目标值的误差,Margin显示与设定误差的差值(如±50mil),±值反映走线长短。Length包含走线长度(etchlength)和网络总长度(含过孔增量)。通过showelement可计算单个过孔增加的长度(27.6mil),该数值与层叠结构中的跨层长度增量一致。这些参数对精确控制走线长度具有重要参考价值。
2026-01-10 14:54:13
189
原创 硬件软件一盘棋
本文探讨了冯诺依曼架构硬件与C语言软件实现的对应关系。C语言中的变量(栈、堆、全局变量等)对应存储器(内存),各类运算对应CPU的运算器,流程控制语句(分支、循环等)对应控制器。特别指出指针运算体现了计算机的寻址特性,是C语言的灵魂。这种分析揭示了计算机硬件与编程语言之间的内在映射关系,展现了"硬件软件一盘棋"的本质。
2026-01-09 23:16:00
256
原创 为什么要定义无参函数,是否可以访问调用函数内部的临时栈变量?
本文分析了Linux源码与单片机代码中函数定义的差异。Linux源码多使用含参函数,因其能访问调用函数内部的临时变量、参数及外部变量;而单片机程序常采用无参函数,因其操作主要基于全局变量和寄存器。文章指出函数本质是数据处理器,其内部对各类变量进行读写访问。从作用域看,函数内部变量(参数、临时变量)位于栈内存,外部变量(指针指向的数据、堆内存等)位于全局内存或代码段。这种差异反映了系统复杂度不同带来的编程范式变化。
2026-01-04 22:43:31
329
原创 C语言标点符号逗号和分号使用区别
本文探讨了C语言中逗号和分号的区别及用法。分号(;)表示语句结束,相当于英文的句号;逗号(,)表示分隔和暂停,用于数组/结构体初始化、参数分隔等场景。逗号运算符还可连接多个表达式。分号用于终止语句,逗号用于分隔元素或表达式。两者的核心区别在于:分号表示终结,逗号表示分隔但未结束。理解这两种符号的语义差异对编写正确的C代码很重要。
2025-12-14 15:22:45
239
原创 如何判断指针变量是输入型、输出型、输入输出型参数
本文讨论了C语言函数调用中指针参数的三种类型:输入型、输出型和输入输出型。输入型参数用于只读操作,可通过const修饰、上下文分析、函数名含义或注释判断;输出型参数用于写入操作,可通过未初始化变量、特定函数名或注释识别;输入输出型参数则较为少见。文章提供了具体的判断方法,包括检查代码上下文、函数名含义、返回值类型及注释说明等,并建议必要时查看函数内部实现来确定参数用途。这些方法有助于准确理解函数指针参数的作用,提高代码的可读性和维护性。
2025-12-06 17:42:19
427
原创 IAR中如何添加.LIB文件
摘要:在查看代码时发现无法定位函数定义,经排查可能是库函数。通过搜索头文件找到对应的.lib文件,在IAR工程中需通过右键工程→Options→Linker→Library路径添加库文件。同时指出VSCode的EIDE插件中也有相应的库文件添加路径。文章分享了定位库函数和添加库文件的具体方法。
2025-12-02 22:41:55
192
原创 关于PCB布局几类选择的一些心得
本文总结了三种PCB布局设计方案:(1)无尺寸限制时优先在顶层放置直插和贴片元件,以顶层为主走线层,底层铺完整铜皮,成本最低;(2)元件过多时采用顶层直插+底层贴片布局,以底层为主层;(3)顶层直插+主贴片层与底层次贴片层组合方案,需考虑元件分层摆放。核心原则是优先顶层布局和走线,保持底层铜皮完整,仅在空间不足时考虑底层放置元件。三种方案根据实际需求灵活选择,在保证功能的前提下优化生产成本和制造便利性。
2025-11-27 17:59:02
222
原创 allegro软件中动态铜皮上十字花焊盘中间缝隙如何调节
摘要:在Allegro软件中完成PCB动态铺铜后,发现十字花焊盘间距过小(实测8mil)。通过查阅资料,找到修改SameNetSpacing参数的方法,将其值调整为12mil后重新更新铜皮,成功增大了焊盘间距,解决了设计问题。该调整方法简单有效,适用于类似铺铜间距的优化需求。(98字)
2025-11-27 08:45:49
219
原创 HAL库中SysTick定时器中断配置函数调用关系
摘要:在分析STM32F107RCT6代码时,发现SysTick定时器通过stm32f1xx_hal.c中的HAL_InitTick()函数配置。该函数通过HAL_SYSTICK_Config()设置定时器,并使用HAL_NVIC_SetPriority()配置中断优先级。SysTick的初始化路径有两条:1)通过SystemClock_Config()->HAL_RCC_ClockConfig()调用;2)通过HAL_Init()直接调用。中断服务号SysTick_IRQn在NVIC寄存器中配置。
2025-11-13 16:14:20
171
原创 程序员和小说家的相同点和不同点有哪些
程序员写代码与小说家写小说的核心区别在于目标受众和表达方式。程序员通过严谨的编程语言将思维转换为计算机可执行的指令,需要严格遵守语法规则,因为编译器无法像人脑一样处理模糊信息。而小说家使用自然语言与人交流,读者可以自行理解不完美的表达。两者都是将思想转换为特定语言的过程,但程序面向机器执行,需经历人脑思维到计算机逻辑的转换;小说面向人类读者,在同类思维间直接传递。这一本质差异决定了代码难以阅读而小说更易理解的特点。
2025-11-10 22:37:08
158
原创 cadence封装软件(LP Wizard 10.5)修改焊盘阻焊层误差
硬件设计中焊盘阻焊层应比BEGINLAYER大0.2mm(8mil),但LPWizard10.5软件默认阻焊层与BEGINLAYER大小相同。解决方法:1)进入preference设置;2)选择User模式,将SolderMaskx和SolderMaskY误差值改为0.10mm;3)保存设置并重启软件。这样即可确保阻焊层尺寸符合0.2mm的设计规范。
2025-11-10 14:13:36
223
原创 c语言函数定义头在K&R时代的早期写法
摘要:文章讨论了一种古老的K&R风格C语言函数定义方式(参数名在括号内,类型单独声明),在uboot源码中发现了这种写法。虽然现代编译器仍支持这种语法(如GCC/clang),但在C99/C11标准下会触发警告。建议改用现代原型风格定义函数(参数名和类型同时声明),提高代码可读性并避免编译器警告。文中给出了将K&R风格转换为现代风格的示例代码。
2025-11-08 12:17:51
326
原创 关于windows11拖动标题栏到窗口四边无法对齐
摘要:在Win11系统中,软件窗口拖拽至四边无法自动对齐的问题,可通过修改注册表解决。具体步骤:1.确保系统多任务处理的"窗口贴靠"功能开启;2.运行regedit;3.定位到HKEY_CURRENT_USER\ControlPanel\Desktop,将DockMoving值改为1;4.重启电脑后问题即可解决。该方法成功修复了窗口自动分屏功能失效的问题。
2025-11-08 11:22:07
168
原创 再议c语言中结构体和数组的概念
C语言中的结构体和数组本质上是内存访问的"语法糖",通过封装内存格子简化编程。结构体指针通过"->"运算符直接访问成员变量,体现了C语言基于"基址+变址"的内存访问机制。这种设计源于汇编语言传统和硬件限制(如ARM32每次只能处理4字节数据)。结构体和数组定义后,其整体概念被隐藏,实际可操作的只有内部的"小变量",就像人体只能吸收消化后的小分子营养物质一样。这种机制既符合硬件特性,又让开发者能专注于问题解决而非底层细节。
2025-11-02 10:30:34
147
原创 再议c语言的直接访问和间接访问
本文探讨了C语言中直接访问和间接访问的区别。普通变量可直接用"="和"."运算符读写,而代码、常量等需要通过指针间接访问。文章指出C语言中所有对象(变量、代码、常量)都具有指针特性,函数调用本质上也是通过指针实现。强调"指针是C语言的灵魂",掌握指针就能解决各种访问操作问题。建议编程时要牢记所有对象都有指针这一"句柄"属性,通过指针运算符可以实现对各类对象的读写操作。
2025-11-01 19:09:10
185
原创 c语言不使用中间变量接收函数调用返回值而是直接使用函数调用表达式
本文探讨了在C语言中直接使用函数调用表达式作为条件判断条件的优点与适用场景。主要优点包括:代码更简洁(减少冗余变量)、降低出错概率(避免中间变量被误修改)、提高可读性(逻辑更集中)、特别适合返回值只使用一次的情况。同时也指出了不适合直接使用函数调用的场景:返回值需多次使用、rand()等有副作用的函数、需要调试观察返回值时。文章强调应从C语言本身而非汇编角度理解这种写法,指出C语言通过隐藏底层实现细节(如寄存器使用)更接近人类思维,这正是其作为高级语言的特点。正确理解这种写法有助于编写更高效、可靠的代码。
2025-10-31 16:20:41
417
原创 C语言对变量进行读操作读到的值主要那用来做什么?
文章总结了读取变量值的5种主要用途:1)作为条件判断依据控制程序流程;2)作为赋值运算的右值;3)函数调用传参;4)参与各类运算;5)作为函数返回值。强调读取变量值是获取程序状态和数据的唯一途径,是所有后续处理的前提基础,对程序执行有界操作至关重要。
2025-10-31 11:56:51
183
原创 c语言函数内部局部变量主要起的作用有那些?
函数内部定义临时局部变量的主要作用包括:1)存储函数返回值;2)接收子函数返回结果;3)在寄存器操作中暂存数据;4)记录循环次数;5)保护参数不被修改;6)保存中间计算结果;7)作为布尔状态标志。这些临时变量存储在栈上,随函数结束自动释放,既确保了数据处理的灵活性,又避免了内存污染。通过合理定义局部变量,可以提高代码可读性,保护关键数据,并实现复杂的逻辑运算。
2025-10-31 11:25:33
210
原创 c语言关于函数入口和出口一些新想法
文章探讨了C语言函数调用的"入口"和"出口"概念。函数入口即参数传递过程,每个函数调用只发生一次传参,入口是唯一的。函数出口对应return语句,单return为单出口,多return则为多出口。作者用水管中小球流动作类比:小球(参数)从水管一端(入口)流入,单出口时小球统一流出,多出口时不同大小的小球从匹配的出口流出。这种理解方式有助于分析函数执行流程,特别是uboot等复杂代码中的控制流。
2025-10-28 21:36:49
210
原创 c语言宏定义的一些总结
本文总结了uboot源码中宏定义的四种主要用途:1)用宏表示环境常数,便于记忆和使用;2)用于标识寄存器及位操作;3)含参宏或带括号的宏能模拟函数作用,完成小段代码操作;4)类似函数复用功能,宏定义可将小段代码单独提取以便多次调用,且含参宏能根据不同参数产生不同结果。这些规律有助于理解和使用宏定义进行代码编写。
2025-10-26 11:25:43
198
原创 c语言中const关键字和枚举enum的新认识
摘要:C语言中表示常量主要有三种方式:(1)使用#define定义宏常量;(2)使用enum定义一组关联常量;(3)对于字符串、数字表格等数据,推荐使用const修饰的数组。const修饰的常量具有类型安全检查优势,能防止误修改,且在内存受限环境(如嵌入式系统)中更节省资源。前两种方式适合简单常量,而const数组更适合处理复杂数据(如设备型号、时间戳等),是平衡内存使用和安全性的优选方案。
2025-10-25 16:27:56
188
原创 关于函数调用其实是函数指针+传参+解引用的一些思考
本文探讨了C语言中直接访问与间接访问的区别。直接访问指函数直接操作全局变量进行读写。间接访问则通过函数三要素(声明、调用、定义)实现,重点在于函数调用时传递参数并跳转执行的过程。函数返回值被视为加工结果或运行记录,通过跳转返回调用者。无参函数常用于直接访问全局变量或寄存器。文章强调指针是C语言的灵魂,认为直接访问体现为全局变量操作,间接访问则是完整的函数调用过程,二者共同构成了C语言编程的核心机制。
2025-10-24 21:01:15
167
普中51单片机开发板仿真器最新软件+教程
2025-09-10
bear使用libear的i386版本的安装包
2025-07-27
MAX14972中文资料
2014-03-20
lenovo Z470 BIOS Update 安装包(32位和64位 独显或集显)
2013-08-21
EDA365_Skill_Package_V2.4
2018-04-02
Cadence高速电路板设计与仿真(信号与电源完整性分析第4版).part1
2015-10-22
Cadence高速电路板设计与仿真(信号与电源完整性分析第4版).part2
2015-10-22
cadence高速电路板设计与仿真(第四版)项目文件.part1.rar
2015-10-22
cadence高速电路板设计与仿真(第四版)项目文件.part2.rar
2015-10-22
SI软件遇到的变量误解析问题
2024-03-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅