自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 WSL2搭建ESP32S3开发环境 不安装和使用GUI

首先将 EIM 仓库添加到 APT 源列表,以便后续使用 APT 安装 EIM。然后APT安装EIM CLI。

2026-06-27 02:09:25 262

原创 嵌入式面试高频题第6弹:SPI vs I2C对比、Flash读写原理、Bootloader设计,这3个搞不定等于白学

Bootloader是启动加载器初始化硬件判断是否需要更新固件如果需要,从串口/USB/网络接收新固件并写入Flash跳转到应用程序执行│ Bootloader工作流程: ││ ││ 上电 → Bootloader启动 → 检查更新标志 ││ ↓ ↓ ││ 有更新请求 无更新请求 ││ ↓ ↓ ││ 接收新固件 跳转到APP ││ 写入Flash ↓ ││ 清除标志 APP运行 ││ 跳转到APP ↓ ││ ││ Flash布局: │。

2026-06-03 17:33:06 289

原创 FreeRTOS学习笔记 18:调试方法论——HardFault排查、栈溢出检测、运行时统计,RTOS调试三板斧

程序死机/异常│▼查看HardFault寄存器│├── STKERR=1 → 栈溢出 → 检查任务栈大小 → 用HighWaterMark测量│├── PRECISERR → 总线错误 → 检查外设访问、地址对齐│└── 无明显错误 → 用CMBacktrace看调用栈│▼定位到出错函数│├── 数组越界?→ 检查数组下标├── 空指针?→ 检查指针初始化└── 竞态条件?→ 检查共享资源保护。

2026-06-03 17:32:12 295

原创 嵌入式面试高频题第5弹:DMA原理、看门狗机制、低功耗模式,这3个搞不懂简历直接被筛

DMA是直接内存访问,它允许外设和内存之间直接搬运数据,不需要CPU参与每一个字节的传输。│ 方式1:轮询(Polling) ││ CPU一直在等,干不了别的事 ││ while(!flag);← CPU在这空转 ││ 适合:数据量小、对实时性要求不高 ││ 方式2:中断(Interrupt) ││ 每传完一个字节/一组数据,中断通知CPU ││ CPU被打断 → 保存现场 → 处理 → 恢复现场 ││ 适合:数据量中等、需要CPU及时响应 ││ 方式3:DMA │。

2026-06-02 14:45:15 295

原创 STM32调试三板斧:printf重定向、HardFault定位、逻辑分析仪抓波形,从此告别瞎改代码

有同学问我:“学长,我LED点不亮,代码改了几十遍都找不出问题,怎么办?我的第一反应是——你用什么工具在调?他说:“就…看代码啊。——这就是问题所在。嵌入式调试靠"看"是看不出bug的,要用工具。这篇文章分享我调试STM32最常用的三板斧,从入门级到进阶级,覆盖了绝大多数调试场景。💬 你平时调试用什么工具?遇到过最诡异的bug是什么?评论区分享一下,看看谁的经历最离谱!STM32的HardFault相当于Windows的"蓝屏"——程序执行了非法操作,CPU进入硬件错误中断。

2026-06-01 22:18:26 409

原创 嵌入式自学路线图:从51单片机到FreeRTOS,大三学长的血泪经验(附书单+工具链)

大一刚进实验室,看到学长在屏幕上点了个灯,觉得好酷——这就是我入坑嵌入式的起点。两年多走过来,踩过无数坑,浪费过不少时间。这篇文章把我走过的弯路总结成一条从零到进阶的完整路线,希望对你有用。入门成本:几十块钱的开发板 + 一台电脑时间投入:每天2~3小时,4~6个月具备实习能力核心能力:C语言基础 → STM32外设 → FreeRTOS → 项目经验进阶方向:嵌入式Linux / IoT / GUI / 电机控制关键习惯:从第一天就上板验证、做好笔记、管好代码版本嵌入式这门手艺,越老越吃香。

2026-05-30 13:16:44 246

原创 FreeRTOS学习笔记 17:资源管理与临界区保护——优先级反转、死锁,90%的RTOS bug都跟它有关

