- 博客(91)
- 收藏
- 关注
原创 STM32零基础教程(七):看门狗、低功耗与FreeRTOS
看门狗像一位值班员。如果程序长期不“报平安”,值班员就认为系统卡死并自动复位。低功耗不是简单地“降低 CPU 频率”,而是根据工作状态关闭不需要的时钟和电源。裸机主循环适合小项目;当项目同时包含通信、显示、采集和控制时,可以使用 RTOS 管理多个任务。FreeRTOS 像一个调度员,让不同任务轮流使用 CPU。
2026-08-12 15:25:16
249
原创 STM32零基础教程(六):ADC、I2C、SPI与DMA
STM32零基础系列第6篇:学习ADC电压采集、I2C设备地址与应答、SPI全双工通信,以及使用DMA降低CPU数据搬运负担。
2026-08-12 15:25:06
183
原创 STM32零基础教程(一):开发环境、专业术语与第一个工程
STM32零基础系列第1篇:认识MCU、Cortex-M、HAL、LL、CMSIS、CubeMX和CubeIDE,完成开发环境准备、工程创建、编译下载与第一个LED闪烁程序
2026-08-12 15:23:25
286
原创 STM32零基础教程(五):UART串口通信与协议设计
STM32零基础系列第5篇:掌握UART波特率、帧格式、轮询、中断和DMA接收方式,学习环形缓冲区、空闲线接收以及可靠数据帧协议设计。
2026-08-07 09:19:50
147
原创 STM32零基础教程(四):定时器、PWM与输入捕获
STM32零基础系列第4篇:理解PSC和ARR定时参数,使用定时器中断产生系统节拍,通过PWM控制亮度和速度,并利用输入捕获测量脉宽与频率。
2026-08-07 09:17:27
334
原创 STM32零基础教程(三):GPIO、时钟系统与外部中断
STM32零基础系列第3篇:系统学习GPIO输入输出、推挽与开漏、上拉下拉、复用功能、RCC时钟树、SysTick、EXTI和NVIC外部中断。
2026-08-07 09:16:12
176
原创 STM32零基础教程(二):嵌入式C、芯片架构、启动流程与内存
STM32零基础系列第2篇:掌握嵌入式C中的位运算、volatile、指针与回调,理解Flash、SRAM、栈、向量表、启动文件以及程序从上电到main()的完整过程。
2026-08-07 09:14:35
219
原创 STM32零基础教程(一):开发环境、专业术语与第一个工程
STM32零基础系列第1篇:认识MCU、Cortex-M、HAL、LL、CMSIS、CubeMX和CubeIDE,完成开发环境准备、工程创建、编译下载与第一个LED闪烁程序。
2026-08-07 09:12:21
209
原创 VS Code 配置 Codex:通过 API 中转服务接入
Codex 是 OpenAI 的编程智能体,可以在 VS Code 中读取项目代码、修改文件、运行命令,并辅助完成开发任务。如果你的网络环境或团队架构需要统一出口,可以让 Codex 通过 API 中转服务访问模型。
2026-07-29 08:21:14
1266
原创 【Blender】Blender编辑器常用快捷键汇总
摘要:Blender常用快捷键分类指南:1)视图导航(鼠标中键旋转/平移,小键盘切换视角);2)物体操作(Shift+A添加,G/R/S移动/旋转/缩放);3)编辑模式核心(Tab切换,E挤出,Ctrl+R环切);4)原点与变换(Ctrl+A应用变换,Alt+G/R/S清除,右键设置原点)。建议优先掌握G/R/S变换、挤出和环切操作,通过F3搜索快速查找功能。合理使用这些快捷键可显著提升3D建模效率。
2026-07-08 15:32:24
980
原创 【编程基础】浮点数是如何表示数据的?为何存在精度丢失问题?为何无法比较问题?
计算机底层使用IEEE 754标准表示浮点数,分为符号位、指数位和尾数位。以3.0和3.146544为例:3.0可完美转换为二进制11.0,科学计数法表示为1.1×2^1,能精确存储。而3.146544转换为二进制时会产生无限小数,尾数位被迫截断,导致精度损失,显示值可能与实际值存在微小差异。因此编程中不应直接用==比较浮点数,因其底层存储可能存在截断误差。
2026-07-06 16:06:07
182
原创 【OpenGL】顶点/片段着色器理解
本文解析了OpenGL着色器代码,包含顶点着色器和片段着色器。顶点着色器接收位置(vec2)和颜色(vec3)输入,通过out变量将颜色传递给片段着色器。片段着色器接收插值后的颜色,输出带透明度的最终颜色(vec4)。代码展示了现代OpenGL的核心流程:CPU提供顶点数据,GPU在着色器中并行处理渲染。关键点包括版本声明、变量传递机制、坐标转换和颜色插值。
2026-07-06 14:19:47
343
原创 【C++】字符串字面量拼接
C/C++支持字符串字面量拼接特性:相邻字符串(仅间隔空白符)会在预处理阶段自动合并。这种写法常用于嵌入多行GLSL着色器代码,既能保持代码可读性,又能正确保留换行符(避免反斜杠续行符的易错性)。从编译器角度看,拼接后的字符串与单行书写完全等价。C++11还提供了原始字符串字面量(R"()")作为更优雅的替代方案,可免去手动换行和转义,显著提升多行文本的可维护性。
2026-07-06 10:00:37
251
原创 为什么会有深拷贝和浅拷贝?
深拷贝和浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个,而对于对象或者引用数据来说在进行浅拷贝时,只是将对象的引用复制了一份,也就内存地址,即两个不同的变量指向了同一个内存地址,那么在改变任一个变量的值都是该变这个内存地址的所存储的值,所以两个变量的值都会改变。
2023-09-20 22:55:58
253
原创 【Linux】进程理解
进程是系统进行资源分配的基本单位,是程序加载到内存后的执行过程。进程一般由数据段,代码段和进程控制块三部分组成。系统通过进程控制块感知进程的存在并对进程进行控制。由于进程之间空间相互独立,多进程比多线程更安全,一个进程基本上不会影响另外一个进程。进程fork以后,遵循读时共享写时复制的机制。文件描述符和mmap建立的映射区。子进程的进程ID,定时器,未决信号集和父进程不同。
2023-09-20 22:55:12
277
原创 【Linux】字节序理解
大端法:7f存在0x1003 5f存0x1002 3f存0x1001 1f存0x1000 低存高。小端法:7f存在0x1000 5f存0x1001 3f存0x1002 1f存0x1003 低存低。比如0x1f3f5f7f 地址0x1000 0x1001 0x1002 0x1003。
2023-09-20 22:55:06
458
原创 【Linux】死锁理解
因为资源调度的方式不合理或者资源的稀缺性,导致进程间的相互等待。互斥条件,请求和保持条件,环路等待条件,不可剥夺条件。死锁的预防只要破坏死锁产生的四个必要条件。通常采用预先静态分配方法,可以破坏请求和保持条件。死锁的避免:采用银行家算法,只要系统处于安全状态,系统便可避免死锁。死锁的解决:撤销进程,剥夺资源。
2023-09-20 22:54:55
313
原创 【Qt】Qt中的中心部件意义
需要注意的是,setCentralWidget()函数会将之前设置的中心部件替换为新的中心部件。在Qt中,中心部件是指QMainWindow类中的一个QWidget对象,它被放置在主窗口的中心区域。中心部件在整个窗口中占据主要的显示区域,用于显示应用程序的主要内容。使用setCentralWidget()函数可以方便地设置窗口的中心部件,使其占据主要区域,并显示应用程序的主要内容。总而言之,中心部件在Qt中具有重要的意义,它是应用程序的核心显示区域,用于展示主要内容和提供交互功能。
2023-09-15 23:10:55
4764
1
原创 【Qt】Qt中关联容器QMap,QMultiMap,QHash,QMultiHash 的理解
详解Qt中的四种关联容器,并回答了QMultiHash和QMultiMap到底有哪些区别的问题
2023-09-15 18:35:59
1648
原创 【C++】Qt的属性系统,简单示例
这个例子中,text属性用于设置和获取标签的文本。当按钮被点击时,text属性会被修改,标签的文本也会相应地改变。
2023-09-15 18:02:42
329
原创 【Linux】Base64编码
Mz1 对这3个字符进行一个Base64编码理解,把他化为2进制数据,在以6个位为单位分割,然后用这个16进制化为10进制,查表得出阿斯卡码对应的字符,那么这个字符就是base64编码,因为64个字符有64阿斯卡码。相关截图源于一个b站up主,我是记录下学习用的。
2023-09-11 22:54:04
376
原创 【C++】auto关键字推导规则
(1)当不声明为指针或是引用时,auto的推导结果和初始化表达式抛弃引用和const属性限定符后的类型一致,图上面的e和f。(2)当声明为指针或是引用时,auto的推导结果将保持初始化表达式的const属性。
2023-09-06 22:38:25
287
原创 【C++】c++内存结构
栈 stack :是那些编译器在需要时分配,在不需要时自动清除的存储区。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。在 C 语言中,未初始化的放在.bss段中,初始化的放在.data段中;堆 heap :由 new 分配的内存块,其释放编译器不去管,由程序员自己控制。代码区 (.text段) :存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。常量存储区 (.rodata段) :存放常量,不允许修改(通过非正当手段也可以修改)。
2023-09-06 21:00:30
579
原创 【Linux】协程理解
协程是一种比线程更加轻量级的存在,一个线程可以拥有多个协程。无论是进程还是线程,都是由操作系统所管理的。而协程不是被OS所管理,而完全是由程序所控制(也就是在用户态执行)。
2023-09-06 20:27:01
113
原创 【Linux】Epoll触发模式
讲讲epoll的边沿触发和水平触发水平触发:如果epoll_wait缓冲区有数据则直接返回。边沿触发:如果一次没有读完epoll_wait缓冲区中的数据,则只有当另外有数据再写入时,才返回。 使用边沿触发和非阻塞IO来达到水平触发的效果,减少了epoll_wait的调用次数,提高了效率。 边沿触发可以只读取缓存区中前面的部分信息,进而分析后面的信息是否有用,如果无用则直接丢弃。
2023-09-06 20:26:49
253
原创 【C++】map和unordered_map
空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点以及红/黑性质,使得每一个节点都占用大量的空间。适用处,对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map。红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高。有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作。因为内部实现了哈希表,因此其查找速度非常的快。
2023-09-06 20:26:40
205
原创 【算法奥义】二叉搜索树的最近公共祖先
这样理解,一个人从郑州到上海,一个交叉口就是一个节点,两个人各走各的,把节点都存储到数组中,然后遍历,第一个不相等节点,就是二者最小公共祖先节点。第二种解法:两个人一起走,突然有个路口要分离,【需要进行一次判断】,那么这个就是最小公共祖先,省去了一部分存储,
2023-09-06 20:26:28
172
原创 【C++】析构函数尽量是虚函数
为了实现多态的动态绑定,通常将基类指针指向派生类对象,当指针销毁时,如果析构函数不是虚函数,根据析构函数在继承中的调用顺序,则派生类对象将不会被析构,造成内存泄漏。析构函数不是虚函数容易引起。
2023-09-06 20:26:17
247
原创 【Linux】mmap存储映射
将磁盘空间映射到进程空间,使进程可以采用指针的方式操作这段内存,而不用调用read和write函数。提高了读写的效率,同时也可以实现进程间的通信。
2023-09-05 15:44:15
121
原创 【Linux】网络编程IO理解
它要求主线程只负责监听文件描述符上是否有事件发生,有的话立即将该事件通知工作线程。读写数据,接受新的连接以及处理客户请求均在工作线程中完成。它将所有IO操作都交给主线程和内核来处理,工作线程仅仅负责业务逻辑。
2023-09-05 15:43:32
202
原创 【Linux】select,poll,epoll区别
select poll epollselect单个进程打开的文件描述符有上限,为1024或者2048。select对于有响应的事件需要轮询来查找满足要求的事件。每次调用select都需要把文件描述符集合从用户态拷贝到内核态。poll描述fd的集合是链式的,解决了打开文件描述符数量的限制。同样需要轮询满足事件的文件描述符。也需要进行用户态和内核态的文件描述符拷贝。poll是水平触发。epoll使用了mmap内存映射技术和红黑树的数据结构。通过三个函数来监听多个文件描述符,同时不随数量的上升效率呈线性的
2023-09-05 15:42:21
204
原创 【Linux】字节序理解
大端法:7f存在0x1003 5f存0x1002 3f存0x1001 1f存0x1000 低存高。小端法:7f存在0x1000 5f存0x1001 3f存0x1002 1f存0x1003 低存低。比如0x1f3f5f7f 地址0x1000 0x1001 0x1002 0x1003。
2023-09-05 15:39:51
119
原创 【Linux】一些常见查看各种各样信息的命令
Linux命令find命令,用来查找文件。常用的按照名字查找-name,按照文件类型查找-type,linux常用的文件类型有七种,普通文件,目录文件,管道,套接字,软链接,块设备,字符设备。还可以按照文件大小查询-size。grep命令,按照文件内容来查找。使用规则是grep option pattern fileps auxcurl命令 访问一个网页df查看磁盘大小du查看目录大小free -h 查看内存大小和使用情况top查看系统的实时负载netstat -ta 查看监听的TCP
2023-09-05 15:37:09
809
原创 【Linux】进程调度方式
进程调度方式抢占式:立马停止。非抢占式:时间片用完或者等待资源时,再调用另一个进程。进程调度算法先来先服务短作业优先优先级调度时间片轮转高响应比优先
2023-09-05 15:35:40
80
原创 【Linux】线程同步及资源共享
线程间同步互斥锁读写锁(读时共享,写时互斥)条件变量信号量(互斥锁的升级版)自旋锁(可以避免进程或线程上下文的开销)线程共享资源文件描述符表(打开的文件)进程用户ID和进程组ID进程的内存地址空间.text代码段 .data数据段 .bss heap堆区 全局变量 静态变量每种信号的处理方式进程的当前目录线程独享资源线程栈寄存器组的值线程ID错误返回码errno变量线程信号屏蔽字线程优先级
2023-09-05 15:34:51
97
原创 【Linux】进程间通信与同步
IPC进程间通信无名管道pipe(血缘关系的进程)有名管道fifo (无血缘关系的进程)共享内存信号(开销小)消息队列信号量套接字进程间同步文件锁信号量
2023-09-05 15:33:12
177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