自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 # 嵌入式 Linux 入门详解:系统架构、启动流程、设备树、驱动与面试重点

启动流程↓系统分层架构↓设备树↓Linux 驱动↓用户空间接口↓进程、线程和 IPC↓系统调试与问题定位系统如何启动内核如何管理硬件设备树如何匹配驱动应用程序如何访问设备多进程如何通信系统异常如何排查掌握这条完整链路后,面对嵌入式 Linux 开发和面试中的常见问题,就能从原理、代码和实际场景三个角度进行回答。

2026-11-07 13:52:45 219

原创 # MOS 管知识总结:从 N-MOS、P-MOS 到栅极驱动、选型、损耗与故障排查

对比项N-MOSP-MOS常见增强型开启方向正向 VGS负向 VGS常见应用低侧开关、半桥、开关电源高侧电源开关高侧驱动通常需要浮动或升压驱动栅极相对源极拉低即可开启电阻与成本相近技术和条件下,通常更有优势需结合具体器件比较“N-MOS 常做低侧、P-MOS 常做高侧”是常见应用方式,不是绝对限制。明确应用与电流路径↓确认 N/P 沟道及高低侧位置↓计算实际 VGS↓检查驱动能力与体二极管路径↓评估耐压、损耗、SOA 和散热↓实测波形与温升。

2026-10-28 16:10:28 298

原创 RS-232 与 RS-485 通信详解:从 UART、电平转换到接线、Modbus RTU 和工程调试

对比项RS-232RS-485信号方式单端平衡差分常见连接点对点多点总线常见工作方式独立收发线,全双工两线半双工,也可四线全双工参考方式信号线相对地两根信号线之差,同时受共模范围约束MCU 是否通常需要收发器需要需要终端匹配通常不按 RS-485 方式配置常见总线两端匹配是否规定消息地址和 CRC不规定不规定常见应用设备配置、短距离仪器连接工业多节点、PLC、仪表常见难点电平、DTE/DCE、引脚定义拓扑、终端、偏置、方向切换。

2026-10-16 13:12:55 152

原创 CAN 通信协议详解:从硬件接线、帧格式到仲裁机制、Bus-Off 与工程调试

物理层:供电、收发器、接线、终端、波形协议层:帧格式、仲裁、ACK、错误处理、位时序应用层:字段定义、缓存、超时、响应、重复处理CAN 控制器处理协议,CAN 收发器处理电气信号。高速 CAN 主干两端通常各放一个 120Ω 终端电阻。显性 0 覆盖隐性 1,是逐位仲裁的基础。输掉仲裁不会破坏获胜报文,也不属于通信错误。ACK 不等于目标设备已经执行命令。Bus-Off 应查明根因,不能只靠反复复位。CAN 数据含义、字节序和业务可靠性需要应用层约定。

2026-10-14 19:43:09 265

原创 FreeRTOS 面试知识总结:任务、队列、信号量、互斥量、任务通知和软件定时器怎么选?

H:高优先级任务M:中优先级任务L:低优先级任务L 获取共享资源的锁。H 需要同一资源,因锁被占用而阻塞。M 进入就绪态,并抢占 L。L 无法及时释放锁,H 也只能继续等待。此时,高优先级任务 H 的进度间接受到了中优先级任务 M 的影响,这就是优先级反转的一种典型情况。任务组织业务流程,调度器在就绪任务之间分配 CPU。队列传递实际数据,并提供有限容量的缓存。二值信号量常用于事件同步,不能累积多个未处理事件。计数信号量管理事件计数或资源名额,但不识别具体资源。互斥量。

2026-10-13 08:49:26 142

原创 Bootloader、App 和升级分区之间是什么关系?

