- 博客(77)
- 资源 (8)
- 收藏
- 关注
原创 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
146
原创 程序员和小说家的相同点和不同点有哪些
程序员写代码与小说家写小说的核心区别在于目标受众和表达方式。程序员通过严谨的编程语言将思维转换为计算机可执行的指令,需要严格遵守语法规则,因为编译器无法像人脑一样处理模糊信息。而小说家使用自然语言与人交流,读者可以自行理解不完美的表达。两者都是将思想转换为特定语言的过程,但程序面向机器执行,需经历人脑思维到计算机逻辑的转换;小说面向人类读者,在同类思维间直接传递。这一本质差异决定了代码难以阅读而小说更易理解的特点。
2025-11-10 22:37:08
141
原创 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
185
原创 c语言函数定义头在K&R时代的早期写法
摘要:文章讨论了一种古老的K&R风格C语言函数定义方式(参数名在括号内,类型单独声明),在uboot源码中发现了这种写法。虽然现代编译器仍支持这种语法(如GCC/clang),但在C99/C11标准下会触发警告。建议改用现代原型风格定义函数(参数名和类型同时声明),提高代码可读性并避免编译器警告。文中给出了将K&R风格转换为现代风格的示例代码。
2025-11-08 12:17:51
302
原创 关于windows11拖动标题栏到窗口四边无法对齐
摘要:在Win11系统中,软件窗口拖拽至四边无法自动对齐的问题,可通过修改注册表解决。具体步骤:1.确保系统多任务处理的"窗口贴靠"功能开启;2.运行regedit;3.定位到HKEY_CURRENT_USER\ControlPanel\Desktop,将DockMoving值改为1;4.重启电脑后问题即可解决。该方法成功修复了窗口自动分屏功能失效的问题。
2025-11-08 11:22:07
133
原创 再议c语言中结构体和数组的概念
C语言中的结构体和数组本质上是内存访问的"语法糖",通过封装内存格子简化编程。结构体指针通过"->"运算符直接访问成员变量,体现了C语言基于"基址+变址"的内存访问机制。这种设计源于汇编语言传统和硬件限制(如ARM32每次只能处理4字节数据)。结构体和数组定义后,其整体概念被隐藏,实际可操作的只有内部的"小变量",就像人体只能吸收消化后的小分子营养物质一样。这种机制既符合硬件特性,又让开发者能专注于问题解决而非底层细节。
2025-11-02 10:30:34
128
原创 再议c语言的直接访问和间接访问
本文探讨了C语言中直接访问和间接访问的区别。普通变量可直接用"="和"."运算符读写,而代码、常量等需要通过指针间接访问。文章指出C语言中所有对象(变量、代码、常量)都具有指针特性,函数调用本质上也是通过指针实现。强调"指针是C语言的灵魂",掌握指针就能解决各种访问操作问题。建议编程时要牢记所有对象都有指针这一"句柄"属性,通过指针运算符可以实现对各类对象的读写操作。
2025-11-01 19:09:10
142
原创 c语言不使用中间变量接收函数调用返回值而是直接使用函数调用表达式
本文探讨了在C语言中直接使用函数调用表达式作为条件判断条件的优点与适用场景。主要优点包括:代码更简洁(减少冗余变量)、降低出错概率(避免中间变量被误修改)、提高可读性(逻辑更集中)、特别适合返回值只使用一次的情况。同时也指出了不适合直接使用函数调用的场景:返回值需多次使用、rand()等有副作用的函数、需要调试观察返回值时。文章强调应从C语言本身而非汇编角度理解这种写法,指出C语言通过隐藏底层实现细节(如寄存器使用)更接近人类思维,这正是其作为高级语言的特点。正确理解这种写法有助于编写更高效、可靠的代码。
2025-10-31 16:20:41
374
原创 C语言对变量进行读操作读到的值主要那用来做什么?
文章总结了读取变量值的5种主要用途:1)作为条件判断依据控制程序流程;2)作为赋值运算的右值;3)函数调用传参;4)参与各类运算;5)作为函数返回值。强调读取变量值是获取程序状态和数据的唯一途径,是所有后续处理的前提基础,对程序执行有界操作至关重要。
2025-10-31 11:56:51
168
原创 c语言函数内部局部变量主要起的作用有那些?
函数内部定义临时局部变量的主要作用包括:1)存储函数返回值;2)接收子函数返回结果;3)在寄存器操作中暂存数据;4)记录循环次数;5)保护参数不被修改;6)保存中间计算结果;7)作为布尔状态标志。这些临时变量存储在栈上,随函数结束自动释放,既确保了数据处理的灵活性,又避免了内存污染。通过合理定义局部变量,可以提高代码可读性,保护关键数据,并实现复杂的逻辑运算。
2025-10-31 11:25:33
169
原创 c语言关于函数入口和出口一些新想法
文章探讨了C语言函数调用的"入口"和"出口"概念。函数入口即参数传递过程,每个函数调用只发生一次传参,入口是唯一的。函数出口对应return语句,单return为单出口,多return则为多出口。作者用水管中小球流动作类比:小球(参数)从水管一端(入口)流入,单出口时小球统一流出,多出口时不同大小的小球从匹配的出口流出。这种理解方式有助于分析函数执行流程,特别是uboot等复杂代码中的控制流。
2025-10-28 21:36:49
177
原创 c语言宏定义的一些总结
本文总结了uboot源码中宏定义的四种主要用途:1)用宏表示环境常数,便于记忆和使用;2)用于标识寄存器及位操作;3)含参宏或带括号的宏能模拟函数作用,完成小段代码操作;4)类似函数复用功能,宏定义可将小段代码单独提取以便多次调用,且含参宏能根据不同参数产生不同结果。这些规律有助于理解和使用宏定义进行代码编写。
2025-10-26 11:25:43
182
原创 c语言中const关键字和枚举enum的新认识
摘要:C语言中表示常量主要有三种方式:(1)使用#define定义宏常量;(2)使用enum定义一组关联常量;(3)对于字符串、数字表格等数据,推荐使用const修饰的数组。const修饰的常量具有类型安全检查优势,能防止误修改,且在内存受限环境(如嵌入式系统)中更节省资源。前两种方式适合简单常量,而const数组更适合处理复杂数据(如设备型号、时间戳等),是平衡内存使用和安全性的优选方案。
2025-10-25 16:27:56
176
原创 关于函数调用其实是函数指针+传参+解引用的一些思考
本文探讨了C语言中直接访问与间接访问的区别。直接访问指函数直接操作全局变量进行读写。间接访问则通过函数三要素(声明、调用、定义)实现,重点在于函数调用时传递参数并跳转执行的过程。函数返回值被视为加工结果或运行记录,通过跳转返回调用者。无参函数常用于直接访问全局变量或寄存器。文章强调指针是C语言的灵魂,认为直接访问体现为全局变量操作,间接访问则是完整的函数调用过程,二者共同构成了C语言编程的核心机制。
2025-10-24 21:01:15
137
原创 函数内部数据的有效访问的“加锁”操作
本文讨论了变量访问的有效性问题。文章指出,对变量的有效访问必须遵循"先写入有效数据后读取"的原则,否则属于非法操作。作者建议采用"加锁"机制(条件判断)来确保变量访问的合法性,即只有当条件满足(变量已写入有效数据)时才执行相关代码。文中以STM32单片机多循环环境为例,说明当多个循环共享全局变量时,这种加锁机制能有效避免数据竞争问题。最后强调变量本质是数据的载体,真正重要的是变量中存储的数据内容而非变量本身。
2025-10-05 14:57:10
233
原创 函数体内部组成分类的说明
本文分析了单片机程序中的函数体内部组成分类,对四种常见情况进行了说明:1)栈内存中的局部变量,每次循环重新分配;2)static修饰的静态局部变量,具有全局存储但局部作用域;3)堆内存需手动管理;4)代码段分为无条件执行和条件执行两类。这些基础知识对初学者编写高效代码具有重要指导意义。
2025-10-03 08:25:23
194
原创 如何快速看懂一个STM32单片机项目代码
我最近在看我几个前同事写的STM32单片机代码,通过对比他们的代码我发现了一些相同之处,或者说他们写单片机的程序在宏观上存在某些相似的地方,我心里有了一些体会,又看了几个开发板的项目代码(当然了,没有仔细看,只是粗略地看了一遍),发现这些项目之间存在某些共性,这是我将来接触并理解其他项目代码的重要帮助,我现在记录下来,希望对我将来自己写代码能够有所帮助。看代码的过程是从C语言转换为自然语言的过程,我们人类更容易记住的事自然语言,因此读代码的时候时刻牢记读代码的目的是理解思路,而不是为了代码而读代码。
2025-09-30 22:36:01
323
原创 关于STM32单片机编程中大量使用全局变量而非使用函数调用的一些思考
本文对比分析了STM32单片机开发中两种多任务实现方式(freeRTOS和裸机+定时器)的编程特点。发现两种方式都采用"全局变量+读写函数"的任务架构,任务间直接通过读取全局变量通信而非接口函数。作者认为这种做法在嵌入式开发中更便捷:1)减少接口函数定义调用复杂度;2)便于IDE调试时观察变量;3)符合"代码是数据处理器"的本质,各任务循环运行产生不同全局变量值,这些值既代表代码执行路径也反映实际事件状态。这种全局变量驱动的方式在代码量不大的嵌入式系统中具有实用优势。
2025-09-28 22:55:21
129
原创 关于STM32单片机freeRTOS多任务编程的一些思考
该STM32程序基于FreeRTOS操作系统,将充电桩功能划分为7个独立任务:读卡器、LED显示、充电操作、电压电流温度检测、错误检查、串口通信和查询任务。任务划分的关键在于保持独立性,每个任务只处理自身领域的工作。以LED显示任务为例,通过两个全局变量实现状态读写分离,LED_State_Operate()负责写操作,LED_Show_Operate()负责读操作和处理。这种面向对象的设计方式(而非面向过程)增强了代码的可维护性和扩展性,各任务通过弱耦合实现宏观上的并行处理,降低了编程复杂度,体现了操作系
2025-09-17 22:42:21
315
原创 freeRTOS中SysTick中断使能函数调用关系
摘要:在分析STM32单片机代码时发现,虽然调用了HAL_NVIC_SetPriority()配置SysTick优先级,但找不到HAL_NVIC_EnableIRQ()使能SysTick中断。经查证,SysTick中断使能是通过直接操作寄存器实现的,位于FreeRTOS的port.c文件中。具体调用链为:main()→osKernelStart()→vTaskStartScheduler()→xPortStartScheduler()→vPortSetupTimerInterrupt(),最终通过portN
2025-09-17 14:56:26
221
原创 关于单片机编程的循环以及全局变量应用的思考
摘要:本文分享了阅读STM32单片机程序的几点感悟:(1)程序由主循环和中断服务循环构成,宏观并行微观串行;(2)全局变量用于记录程序运行状态,同事代码中大量使用全局变量进行读写操作;(3)好代码的标准是函数及内部分支都能被执行到,而非仅考虑所有情况;(4)程序数据流可归纳为"产生-存储-读取"三步曲;(5)理解单片机程序需将代码放在循环框架中考虑,区分运行态和挂起态。这些观察对编写高效单片机代码具有指导意义。
2025-09-16 22:22:19
207
原创 老鸟对单片机全局变量常用用法(读写在2个独立函数中)
这篇文章总结了老手程序员处理全局变量的经验:将变量的读写分离到不同函数中,写入函数负责更新数值,读取函数通过循环判断条件来响应变化。这种架构虽然降低了代码可读性(需要追踪调用关系),但保证了数据处理的实时性。程序整体由多个循环构成(主循环、中断服务等),读取函数通过条件判断选择性执行,只有满足条件时才处理数据。这种设计体现了模块化思想,是新老程序员的重要区别之一。
2025-09-15 22:33:04
131
原创 win11 24h2“使用Windows更新修复问题”后VMware中虚拟机显示“线缆已拔出”没有有线符号
摘要:用户成功修复Win11 24H2系统无法安装9月累积更新的问题,通过系统恢复中的"使用Windows更新修复"功能完成升级。但随后发现VMware中的Ubuntu24.04无法联网,右上角无网络图标,远程访问工具均失效。最终在VMware的虚拟网络编辑器中选择"还原默认设置",将网络从NAT改回桥接模式后解决问题,确认Ubuntu系统本身无故障。整个修复过程涉及系统更新和虚拟机网络配置两个关键环节。
2025-09-13 09:09:56
308
原创 人脑中想的语义是如何通过C语言转换为可执行代码的
**完整性** | 可能省略细节(比如“自动排序”) | 必须明确每一步(分配内存?| **抽象程度** | 高度抽象(如“让程序聪明一点”) | 具体到变量、指针、循环、函数调用 || **表达方式** | 模糊、直觉、图像化、跳跃性思维 | 精确、线性、逻辑严密、语法严格 |你心里的想法是**高级语义 + 直觉模型**,而C代码是**低级指令 + 精确控制**。3. **多调试、多反思**:运行代码,看结果是否符合预期,不断调整。🎯 所以,编程不是“复制”想法,而是**用逻辑重建想法的过程**。
2025-09-11 21:55:46
438
原创 关于读代码和写代码的一些思考
文章探讨了"看代码多却写不出代码"的问题,认为关键在于思维方式的转变。作者将编程过程分为两个阶段:思考阶段是用自然语言进行功能规划,写代码阶段则是用C语言将规划翻译成计算机可执行的指令。指出写代码需要同时理解硬件环境(芯片寄存器等)和功能需求,并用C语言实现这两者的结合。强调看懂代码不仅要理解语法,更要理解背后的设计意图(语义)。文章最后指出,从人类想法到可执行程序需要经过多次语言转换和重构过程。
2025-09-10 15:29:45
310
原创 寄存器和内存的区别以及寄存器硬件置位
(vscode搜索关键字),后来我想到数据手册中提到了SBUF这个寄存器与TI、RI寄存器的关系,当SBUF寄存器做左值进行写操作的时候,硬件就会自动给TI寄存器写1(这个是隐藏的)。当SBUF寄存器做右值的时候会进行读操作,硬件会自动给RI寄存器写1(这个也是隐藏的)。最近在看C51的程序,里面用到了串口中断服务函数,中断服务函数中去判断是发送还是接收中断,也就是用到了TI和RI这2个寄存器的值,如果TI被写1了就要通过串口SBUF寄存器发数据出去,如果RI被写1了,就要读取SBUF寄存器的值。
2025-09-10 14:10:51
337
原创 clang(clangd)与arm-linux-gcc、ARMGCC、ICCARM(IAR)、C51编译器的兼容性
本文总结了在VSCode环境下使用Clangd进行嵌入式开发的兼容性测试结果。在STM32/ARM-Linux开发中,Clangd能良好兼容GCC工具链生成的compile_commands.json文件。但针对Keil C51开发时,Clangd会出现识别问题(如sbit关键字、REG51.H头文件等),推荐改用VSCode的C/C++插件。测试发现Clangd对IAR和Keil MDK的兼容性相对较好,未出现严重错误,可暂不使用C/C++插件。不同工具链的兼容性差异较大,需要根据具体开发环境选择合适方案
2025-09-06 11:49:53
498
原创 关于程序中宏定义以及编码思想一些思考
其实,程序员的工作很大一部分就是将遇到的事物编码成一个一个 有意义的数字(例如寄存器的不同值代表的含义),因为计算机是不识别自然语言的,只识别这些编码过的数字(实际上就是1010...的二级制代码)。例如GPIO_InitStruct这个结构体变量以及对应的内存格子之间也是一种编码的关系,GPIO_InitStruct更接近自然语言,对应的格子才是计算机操作的单元。(1)宏定义的本质是事物或者特性被编码成一个一个有意义的数字,或者这样说,用数字去描述或者编码事物的特性。c语言为什么是高级语言?
2025-09-03 22:14:35
360
原创 keil MDK如何使用第三方软件Keil2Json.exe生成compile_commands.json文件,方便vscode+clangd环境使用
最后,右键使用“vscode”打开,右键---》命令面板---》Clangd:Restart Language Server--->生成了.cache文件夹。在需要生成compile_commands.json文件的地方打开“终端”,然后输入“ Keil2Json.exe”然后输入。第三方软件的名字是“Keil2Json.exe”,下面是github上的相关地址。使用方法:首先将Keil2Json.exe文件所在路径添加的PATH环境变量中。
2025-09-01 10:55:05
374
原创 vscode+EIDE+Clangd环境导入keil C51以及MDK工程
如果使用keil C51以及MDK环境开发51单片机或者STM32单片机就需要使用到了EIDE这个插件这个插件现在能够自动生成compile_commands.json文件,这样clangd插件就可以找到并生成“.cache”文件夹。到这里自动生成EIDE相关文件尤其是build文件夹以及.clangd文件,不用做什么build文件夹下的compile_commands.json文件已经被clangd识别了。最后,右键---》命令面板---》clangd:Restart Language Server。
2025-08-31 22:41:18
619
原创 IAR工程如何搭建vscode+clangd编辑环境
摘要:作者分享在VSCode中使用clangd插件解析IAR工程的经验。通过EIDE插件导入IAR工程后,在build文件夹下自动生成compile_commands.json文件。需在clangd配置中添加"-compile-commands-dir=${workspaceFolder}/build/SmartB_OS_Project"参数(注意使用"/"路径分隔符),重启VSCode后成功生成.cache文件夹,实现头文件、函数等代码元素的准确跳转。详细解决方案可
2025-08-30 11:18:51
495
原创 IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)
摘要:使用IAR工程生成clangd所需的compile_commands.json文件,可通过iarbuild.exe命令实现。具体步骤包括:将iarbuild加入环境变量,在工程目录执行命令生成json文件。但作者发现生成后vscode+clangd仍无法创建.cache文件,原因不明,希望得到解决方案。整个流程展示了将IAR工程与clangd工具链结合的方法,但存在兼容性问题待解决。(149字)
2025-08-29 22:35:01
330
原创 C89标准关键字以及运算符分类汇总
本文总结了C语言的关键字和运算符。C89标准包含32个关键字,分为数据类型、流程控制、存储类型和其他四类。运算符包括算术、比较、逻辑、赋值、位运算等14类共40余个,涵盖了基本运算、指针操作、数组访问等核心功能。作者特别标注了易遗漏的关键字和运算符的多种用法,并表示后续会继续补充完善。这份汇总为学习C语言提供了系统性的参考框架。
2025-08-28 18:09:34
380
原创 C语言中全局变量声明为什么可以省略元素个数的一些思考
我感觉这与全局变量的另外一个用途有关,就是可以在当前.c源文件中使用数组,但是大家都知道数组作为一个整体是无法直接读写的。是通过“基址+变址+解引用”实现的基址就是数组名,也是数组首元素的地址,变址就是i*sizeof(flash_info_t),解引用就不用说了计算机最擅长续写访问内存格子了。(1)声明是给编译器使用的,目的是告诉编译器在另外一个地方(内存或者外存)中定义了一个变量或者函数。在这里,是告诉编译器在其他.c源文件中定义了一个元素类型为flash_info_t的数组变量。
2025-08-27 16:41:45
180
原创 关于vscode的右键常用操作以及自定义快捷键V2.0(251114)
本文分享了使用VSCode进行嵌入式开发的实用技巧,重点介绍了五个常用右键操作和自定义快捷键配置:F8跳转类型定义、F9查看所有引用、F10显示调用层次、F11转至定义、F12转至声明。文章还推荐了优化布局的方法,包括将引用窗口移至右侧和使用ContextWindows插件来增强功能。这些技巧能显著提升代码导航效率,特别适合从Keil转向VSCode的开发者。
2025-08-27 11:31:18
429
原创 关于“程序=数据结构+算法”的深层认识
我可能说的不清楚,我在这里想表达的是数据结构是一种人类对实物特性的描述,可以用自然语言描述出来,大家理解他为一种概念,一种名词,一种形而上学的东西即可。最近在学习C语言编写的单片机程序,想到了以前上学的时候的一句名言“程序=数据结构+算法”,我现在对这句话有了一些自己的想法,记录下来希望对大家有所帮助,如果大家有不同意见,希望指出来,反驳我。算法是一种抽象的概念。函数是根据算法的内容使用计算机编程语言所写的代码,注意函数是占用外存空间的,是已近实现了的指令集,需要烧写到计算机的外存设备中。
2025-08-25 17:31:32
359
原创 C语言设计的时候,对结构体成员的访问运算符“.”和“->”为什么不用一种的思考
本文探讨了C语言中结构体成员访问运算符"."和"->"的区别。表面上看,"."用于直接访问结构体变量成员,"->"用于通过指针访问,左值类型不同。更深层次地,这体现了静态和动态的区别:"."表示成员与结构体绑定在同一内存空间,是静态关系;而"->"通过指针解引用实现动态访问,不受内存空间限制,体现了指针的灵活性。这种设计让程序员能直观区分直接访问和间接访问,同时充分发挥指
2025-08-24 11:17:11
235
原创 cadence16.6原理图导网表遇到的“ERROR(ORCAP-36003): Conflicting values ofComponent Definition properties ”问题。
今天我在看海思的一款芯片的Demo板的原理图,我最近要根据这个Demo进行PCB修改。我查找了好多资料,最终发现一种添加环境变量的做法是最简单的(我以前的做法是一个一个去掉Device的属性值,现在想想好复杂)。我分析原因就是因为原理图元件符号电阻的“Device”属性都是一样的,但是Value不同,这样就导出网表的时候错误了。需要在环境变量中新建一个名为:“ignore_prop”,数值为“device”的环境变量。现在就生成网表的时候,自动忽略检查因为device相同,但是value值不同的原因了。
2025-08-22 11:56:24
502
原创 关于Linus的名言“低水平程序员总在考虑代码,高水平程序员总在考虑数据结构及其之间的关系”的理解
文章探讨了程序员水平差异的关键在于对数据结构的重视程度。低水平程序员往往直接关注代码实现,采用面向过程思维;而高水平程序员则优先考虑数据结构设计及其关系,体现面向对象思想。作者通过分析Linus的名言,指出程序本质是数据结构与算法的结合,其中数据结构是核心骨架,算法是实现血肉。理解数据结构间的关联是最高境界,这需要程序员具备全局视角,从数据流动和变化的角度把握程序运行机制。文章强调优秀代码应首先构建合理的数据模型,再设计操作函数,最后通过变量交互实现功能。
2025-08-21 22:18:47
277
原创 cadence16.6修改原理图的Page Number过程中遇到问题
吐槽:我感觉这个是16.6版本cadence的一个Bug。按理说不用自己创建这个属性,但是实际没有需要自己创建。今天我在修改多页原理图,但是原理图页名和Page Number不匹配,找了好长时间才解决,希望对大家有所帮助。(3)新建一个名为“Page Number”的属性,并填写对应数值。(4)保存,现在当前页的名字就和页码一一对应了。(2)双击右下角的Title,打开属性菜单。(1)进入需要修改的某一页原理图。
2025-08-20 17:52:48
285
普中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订阅