保护力度: 临界区 > 挂起调度器 > 互斥量 > 任务通知副作用: 临界区 > 挂起调度器 > 互斥量 > 任务通知推荐度: 互斥量 ≈ 任务通知 > 挂起调度器 > 临界区方法适用场景典型代码长度中断安全?临界区极短的保护代码(<10μs),需防中断1~3行ISR版本独立挂起调度器批量更新全局变量,不需防中断10~50行❌互斥量日常开发首选,多任务互斥5~10行❌(ISR中不可Take)任务通知两个任务间的轻量级互斥3~5行❌。

2026-05-30 13:16:12 441

原创 STM32+LVGL从零搭建GUI界面,CubeMX配置+移植+第一个界面

CubeMX 配好 SPI 和 GPIO— LCD 硬件接口下载 LVGL 源码,修改 lv_conf.h— 配置分辨率、颜色深度、内存实现 disp_flush— 把 LVGL 的画点操作映射到你的 LCD 驱动主循环调用 lv_timer_handler()— 驱动 UI 刷新和事件处理移植完成后,就可以用 LVGL 的可视化工具拖拽设计界面,导出 C 代码直接用,开发效率极高。如果本文对你有帮助,欢迎,我会持续分享嵌入式干货。

2026-05-29 15:06:51 608

原创 嵌入式面试高频题第4弹:函数指针进阶、堆栈分析、Makefile入门,这3个答不上来就悬了

知识点一句话概括面试频率嵌入式重点函数指针进阶typedef 简化、跳转表、状态机模式⭐⭐⭐⭐命令解析器、设备状态机、HAL 回调堆栈分析栈自动管理向下长,堆手动管理向上长,高水位线排查溢出⭐⭐⭐⭐FreeRTOS 任务栈规划、MPU 保护Makefile/链接脚本Makefile 管编译规则,链接脚本管内存布局⭐⭐⭐⭐.text/.data/.bss、启动流程、变量定位。

2026-05-29 15:06:26 388

原创 FreeRTOS学习笔记 16:任务状态与调度器内部机制,面试官最爱问的RTOS核心

低优先级任务持有互斥量被中优先级任务抢占,导致高优先级任务被中优先级任务间接阻塞。FreeRTOS 的 Mutex 实现了优先级继承——临时把持有互斥量的任务优先级提升到等待者的级别。知识点一句话总结面试频率4种状态就绪→运行→阻塞/就绪→挂起,只有就绪态能被调度器选中⭐⭐⭐⭐⭐调度策略抢占式(默认)+ 时间片(同优先级轮转)⭐⭐⭐⭐优先级查找位图法 O(1),不是遍历链表⭐⭐⭐⭐⭐Tick中断每1ms一次,检查延时列表+更新TickCount+触发PendSV⭐⭐⭐⭐。

2026-05-28 20:19:54 215

原创 嵌入式面试高频题(第3弹):ISR编写规范、volatile底层原理、位操作技巧,这些坑你踩过几个?

ISR的核心原则就三条:快进快出、不可重入函数别调、共享数据加保护。为什么?法则3:中断与主循环共享的数据,访问时需要保护对于非原子操作(比如读写32位变量在8位MCU上),需要关中断保护:关于关中断保护的范围:关中断的时间要极短(几微秒),否则会影响系统实时性。如果需要长时间保护,应该用互斥量+挂起调度器的方式。FreeRTOS 在中断中调用 API 必须使用 版本:为什么需要 ?因为中断中不能直接调用调度器(调度器依赖上下文,不在中断上下文中运行)。通过这个参数,FromISR 函数告诉你"

2026-05-28 20:19:09 235

原创 嵌入式面试高频题(第2弹):结构体对齐、大小端、回调函数,90%的人会搞混