Bootloader、App 和升级分区并不是三个互相独立的程序区域,而是一套完整的启动和升级体系。Bootloader:设备上电后首先运行,负责初始化、校验、升级和跳转。App:实现设备的核心业务功能,是用户真正使用的程序。升级分区:存放待升级的新固件,避免直接破坏当前运行版本。A/B 分区:通过保留新旧两份固件,实现安全升级和失败回滚。最终可以记住这句话:Bootloader 是门卫,App 是业务主体,升级分区是新版本的候场区,也是设备升级失败时的安全保障。

2026-09-20 19:00:54 240

原创 从设备地址到寄存器地址:I²C驱动完整流程详解

I²C(Inter-Integrated Circuit)是一种由 Philips(现 NXP)提出的串行通信协议。两根线完成通信支持多个设备挂载每个设备拥有唯一地址信号作用SCL时钟线SDA数据线MCUMasterSCL SDA| || |I²C Bus| || |0x48 0x50其中:负责产生时钟主动发起通信Master(主机)被动响应根据地址接收数据Slave(从机)

2026-09-14 18:37:06 450

原创 FreeRTOS死锁是怎么产生的?一文彻底理解任务死锁机制

死锁就是多个任务互相等待对方释放资源,导致所有任务都无法继续运行。任务A拿着资源1,等待资源2任务B拿着资源2,等待资源1任务A → 等待任务B释放资源2任务B → 等待任务A释放资源1形成一个闭环。任务A无法继续任务B无法继续系统卡死FreeRTOS官方也指出,死锁通常发生在多个任务使用 Mutex 等互斥资源时,如果任务之间获取资源的顺序不一致,就可能形成互相等待。原因说明资源互斥一个资源只能一个任务使用请求并保持拿着资源继续等待其他资源不可剥夺资源只能主动释放环路等待。

2026-09-09 18:54:30 510

原创 FreeRTOS任务通知为什么比队列更轻量?深入理解Task Notification机制

任务通知:是 FreeRTOS 提供的一种:任务之间快速通信和同步机制。每一个任务天生自带一个通知值。也就是说:创建任务时:FreeRTOS已经在任务控制块 TCB 中为它准备了一块通知区域。任务A| 任务代码 || Stack || TCB || || Value |这个 Notification Value:32位变量任务之间可以直接修改它。

2026-09-07 08:25:48 222

原创 FreeRTOS事件组和任务通知详解:为什么任务通知比队列更轻量?

中文:事件组多事件同步机制。bit位表示不同事件。例如:每一个bit代表一个事件。BIT0 = 网络连接完成BIT1 = 传感器初始化完成BIT2 = Flash初始化完成BIT0=1BIT1=1BIT2=1表示:三个条件全部完成。任务通知:是 FreeRTOS 中一种特殊通信机制。特点:每个任务内部自带一个通知值。也就是说:Task↓Queue对象↓Task需要额外创建:Queue。Task A↓Task B内部通知值直接通知目标任务。功能事件组任务通知。

2026-09-05 08:15:00 181

原创 FreeRTOS二值信号量和计数信号量详解:从任务同步到资源管理

任务同步任务通信资源管理的内核对象。从本质上看:信号量就是一个由系统管理的计数变量。计数信号量:它和二值信号量最大的区别:数量可以变化。0 ~ N01234...N它表示:当前还有多少资源。

2026-09-04 15:22:01 733

原创 FreeRTOS动态创建任务和静态创建任务详解:xTaskCreate与xTaskCreateStatic区别

静态创建任务:就是:任务需要的 TCB 和 Stack,由用户提前定义好,然后交给 FreeRTOS 使用。流程:FreeRTOS↓Heap申请↓TCBStack用户↓提前定义TCBStack↓↓FreeRTOS使用FreeRTOS 创建任务,本质上就是:TCBStackFreeRTOS帮你申请内存优点:简单灵活缺点:依赖Heap用户提前准备内存优点:稳定可预测缺点:需要提前规划动态创建任务解决“开发方便”,静态创建任务解决“系统可靠”。

2026-09-02 18:25:58 560

原创 FreeRTOS任务是什么?一文搞懂Task、运行、就绪、阻塞和挂起状态

理解 FreeRTOS,首先要理解:Task 是 FreeRTOS 管理程序运行的基本单位。任务代码独立栈空间优先级状态Ready↓Running↓Blocked↓Ready或者:Running↓Suspended调度器根据任务状态和优先级:决定:当前CPU应该执行谁。裸机程序关注“代码执行顺序”,而 FreeRTOS 关注“任务状态变化和CPU资源分配”。队列 Queue信号量 Semaphore互斥锁 Mutex事件组 EventGroup软件定时器。

2026-09-01 19:38:16 502

原创 为什么裸机程序需要引入 FreeRTOS?从超级循环到实时多任务系统

不能实现复杂功能实际上很多复杂嵌入式系统完全可以裸机实现。真正的问题是:随着功能增加,任务调度、实时响应、资源共享和模块维护会越来越困难。任务调度优先级管理阻塞与唤醒队列信号量互斥量事件组软件定时器一个个职责清晰的任务裸机解决的是“程序怎么跑”,而 FreeRTOS 更擅长解决“很多功能怎么一起有序地跑”。while(1) 越来越长flag 越来越多delay 越来越多中断越来越复杂模块之间互相影响实时性越来越难保证。

2026-08-31 18:57:46 463

原创 HAL库、标准库、LL库和寄存器开发有什么区别?一文彻底讲清 STM32 四种开发方式

寄存器开发是最底层的一种 MCU 开发方式。也就是:不依赖高级外设库,直接操作芯片内部寄存器。这是配置 PA5 为输出。设置 PA5 高电平。设置 PA5 低电平。GPIO寄存器标准库通常指:SPL标准外设库标准库它主要出现在较早的 STM32 开发体系中。例如 STM32F1 标准库代码非常常见。HAL:中文:硬件抽象层。它是目前 STM32Cube 生态里最常见的开发库之一。核心思想就是:把底层硬件差异尽量封装起来,提供统一的 API。到底修改ODR还是BSRR。

2026-08-29 16:41:17 357

原创 STM32 DMA到底解决了什么问题?从原理、配置到实战彻底讲懂

Buffer ABuffer B正在写A处理BDMA切到BCPU开始处理A两者交替工作。实时性吞吐量稳定性直接存储器访问。让ADC更快让UART更快让SPI更快而是:减少CPU参与数据搬运的次数。外设↓CPU读取↓CPU搬运↓RAM外设↓DMA↓RAM配置启动等待通知处理结果解决高频、大批量、重复性数据搬运占用CPU的问题。ADC连续采样UART高速收发SPI大数据传输DAC连续输出音频采集内存搬运轮询:CPU一直等中断:数据来了CPU就处理。

2026-08-28 16:14:06 554

原创 ADC采集结果为什么不稳定?硬件和软件原因全面分析

ADC采集结果不稳定,通常不能简单归结为“ADC精度差”。模拟信号↓输入阻抗↓RC滤波↓ADC采样保持↓参考电压↓模拟供电↓PCB布局↓采样时序↓DMA/中断↓数字滤波输入信号是否稳定源阻抗是否过高VREF是否稳定VDDA是否干净模拟地是否合理PCB布局是否合理RC滤波是否合理通道切换是否串扰ADC采样时间ADC校准采样触发时机通道切换延时DMA处理多次平均滑动平均中值滤波过采样先解决硬件信号质量,再调整ADC参数,最后才使用软件滤波。

2026-08-27 17:15:56 548

原创 《定时器、计数器和PWM之间是什么关系?一文彻底讲清楚》