知识点一句话概括面试频率嵌入式重点结构体对齐成员地址按自身大小对齐,总大小是最大对齐值整数倍⭐⭐⭐⭐⭐跨平台通信、存储时必须pack大小端小端低字节在低地址,大端相反⭐⭐⭐⭐网络通信必须转网络字节序(大端)回调函数通过函数指针实现的事件响应机制⭐⭐⭐⭐中断回调、事件驱动、解耦硬件下期预告:中断服务函数(ISR)编写规范、volatile的底层原理、位操作技巧。👉关注我不迷路,持续更新嵌入式面试题系列。📥完整100题PDF见主页资源下载。

2026-05-27 14:19:37 449

原创 FreeRTOS学习笔记 15:Stream Buffer与Message Buffer,任务间传递数据的另一种姿势

FreeRTOS V10.0.0+ 中,只要用到Stream Buffer/Message Buffer的相关API,这个宏会自动启用。不需要手动定义。但如果你的FreeRTOS版本较老,或者启用了configUSE_STREAM_BUFFER宏才可见API,需要确认一下。要点说明变长字节流,无边界,适合串口/音频/传感器数据变长消息,保留边界,基于Stream Buffer实现触发级别Stream Buffer独有特性,达到指定数据量才唤醒接收任务与队列的关系。

2026-05-27 14:19:06 423

原创 STM32+FreeRTOS移植踩了3个坑,最后一个查了一天才找到

最近在做一个基于的项目,需要用到 FreeRTOS 来管理多个任务。想着用 CubeMX 一键生成配置应该很顺利,结果实际调试时踩了一连串的坑。这篇文章记录了最典型的 3 个问题,希望能帮你少走弯路。坑根因解决任务不运行PendSV 优先级配置错误检查 HAL_Init 调用顺序串口乱码/卡死SysTick 被 FreeRTOS 和 HAL 共用单独给 HAL 配一个 TIM 作时基低优先级任务饿死高优先级任务没有阻塞点加入 vTaskDelay 或等待信号量。

2026-05-26 21:52:38 258

原创 FreeRTOS学习笔记 14:低功耗管理(Tickless Mode),省电80%的秘诀

* 硬件定时器句柄(根据需要选择LPTIM/RTC/TIM) *//* LPTIM1初始化函数(CubeMX生成,可能需要手动补全) */要点说明核心机制Idle任务让CPU睡大觉,用外设定时器在准确时间唤醒配置开关推荐模式Stop模式 + LPTIM/RTC唤醒(功耗和响应时间的最佳平衡)关键函数最大坑一定要调用补偿Tick,否则所有延时都乱套验证手段万用表测电流,逻辑分析仪测时序。

2026-05-26 21:52:03 369

原创 嵌入式面试高频题第1弹:static/volatile/const 一网打尽

面试时,不要背教科书式的定义。用嵌入式场景 + 自己的踩坑经历关键字一句话总结 + 场景static“控制作用域和生命周期,我在项目中用 static 封装模块内部函数,避免全局命名污染”volatile“防止编译器优化,我在调试传感器时因为没加 volatile,release 模式踩过坑”const“告诉编译器这个值不能改,我在定义查表时用 const 把数据放 Flash,省 RAM”能说出实际场景的面试者,和只会背定义的面试者,差距是巨大的。

2026-05-25 19:35:16 265

原创 STM32+FreeRTOS移植完整教程(基于CubeMX),从配置到验证一步到位

时钟先配好— 72MHz 系统时钟是基础时基分离— SYS Timebase 选 TIM1,避免 SysTick 冲突任务里加阻塞— 每个任务都要有osDelay或等待机制到这步,你的 STM32+FreeRTOS 环境就跑起来了。如果本文对你有帮助,欢迎,我会持续分享嵌入式干货。完整工程源码可到我的主页资源下载。

2026-05-25 19:34:09 361

原创 解决VSCode开发ROS2代码时include报错

如图,即使能正常编译,ros2 run也能正常运行节点,但VScode里还是有红色波浪线。

2026-04-10 12:18:02 93

原创 FreeRtos学习笔记 13 CPU 利用率

统计利用率的方式是,在一段时间里程序运行的情况。比如100ms中,A任务总共占用50ms,B任务总共占用20ms,中断任务占用10ms,空闲20ms,那么这100ms中CPU利用率就是80%。