计数器其实是最好理解的。CNT计数器寄存器01234567……那么这就是一个最基本的计数器。计数频率 = 1MHz1秒产生1000000次计数每计数1次 = 1μs计数频率计数次数经过了多长时间这就是“定时”的基础。第一:计数器是定时器工作的核心。定时器内部本质上有一个CNT寄存器,它不断对时钟脉冲进行计数。第二:定时和计数的主要区别是时钟来源。TimerCounter第三:PSC决定计数速度。第四:ARR决定周期。CNT:Fpwm =第五:CCR决定PWM占空比。

2026-08-26 19:31:22 530

原创 推挽输出和开漏输出有什么区别?为什么 I²C 必须使用开漏输出?

对比推挽输出开漏输出内部结构PMOS+NMOSNMOS输出高主动输出依靠上拉输出低主动输出主动拉低速度快较慢驱动能力强弱是否允许多个设备连接否可以是否支持线与否支持典型应用GPIO、SPII²C、SMBus推挽输出:既能主动拉高,也能主动拉低,速度快、驱动力强,但是多个设备连接容易冲突。开漏输出:只能主动拉低,高电平依靠上拉电阻,实现多个设备安全共享同一条总线。多设备共享总线线与逻辑避免输出冲突支持不同电压通信GPIO控制 → 推挽。

2026-08-25 16:09:58 736

原创 STM32 GPIO输入输出模式到底有什么区别?一篇文章彻底搞懂浮空、上拉、下拉、推挽、开漏

STM32 GPIO虽然看起来简单,但是里面包含大量硬件设计。输入:看外部电平输出:看驱动能力推挽:主动输出高低电平开漏:只能主动拉低,需要上拉通信:优先考虑复用功能UART通信I2C通信SPI通信PWM控制ADC采集的基础。对于嵌入式开发来说,GPIO不仅是“控制一个IO口”,更是理解MCU内部硬件结构的重要入口。

2026-08-22 15:17:03 376

原创 设备上电后不断复位:看门狗、栈溢出和电源问题排查

启动阶段。外设初始化阶段。电源扫描阶段。通信处理阶段。任务运行阶段。设备上电后不断复位,并不一定是单一的软件 Bug。看门狗。任务栈。中断栈。电源供电。复位引脚。HardFault。系统时钟。Bootloader 跳转。外设阻塞。软件主动复位。最有效的排查思路是:先确认复位来源,再结合电源波形、任务状态、异常现场和启动流程逐层定位。读取复位标志↓检查电源与 NRST↓检查看门狗和阻塞代码↓检查任务栈与中断栈↓分析 HardFault 异常现场↓。

2026-08-21 08:48:03 633

原创 # STM32使用DMA后数据异常?可能不是DMA配置问题:从缓存、变量类型、时序到外设状态全面排查

STM32使用DMA以后出现数据异常,最容易犯的错误就是:一看到DMA数据不对,就开始反复修改DMA配置。外部信号↓外设↓外设寄存器↓↓DMA↓总线↓RAM↓Cache↓CPU↓应用程序所以DMA数据异常可能来自任何一层。① D-Cache一致性② DMA无法访问某些RAM③ 数据宽度与变量类型不匹配④ Memory Increment配置错误⑤ Normal/Circular模式理解错误⑥ DMA完成≠外设真正完成⑦ UART/SPI外设残留状态。

2026-08-19 20:06:22 640

原创 《FreeRTOS任务创建成功却不运行?这7个原因从调度器、优先级到栈溢出一次讲透》

任务一定正在运行实际上完全不是。↓任务资源创建成功↓进入Ready或相应任务状态↓Scheduler正常启动↓调度器根据优先级选择任务↓上下文切换↓任务获得CPU↓Task Function真正执行任务创建成功,只是任务“存在了”;任务真正运行,还取决于调度器、优先级、任务状态、栈空间以及系统Tick和中断机制。1. 有没有启动Scheduler2. Scheduler有没有启动失败3. 有没有被高优先级任务饿死4. 是不是处于Blocked/Suspended。

2026-08-15 18:15:56 914

原创 RS485通信超时全面排查:终端电阻、A/B线、DE方向控制、串口参数和Modbus一次讲透

某个通信环节失败以后,上层等待不到预期回复产生的最终结果。主机程序↓UART↓DE↓RS485收发器↓A/B↓终端和线缆↓从机收发器↓从机UART↓协议处理↓从机回复↓主机接收最终都可能Timeout① 看UART TX有没有发送② 看DE有没有正确切换③ 看A/B有没有差分波形④ 查A/B极性⑤ 断电测终端电阻⑥ 查波特率、数据位、校验位和停止位⑦ 查总线拓扑和线缆⑧ 确认从机是否收到请求⑨ 查设备地址、功能码和CRC⑩ 确认从机是否回复。

2026-08-14 19:31:26 653

原创 CAN总线没有ACK是什么原因?从硬件到软件逐层排查

CAN FD / Classic CAN格式BRSTDC发送邮箱中断过滤器自动重传CAN 没有 ACK 最容易产生的误解就是:“没有 ACK = 我的 CAN 没有发出去。发送节点没有在 ACK Slot 得到其他节点的正常确认。有没有成功。MCU CAN控制器↓TXD↓CAN收发器↓↓终端和线缆↓对端CAN收发器↓对端CAN控制器↓正确位时序↓正常工作模式↓ACK第一类:没有第二个能够ACK的正常节点第二类:收发器、终端电阻、线缆和物理层异常。

2026-08-13 22:40:04 538

原创 I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透

应答8 bit第9个时钟这个第 9 位就是 ACK/NACK 位。没有应答SDA保持高电平就是 NACK。第9位:低是ACK,高是NACK。重复起始条件SCL 高电平期间,SDA 从高变低。普通START:总线原本处于空闲状态前一个事务还没完全释放总线主机直接重新发起STARTSTARTACKRegisterACKACKDataNACKSTOP非常常见。因为 ACK 的含义可以理解为:我收到这个字节了,请继续发送。

2026-08-10 18:35:09 846 2

原创 STM32启动过程详解:从上电复位到main,程序到底是如何从Flash运行起来的?

text通常保存程序机器指令。最终会被编译成 ARM Thumb 机器指令。FlashCPU 运行时直接从 Flash 取指执行。.rodata也就是只读数据。字符串和 const 常量通常不会在程序运行期间修改,因此通常可以直接保存在 Flash。speed有初始值的全局变量是允许的。所以speed运行时必须位于可以修改的 RAM 中。但是 RAM 掉电后内容会丢失。100从哪里来?答案是:初始值保存在 Flash,启动时复制到 RAM。Flash.data初始镜像。

2026-08-09 08:14:31 667

原创 HAL库、标准库、LL库和寄存器开发有什么区别?STM32四种开发方式一次讲透

SPLSTM32标准外设库很多较早的STM32项目,特别是STM32F1项目,大量使用标准库。这就是非常典型的STM32标准库风格。Low-Layer底层库LL属于STM32Cube软件生态的一部分。HAL↓封装较高LL↓更接近寄存器寄存器↓直接控制硬件while (USART1) == 0LL明显更加接近外设硬件逻辑。寄存器开发是最直接的一种方式。不使用高级封装函数,而是直接修改硬件寄存器。MODER是什么?GPIO5对应哪两位?01表示什么模式?

2026-08-08 14:26:21 415

原创 STM32时钟树怎么看?一步理解SYSCLK、HCLK、PCLK和外设时钟配置

所谓时钟树,就是描述:MCU内部各种时钟从哪里来、经过什么倍频和分频、最终送给哪些模块。HSI│HSE│▼PLL│▼SYSCLK││▼HCLK┌───┴───┐│ │APB1 APB2│ ││ │各类外设 各类外设所以看到CubeMX复杂的时钟树时,不需要一次把所有线都看懂。时钟源 → PLL → SYSCLK → HCLK → PCLK → 外设SYSCLK↓↓HCLKHCLK = SYSCLK / AHB分频系数CPU内核;AHB总线;存储器接口。