2026-02-02 23:27:26 418

原创 FreeRtos学习笔记 12 中断管理

在FreeRTOS中,系统调度本质上是产生PendSV中断,也是一种中断,所以FreeRTOS对临界段的保护本质上就是对中断的开关控制。FreeRTOS在进入临界区的时候需要关闭中断,处理完临界区后再打开中断。FreeRTOS本身就有很多临界区,且都加了临界区保护。的值的中断会被临界段屏蔽,反之不会屏蔽,不受FreeRTOS管理。比如有的外设启动初始化的时候需要严格的时序,不能被打断。FreeRTOS共有两个任务级、两个中断级的临界区保护函数。成对调用,其中间的代码就是临界段代码,临界段代码需要精简!

2026-02-02 23:27:04 386

原创 FreeRtos学习笔记 11 内存管理

允许内存堆跨越多个不连续的内存段,比如从单片机的RAM开始,到外接的SRAM,都可以作为内存堆,其他分配方法的内存堆都不能跨越不连续的内存段。申请到一部分内存后,剩下的内存块组成一个新的空闲内存块,按照空闲内存块起始地址插入到空闲块链表中,合并算法会将地址相邻的空闲内存块进行合并。根据释放的内存块起始地址,偏移后找到内存堆链表节点,然后将被释放的内存块插入到空闲内存块链表中,插入过程中会执行合并算法。相比heap_1.c,提供内存释放函数,但不会把释放的内存块合并成一个大块,所以会产生内存碎片。

2026-01-21 18:58:59 991

原创 FreeRtos学习笔记 10 任务通知

每个任务都有一个32位的通知值,在创建任务时会自动初始化任务通知值。在任务或中断中都可以向其他任务发送通知。只有在任务中可以等待通知,中断中不允许等待通知。与其他任务通信方式相似,若通知暂时无效,会根据指定的阻塞超时时间进入阻塞态,直到通知有效,或超过指定的阻塞时间。任务通知值为一个32位的变量,可以通过按位操作再发送,当作轻量事件组,或者当作计数信号量、消息队列等多种用法。

2026-01-21 18:58:30 738

原创 FreeRtos学习笔记 9 软件定时器

Freertos的软件定时器,当设定的时间到达时,会自动触发用户定义的回调函数。定时精度与系统时钟的周期相关,一般以SysTick函数作为基础时钟。软件定时器的回调函数类似中断服务函数,需要遵循快进快出原则,不能有任何阻塞任务运行的情况出现。有单次模式和周期模式,单次模式触发一次回调函数就休眠定时器,周期模式会循环计时并触发回调函数,直到用户关闭定时器。

2025-12-13 17:30:40 342

原创 FreeRtos学习笔记 8 事件

事件用于任务间通信,不能传输数据,可以一对多或者多对多。任务与多个事件有两种方式建立联系:逻辑或、逻辑与。逻辑或,就是当任务感兴趣的多个任务中,有一个任务发生,即可触发;逻辑与,即任务感兴趣的多个任务中全都发生时触发。事件之间是独立的,且各自与任务相关联。允许多个任务对同一事件进行读写操作事件变量位数取决于系统节拍计数器宏,定义为1时,系统节拍计数器使用16位,定义为0时,32位,事件变量位数与之相同。16位时,其中8个用于存储事件组,32位时,其中24个用于存储事件组。

2025-12-13 17:30:30 478

原创 FreeRtos学习笔记 7 互斥量

互斥信号量就是一个拥有优先级继承的二值信号量。二值信号量常用于任务或中断之间的同步,互斥信号量常用于那些需要互斥访问的应用中。要使用互斥量,需要在FreeRTOSConfig.h中把宏定义为1.要使用递归互斥量,需要在FreeRTOSConfig.h中把宏定义为1.

2025-12-12 16:56:54 424

原创 FreeRtos学习笔记 6 信号量

当有多个任务,同时访问或操作一个区域的资源时,会产生竞争问题,导致读取数据错误。信号量就是用来保护临界资源,协调任务、中断之间的同步性。对于临界资源(同一时刻只能有一个任务或中断访问操作的资源,比如全局变量、定时器计数寄存器值),如果多个任务或中断同时调用,会产生问题。信号量通过短暂地禁止中断、挂起调度器等方法,以确保各任务或中断读取临界资源的顺序正确性。

2025-12-12 16:56:39 674

原创 FreeRtos学习笔记 5 消息队列

消息队列是一个数据结构:队列。用于任务和任务间、中断和任务间的消息传输。消息队列有先进先出(FIFO)、后进后出(LIFO)两种排队方式。一个任务可以读取多个消息队列的消息。多个任务可以读取同一个消息队列。数据发送到队列中,是数据拷贝,即值传递。可以将数据的地址作为消息进行收发。发送和读取均有阻塞时间。发送的阻塞时间即:当队列没空时,等待队列有空的最大时间,设为最大值时,就一直等待,直到队列有空。读取的阻塞时间:当队列为空时,等待队列有消息的最大时间,与发送的阻塞时间类似。

2025-12-06 23:25:20 463

原创 在VScode中用CMake构建C/C++多文件项目

安装VScode(略)安装GCC和mingw(上网找教程,很简单)安装插件:C/C++CMake。

2025-12-06 23:25:00 1154

原创 freertos学习笔记 4 任务管理

任务有四种状态:就绪态(ready):任务就绪,随时可运行。新创建的任务会处于就绪态。运行态(running):任务正在运行。阻塞态(blocked):任务在等待时序、等待外部中断等的时候,处于阻塞态。挂起态(suspended):任务只有通过调用函数函数才能进入挂起态,此时对于调度器而言是不可见的。

2025-11-23 12:20:09 297

原创 FreeRtos学习笔记 3 FreeRTOS的启动流程

Cortex-M3架构中,FreeRTOS为任务启动和切换提供了三个异常(异常是一种中断):SVC、PendSV、SysTick。SVC:用于任务启动。有些操作系统中,应用程序无法直接访问硬件,而是提供以下系统服务函数。SVC会发出堆系统服务函数的呼叫请求,以访问硬件。PendSV:用于任务切换,且是可挂起的。,函数最后会调用__main函数,在其中初始化系统的堆和栈,最后调用C中的main函数。系统上电时,首先执行的是启动文件中的复位函数(汇编编写)启动任务调度器时,如果启动失败,会进入死循环。

2025-11-23 12:17:17 287

原创 FreeRtos学习笔记 2 任务创建的两种方法

与静态方法类似,也是在main函数中先创建开始任务,再在开始任务函数中创建其他任务并删除开始任务。首先创建任务,就是定义任务优先级、堆栈大小、堆栈、任务控制块、任务句柄、任务函数。在开始任务的任务函数中再创建其他任务(用于执行功能的任务),创建完毕后删除开始任务。也是通过FreeRTOS提供的函数实现。相比静态内存,动态内存定义任务信息时,不用手动定义。静态方法时,需要用户提供空闲任务的。的任务堆栈和任务控制块。其他与静态方法一致。任务堆栈和任务控制块。中的支持内存申请的宏。动态方法无需用户提供。

2025-11-17 00:16:47 442

原创 FreeRtos学习笔记 1 任务的实现过程

栈是单片机RAM内一段连续的内存空间。有多少个任务就需要定义多少个任务栈。任务栈就是一个预先定义好的全局数组,数据类型为StackType_t,大小由宏TASK1_STACK_SIZE来定义(默认128)。任务是一个独立的函数,函数主体无限循环,且不能返回。while(1)// 要运行的代码任务控制块就是一个结构体,在task.c中声明。其包含了任务的所有信息,比如栈指针、名称、形参等等。/* 栈顶 *//* 任务节点 *//* 任务栈起始地址 *//* 任务名称, 字符串形式 */

2025-11-17 00:14:14 421

原创 用VScode开发单片机

用EIDE插件打开并编译KEIL工程后,生成的HEX文件跟KEIL生成的路径不同,在VScode的终端可以看到具体路径。

2025-07-17 01:32:43 1064

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除