2026-08-07 08:24:51 809

原创 STM32 DMA到底解决了什么问题?从CPU搬运数据到自动传输完整解析

可以触发半传输中断。可以触发全传输中断。DMA填充前半区↓半传输中断↓CPU处理前半区DMA继续填充后半区↓全传输中断↓CPU处理后半区这是一种典型的“乒乓处理”思想。DMA持续采集;CPU分块处理;减少数据停顿;降低缓冲区被覆盖的风险。Buffer ABuffer BDMA写Buffer ACPU处理Buffer BDMA写满Buffer A后切换到Buffer BCPU开始处理Buffer A一个缓冲区正在生产数据另一个缓冲区正在消费数据音频采集;

2026-08-06 18:09:39 501

原创 ADC采集结果为什么不稳定?硬件与软件原因及STM32排查方法详解

平均滤波;滑动平均;中值滤波;限幅滤波;IIR低通;过采样;卡尔曼滤波。ADC采集结果不稳定,不一定是ADC外设本身损坏。参考电压不稳定;ADC输入悬空;信号源阻抗过大;采样时间不足;缺少模拟滤波;电源和地线干扰;PCB布局不合理;输入电压超范围;多通道之间相互串扰。ADC时钟配置错误;采样周期太短;没有执行ADC校准;读取时序不正确;通道Rank和DMA顺序错误;缓冲区数据类型错误;整数计算溢出;参考电压写死;采样频率不合理;

2026-08-04 19:40:58 632

原创 定时器、计数器和 PWM 到底是什么关系?从工作原理到 STM32 实战详解

计数就是对一个个脉冲进行累加或递减。第1个脉冲到来:CNT = 1第2个脉冲到来:CNT = 2第3个脉冲到来:CNT = 3……第100个脉冲到来:CNT = 100这里的CNT可以理解为计数器当前保存的数值。如果脉冲来自单片机内部稳定的时钟,那么计数值就可以反映经过的时间。如果脉冲来自单片机外部引脚,那么计数值就可以反映外部事件发生的次数。因此,定时和计数的区别主要不在计数器本身,而在于:用来驱动计数器的脉冲来自哪里。Counter计数器的作用是统计脉冲数量。输入脉冲↓计数逻辑。

2026-08-02 15:36:29 488

原创 HTTP 和 HTTPS 详解:工作原理、通信流程、使用方法及核心区别

当一个 HTTPS 页面加载 HTTP 资源时,就会产生混合内容。但页面中引用:</此时页面本身通过 HTTPS 加载,但 JavaScript 文件通过 HTTP 加载。攻击者可能篡改这个 JavaScript 文件,从而破坏整个页面的安全性。阻止资源加载;显示安全警告;将页面标记为不完全安全。解决方法是确保所有资源统一使用 HTTPS:</HTTP 是客户端和服务器之间进行数据交换的应用层协议,采用请求和响应模型。请求行请求头空行请求体状态行响应头空行响应体GET。

2026-07-30 21:07:25 1002

原创 # TCP和UDP到底有什么区别?一篇文章彻底搞懂两种网络通信协议

对比TCPUDP中文名称传输控制协议用户数据报协议连接方式面向连接无连接可靠性可靠不保证可靠数据形式字节流数据报速度较慢较快是否重传支持不支持是否排序支持不支持是否确认支持不支持资源消耗较高较低应用场景网页、文件、聊天直播、游戏、实时控制TCP:宁愿慢一点,也保证正确UDP:宁愿丢一点,也保证速度TCP和UDP最大的区别:不是速度。而是:是否愿意牺牲速度换取可靠性。

2026-07-29 21:20:07 779

原创 # PID算法详解:从控制原理到STM32工程实现,彻底搞懂P、I、D三部分作用

假设:100℃100%50℃误差很大。增加输出但是:100%无法继续增加。越来越大当温度接近目标:积分还保持很大输出。温度超过目标产生严重超调。积分限幅抗饱和算法条件积分计算误差↓P快速纠正当前错误I消除长期偏差D预测变化趋势↓调整输出↓让系统稳定达到目标一句话总结:P负责速度,I负责精度,D负责稳定。在STM32、PLC、变频器、电机控制、温控系统以及工业自动化设备中,PID仍然是最经典、应用最广泛的控制算法之一。

2026-07-28 22:09:18 762

原创 RS485和Modbus RTU详解:工业设备为什么都喜欢使用它?

全双工表示双方可以同时发送和接收。设备A发送数据 → 设备B设备B发送数据 → 设备A双方可以同时进行。半双工表示双方都能发送和接收,但同一时刻只能有一方发送。主机发送时,从机不能发送从机响应时,主机不能发送如果从机正确收到请求,但无法执行,通常不会直接不响应,而是返回异常响应。原功能码 + 0x800383检查UART TC标志。RS485和Modbus RTU是工业通信中非常经典的组合。UART:负责字节的串行发送和接收RS485:负责差分电气传输。

2026-07-26 09:52:38 621

原创 # 单片机进入 HardFault 后,如何找到真正出错的代码?——STM32/Cortex-M 故障定位实战

HardFault 并不是无法解决的“玄学故障”。PCLRSPCFSRHFSRMMFARBFARELF 文件MAP 文件addr2line反汇编调用链运行日志通常就能逐步接近真正的故障原因。工程中最重要的不是让设备在 HardFault 后立刻重启,而是:在重启之前,尽可能保存完整的崩溃现场。因为只有留下现场,才能真正解决那些偶发、随机、难以复现的嵌入式故障。

2026-07-25 09:30:30 494

原创 嵌入式内存详解:栈、堆、全局区和静态区分别存什么?

栈是一块按“后进先出”方式使用的内存区域。函数参数;局部变量;返回地址;CPU寄存器;中断现场;临时计算结果;函数调用链信息。FunctionA入栈↓FunctionB入栈↓FunctionC入栈↓FunctionC返回并释放↓FunctionB返回并释放↓FunctionA返回并释放栈空间会随着函数调用逐渐消耗,函数返回后逐渐恢复。堆是用于动态内存分配的区域。/* 分配失败 */return;/* 使用buffer */

2026-07-24 08:17:32 511

原创 嵌入式日志与错误码设计:为什么只会 `printf` 很难定位问题?

这里等级数值越大,日志越详细。而应该是一套结构化的问题定位系统。时间戳模块名日志级别文件名和行号事件描述关键参数错误码日志等级控制编译期和运行期开关环形日志缓存异步输出故障日志持久化重复日志抑制实时性保护统一错误码复位后的故障恢复最终需要达到的目标不是“程序能够输出文字”,而是:出现偶发故障后,工程师能够根据日志快速还原时间线、定位模块、找到代码位置,并确认根本原因。日志告诉你发生了什么,错误码告诉你属于哪一类问题。

2026-07-23 08:55:20 586

原创 单片机参数如何掉电保存:Flash、EEPROM和配置存储完整设计

页和扇区都是 Flash 的组织和擦除单位。写入新参数时,不能一开始就把记录标记为有效。擦除备用区↓写入头部、参数和CRC↓回读检查↓最后写入commit字段0xFFFFFFFF完成后把commit如果在写入过程中掉电,commit仍然是未提交状态,启动时直接忽略这一份。1. 参数集中放入结构体。2. 使用固定宽度数据类型。3. 保存magic、version和length。4. 使用CRC检查数据完整性。5. 保存sequence序号判断新旧。6. 使用A/B双备份防止写入中断。

2026-07-22 09:07:32 654

空空如也

空空如也

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

TA关注的人

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