嵌入式 1000 问|Flomo 原始总表迁移¶
本页保留原始导航与问题地图。建议后续按专题拆页,并从这里维护入口。
原始来源: https://v.flomoapp.com/mine/?memo_id=MjQ1NzMzNDk3
创建时间: 2026-07-08T06:54:11+08:00
最近更新: 2026-10-06T21:03:25+08:00
原文长度: 16829 字
专栏⑮·导航:嵌入式 1000 问全景——从裸机到驱动的完整地图
📎 专栏⑭C语言导航 → https://v.flomoapp.com/mine/?memo_id=MjQ1NzM0NTk5
📎 专栏⑬硬件导航 → https://v.flomoapp.com/mine/?memo_id=MjQ3NTQ2MDE3
▎目录(10篇)
-
上电到 main()——启动文件、向量表、栈指针,Bootloader 跳 APP 的三个坑
-
时钟配置——HSE→PLL→SYSCLK,顺序乱了 MCU 就 hang
-
PWM 与定时器——ARR/PSC/CCR 的关系,一个公式算清频率和占空比
-
链接脚本——内存地图、段分配、LMA/VMA,5 个最常见的 .ld 错误
-
单片机学习路径——4 阶段:裸机筑基→寄存器级外设→综合项目→RTOS
-
基础概念与架构——嵌入式 vs 通用计算机、MCU vs MPU、冯诺依曼 vs 哈佛
-
中断与 ISR——中断延迟、嵌套、临界区,ISR 为什么越短越好
-
嵌入式 Linux 驱动入门——字符设备、设备树、file_operations、下半部
-
嵌入式调试三板斧——HardFault 定位、printf 的坑、示波器 vs 逻辑分析仪
-
嵌入式 15 项自检清单——上车前逐项打勾
▎补充篇(4篇)
-
补充一:RTOS 内核——从裸机 super-loop 到任务调度 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MDcx
-
补充二:DMA——数据搬运不占 CPU 的隐形引擎 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MDkw
-
补充三:低功耗设计——睡眠、唤醒、功耗测量 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MTEy
-
补充四:看门狗与可靠性——喂狗策略决定系统能不能自己活过来 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MTM5
▎设计原则
-
每条问题从"软件工程师真实踩坑"出发,不写教科书复述
-
90+ 方向的问题库作为全景索引,每篇深挖一个方向的实战
-
与 AUTOSAR(专栏①-⑩)、C语言(⑭)、硬件(⑬)互链,嵌入式是承上启下的主线
▎1000 问全景(问题库)
基础概念
-
嵌入式系统和通用计算机系统最本质的区别是什么?这个区别决定了哪些设计上的不同?
-
MCU和MPU的核心区别是什么?什么时候该选MCU,什么时候该选MPU?
-
冯诺依曼结构和哈佛结构在嵌入式系统里怎么体现?STM32是哪一种?
-
为什么嵌入式软件经常要跟"寄存器"打交道?读写寄存器和读写普通内存有什么不同?
处理器与架构
-
Cortex-M3的"三级流水线"是哪三级?它和Cortex-A系列的处理器的流水线有什么不同?
-
什么是"向量表"?中断来了以后CPU怎么从向量表找到对应的处理函数?
-
ARM的Thumb指令集和Thumb-2是什么?为什么嵌入式里经常用Thumb而不是ARM指令集?
-
RISC-V和ARM在架构设计哲学上有什么关键区别?为什么RISC-V近年发展这么快?
-
大端和小端(Big-endian / Little-endian)在嵌入式开发中什么时候会出问题?
存储器与链接
-
嵌入式系统的存储层级(SRAM、Flash、SDRAM、EEPROM)各有什么特点?代码放哪、数据放哪?
-
链接脚本(Linker Script)在做什么?为什么嵌入式开发要自己写.ld文件?
-
堆和栈在嵌入式系统里分别在哪?栈溢出了一般会发生什么?怎么预防?
-
MMU和MPU有什么区别?什么场景下嵌入式系统需要MMU?
GPIO与外设
-
GPIO的推挽输出和开漏输出有什么区别?什么场景下必须用开漏?
-
为什么UART要设波特率?收发双方的波特率差多少会出错?
-
I2C为什么需要上拉电阻?它的"开漏"设计跟UART的推挽设计各自解决了什么问题?
-
SPI和I2C在什么场景下选哪个?为什么说SPI比I2C快?
-
ADC的采样率、分辨率和精度之间是什么关系?一个12位的ADC是不是一定比10位的"准"?
中断与异常
-
中断和异常的区别是什么?按中断向量表和异常向量表来区分的话,它们各自的入口在哪?
-
中断服务函数(ISR)为什么越短越好?如果必须做耗时操作,有哪些处理方式?
-
中断嵌套会发生什么?什么时候应该允许中断嵌套,什么时候应该禁止?
-
中断优先级和子优先级(如STM32的NVIC分组)——为什么要分成两组?怎么配置?
-
临界区(critical section)是什么?为什么在ISR里和任务里保护临界区的方式不一样?
定时器
-
定时器的本质是什么?一个定时器"溢出"时发生了什么?
-
通用定时器和高级定时器(如STM32的TIM和TIM1/8)在哪些功能上有差别?什么场景必须用高级定时器?
-
PWM是怎么通过定时器产生的?占空比和频率各由什么寄存器控制?
-
输入捕获和输出比较——一个是读、一个是写,各自的典型应用场景是什么?
-
看门狗定时器(WDT)为什么叫"看门狗"?如果程序跑飞了,它是怎么"咬"的?
DMA
-
DMA为什么能"不经过CPU"传输数据?那CPU在DMA工作期间在干什么?
-
什么时候该用DMA,什么时候直接CPU轮询或中断更合适?
-
DMA的循环模式(circular mode)和普通模式有什么区别——什么时候需要循环?
-
DMA传输完成的中断比普通外设中断在实时性上有什么不同?
低功耗
-
嵌入式系统的三种功耗模式(Sleep/Stop/Standby)分别在关什么?从Stop唤醒比从Standby快的原因是什么?
-
什么时候应该进入低功耗模式?频繁进出低功耗反而更耗电——这个阈值怎么判断?
-
低功耗设计不只是软件的事——外围电路(如GPIO上拉电阻、供电LDO的选择)在低功耗里起了什么作用?
RTOS(实时操作系统)
-
FreeRTOS的任务调度是靠什么机制切换任务的?为什么叫"抢占式调度"?
-
任务状态机(就绪、运行、阻塞、挂起)——一个任务在这四个状态之间是怎么跳转的?
-
信号量(Semaphore)和互斥量(Mutex)的区别是什么?什么场景下用错会出问题?
-
消息队列和邮箱的本质区别是什么?如果要在多个任务之间传一组结构化数据,选哪个?
-
什么是优先级反转?FreeRTOS怎么处理这个问题?
-
FreeRTOS的Tickless模式是干什么的?它和低功耗模式怎么配合?
Bootloader
-
Bootloader的作用是什么?为什么嵌入式系统要有Bootloader而不是直接跑应用程序?
-
常见的"二级Bootloader"是怎么启动的?从ROM Boot→Bootloader→Application的跳转过程是怎样的?
-
Bootloader做固件更新时,怎么保证更新中途掉电了还能恢复?
-
Bootloader怎么用CRC或校验和来验证固件的完整性?如果校验失败怎么办?
-
Bootloader和应用代码在Flash里怎么分区?两个区域的地址边界谁来定?
嵌入式Linux / 驱动
-
Linux内核驱动的"字符设备"和"平台设备"有什么区别?什么时候该写哪一类?
-
设备树(Device Tree)是干什么的?以前没有设备树的时候怎么描述硬件?
-
GPIO驱动程序里,request、direction_output、direction_input这几个操作各对应硬件上的什么动作?
-
中断下半部(Bottom Half)为什么需要?Tasklet、Workqueue、Threaded IRQ各自适合什么场景?
-
用户空间的open/read/write系统调用是怎么一步步到达硬件寄存器的?驱动模型里的file_operations结构体是干什么的?
调试与工具
-
JTAG和SWD有什么区别?为什么STM32上SWD只用了两根线?
-
printf调试和断点调试各自的优缺点——在实时嵌入式系统里,为什么printf本身可能改变问题的表现?
-
逻辑分析仪和示波器在嵌入式调试中各自看什么?什么场景下选逻辑分析仪,什么场景选示波器?
-
当程序跑飞了(HardFault)——一般第一步做什么来确定是哪里出了问题?
通信协议深入
-
CAN总线为什么需要120Ω终端电阻?如果没接或少接一个,实际通信中会出现什么现象?
-
CAN FD和Classic CAN在帧格式上有什么关键区别?为什么CAN FD能传更多数据还更快?
-
LIN总线为什么是"低成本CAN"的定位?它的主从架构跟CAN的多主架构比,各适合什么场景?
-
SPI的片选(CS)信号在多个从设备时怎么管理?如果片选信号抖动了一下,会发生什么?
RTOS深入实战
-
死锁(deadlock)在嵌入式RTOS里是怎么发生的?两个任务互相等对方释放资源的场景——实际遇到过吗?
-
任务优先级怎么定才合理?如果所有任务都是同一个优先级,调度器会怎么处理?
-
一个任务里调用了delay或vTaskDelay——这段时间里调度器在做什么?CPU在"空转"还是跑了别的任务?
-
RTOS的栈(task stack)和裸机的栈有什么不同?为什么任务栈溢出比裸机栈溢出更难排查?
性能分析与代码优化
-
怎么确定一个嵌入式系统CPU的负载率(utilization)?是算出来的还是测出来的?
-
代码放在Flash里跑和放在RAM里跑,速度差多少?什么情况下你会把关键代码放到RAM里执行?
-
为什么C语言里用全局变量有时候比函数传参快?这个"快"的代价是什么?
硬件-软件边界
-
去耦电容(decoupling capacitor)是硬件的事还是软件也该懂?如果去耦不充分,软件上可能看到什么症状?
-
GPIO输出电流不够驱动外部继电器或LED时——软件能做什么?不能做什么?
-
电平转换(3.3V↔5V)在I2C和UART上做法有什么不同?配置错了软件上会看到什么现象?
-
为什么有时候用示波器看一个信号是对的,但软件读到的值是错的?同步问题还是电平问题?
传感器与执行器
-
I2C传感器的"地址"是怎么来的?如果总线上两个传感器地址冲突了,软件能做什么、硬件能做什么?
-
模拟信号传感器(如NTC热敏电阻、电位器)和数字信号传感器(如I2C温湿度计)在集成时的设计难点分别是什么?
-
为什么有些传感器需要"上电等待时间"(power-up time)?如果上电后立刻读数据,会读到什么?
-
用继电器和用MOSFET做开关控制负载,各自适合什么场景?
电机控制基础
-
直流有刷电机用H桥控制正反转和速度——H桥四个开关管的状态表是什么样的?为什么不能同时打开同一侧的两个开关?
-
为什么无刷直流电机(BLDC)需要"换向"?霍尔传感器在BLDC里起了什么作用?
-
步进电机的"步距角"是什么意思?为什么步进电机可以精确定位但直流电机不行?
安全性与可靠性
-
为什么Flash和RAM需要ECC(纠错码)?ECC能纠正多少位错误?发现无法纠正的错误时应该怎么办?
-
冗余设计的两种方式——"双机热备"和"三模冗余"——各自在什么成本层级上适用?
-
内建自测试(BIST)在嵌入式系统里通常测什么?上电自检跑多久才算合理?
固件升级深入
-
安全固件升级为什么需要"签名校验"?签名和CRC校验在安全性上的本质区别是什么?
-
A/B分区升级(dual bank OTA)是怎么实现"升级失败还能回滚"的?两个区怎么切换?
-
如果OTA下载过程中通信断了,已经下载到一半的数据怎么处理?下次是续传还是重头来?
实时性分析
-
什么是"最差执行时间"(WCET)?理论和实际之间为什么总有一个差值?
-
从GPIO中断触发到ISR第一条代码开始执行——这中间的延迟(interrupt latency)包含了哪些环节?
-
任务抖动(jitter)是什么?在一个实时控制系统中,抖动超标会导致什么后果?
CANopen 协议
-
CANopen是在CAN物理层之上的"应用层"协议——它跟直接发CAN原始报文比,多了什么结构化能力?
-
CANopen的对象字典(Object Dictionary)是什么?为什么每个设备都要有一个,里面的索引范围是怎么划分的?
-
PDO(过程数据对象)和SDO(服务数据对象)各自用于什么场景?为什么实时控制数据走PDO而配置数据走SDO?
Modbus 协议
-
Modbus RTU和Modbus TCP在帧格式上有什么关键区别?为什么RTU需要CRC校验而TCP不需要?
-
Modbus的主从架构里,从设备能不能主动发数据?如果需要从设备上报事件,怎么实现?
-
Modbus的"功能码"(Function Code)是什么意思?03(读保持寄存器)和04(读输入寄存器)有什么区别?
嵌入式测试框架
-
在嵌入式里做单元测试(如Ceedling+Unity+CMock)——被测函数里调用了硬件寄存器操作,怎么模拟?
-
回环测试(loopback test)在通信栈调试里为什么是第一步?UART和CAN的回环测法有什么不同?
代码规范与静态分析
-
静态分析工具(PC-Lint、Coverity、SonarQube)能发现哪类bug是编译器警告发现不了的?
-
代码审查(code review)在嵌入式项目里应该重点关注什么?变量命名还是竞态条件?
USB 基础
-
USB的"主机"和"设备"角色是怎么决定的?OTG(On-The-Go)让一个设备能切换角色——切换时发生了什么?
-
USB描述符(Device Descriptor、Configuration Descriptor、Interface Descriptor、Endpoint Descriptor)这四级结构解决了什么问题?
无线通信基础
-
蓝牙和BLE(低功耗蓝牙)在协议设计上的核心区别是什么?为什么BLE能以低功耗完成同样的数据收发?
-
WiFi模块在嵌入式里集成时,最棘手的通常不是WiFi协议本身,而是TCP/IP协议栈——裸机MCU上跑lwIP时,内存管理要注意什么?
实时控制算法
-
PID控制器的三个参数(P、I、D)各自在做什么?如果只调P不调I和D,系统会怎么样?
-
什么是"积分饱和"(integral windup)?在电机控制或温控系统里,积分饱和会导致什么后果?
电源管理与PMIC
-
嵌入式系统的"电源树"(power tree)是什么?为什么软件也要了解它——你不能让一个3.3V的外设在还在1.8V的域没上电时就访问它?
-
LDO和DC-DC在嵌入式系统里各自适合什么场景?为什么有时LDO会发热而DC-DC不会?
-
上电时序(power sequencing)——MCU核电压和IO电压谁先上?如果顺序错了会怎样?
SPI / I2C 深入
-
SPI的四种模式(CPOL=0/1, CPHA=0/1)到底在控制什么?主设备和从设备模式不匹配时,会读到什么?
-
I2C的时钟拉伸(clock stretching)是什么场景下触发的?如果从设备拉低时钟不放,主设备会怎么办?
看门狗深入
-
独立看门狗(IWDG)和窗口看门狗(WWDG)的本质区别是什么?一个监控"是不是还在跑",另一个监控"跑得是不是太快了"——你能理解这个差异吗?
-
外部看门狗芯片和MCU内部看门狗,各有什么优缺点?在功能安全要求高的项目里,为什么有时候两个都要用?
PID 调参与控制深入
-
Ziegler-Nichols调参法是怎么操作的?为什么先调P使系统震荡,再根据震荡周期算出P、I、D?
-
前馈控制(feedforward)和反馈控制(feedback)的区别是什么?在实际电机控制里,前馈解决了PID的什么问题?
安全启动(Secure Boot)
-
安全启动的"信任链"(chain of trust)是怎么层层验证的:从BootROM→Bootloader→Application,每一级验证下一级的什么?
-
如果BootROM被攻破了,还有救吗?为什么安全启动的"根信任"必须从芯片硬件开始?
嵌入式AI / TinyML
-
在Cortex-M上跑一个神经网络推理,内存和算力瓶颈分别在哪?CMSIS-NN通过什么方式把推理速度提升了4-5倍?
-
什么情况下应该在MCU上做AI推理,而不是把数据发到云端?功耗、延迟、隐私,哪个因素最决定性?
FPGA / CPLD 基础
-
FPGA和CPLD的本质区别是什么?在汽车电子里,什么场景下会在MCU旁边挂一个FPGA?
-
Verilog和C语言在思维方式上的最大不同是什么?"并行"和"顺序"在两种语言里怎么体现?
-
在Cortex-M上SPI通信是软件写寄存器——在FPGA里SPI是什么?用硬件描述语言"实现"一个SPI从设备,大概要写什么?
嵌入式存储技术深入
-
NOR Flash和NAND Flash在读取和写入上有什么本质区别?为什么代码通常跑在NOR上而大容量数据存在NAND上?
-
什么是"写平衡"(wear leveling)?为什么Flash不能无限次写入?如果一直写同一个地址,它多久会坏?
-
SPI Flash和并行NOR/NAND Flash在接口上的区别意味着什么?为什么越来越多的MCU通过QSPI连外部Flash?
Ethernet / IP 协议栈
-
在嵌入式MCU上跑lwIP时,最消耗内存的是TCP的什么特性?为什么说一个TCP连接可能需要几十KB的RAM?
-
裸机MCU上跑Ethernet时,用轮询(polling)方式和中断方式接收网络包,各自的优缺点是什么?为什么高速网络通常用DMA+中断而不是轮询?
嵌入式设计模式
-
状态机(state machine)在嵌入式里为什么是最常见的设计模式?什么时候用switch-case实现,什么时候用函数指针表实现?
-
回调和观察者模式在嵌入式系统里的区别是什么?一个GPIO中断和一个按钮事件的通知——哪个是回调、哪个是观察者?
-
环形缓冲区(ring buffer)的"单生产者单消费者"和"多生产者多消费者"场景下,实现上有哪些不同?
CI/CD 与自动化测试
-
嵌入式项目的CI pipeline跟纯软件项目的CI有什么关键不同?为什么"烧录+运行测试"这一步是CI的瓶颈?
-
硬件在环(HIL)测试怎么自动化?一个nightly build的HIL测试跑完要多久才算正常?
工具链与烧录实战
-
用STM32CubeProgrammer还是OpenOCD烧录?如果是命令行烧录,一条完整的烧录命令怎么写——指定接口(SWD)、速度、目标文件?
-
烧录时提示"no target connected"——第一步检查什么?SWD的四根线(SWDIO、SWCLK、GND、VCC)哪根没接会导致这个错误?
-
一个项目用Keil MDK,另一个用STM32CubeIDE——两个IDE生成的.hex或.bin文件有什么区别?能不能混用烧录工具?
时钟配置实战(HAL/LL)
-
用STM32CubeMX生成时钟树时,HSE、HSI、PLL这三者的关系是什么?为什么外部晶振(HSE)通常比内部振荡器(HSI)更精准?
-
启动时SystemClock_Config函数里先配HSE再配PLL再配SYSCLK——如果顺序乱了,比如SYSCLK选了PLL但PLL还没配好,会怎么样? → 答案见第2篇
-
APB1和APB2总线的时钟频率限制不同——你把一个需要50MHz的外设挂在APB1(通常上限36MHz)上,外设会正常工作吗?
外设初始化实战
-
初始化一个UART外设时,GPIO的复用功能(AF)应该在UART初始化之前还是之后配?如果顺序颠倒了,通信会出什么问题?
-
SPI的片选信号(CS)用硬件控制还是GPIO软件控制好?各有什么优缺点?
-
I2C外设初始化后,用HAL_I2C_IsDeviceReady检查从设备是否在线——如果返回HAL_TIMEOUT,可能的原因按排查优先级怎么排列?
故障排查流程实战
-
焊接好的板子上电后MCU不启动——按什么顺序排查?供电电压、复位引脚、时钟、BOOT引脚?
-
代码功能正常但运行不稳定——随机死机、偶发数据错乱——第一步应该先排查电源去耦还是代码里的竞态条件?
-
一个GPIO输出电平跟预期相反,且改代码里GPIO的电平设置也不起作用——硬件上可能是什么问题?烧录错了还是GPIO被复用了?
总线调试实战
-
两个设备用UART通信,但收到的数据全是乱码——最可能的原因是波特率不匹配还是电平不匹配?怎么确认?
-
用逻辑分析仪抓了一根SPI的MISO线,发现从设备在CS拉低后没有任何响应——这个从设备的SPI使能了没有?供电正常吗?CS引脚极性对不对?
-
CAN总线上只接了两个节点,但一个发报文另一个收不到——用示波器量CAN_H和CAN_L的差分电压,正常应该是多少?终端电阻120Ω接了对不对?
FreeRTOS 配置实战
-
FreeRTOSConfig.h里的configTICK_RATE_HZ、configTOTAL_HEAP_SIZE、configMAX_PRIORITIES这三个参数对系统行为的影响最大——调错了会出什么问题?
-
FreeRTOS的heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c五种堆管理方案分别适合什么场景?如果频繁创建和删除任务,应该选哪个?
-
一个任务栈设了128字(512字节),但运行一段时间后任务栈溢出了——除了直接加大栈大小,还有什么方法能准确算出任务栈的实际使用峰值?
Flash 运行时编程实战
-
MCU在运行代码的同时要擦写同一片Flash上的另一个扇区——擦写期间CPU还能执行中断服务函数吗?如果Flash是统一的,代码执行会怎么样?
-
用HAL_FLASH_Program写Flash时,写入单位是byte、halfword还是word?写之前为什么要先擦除?擦除的单位和写入的单位一样吗?
-
如果在写Flash的过程中断电了,再次上电时怎么知道上一次写成功了没有?
ADC / DMA / PWM 外设实战
-
ADC用规则组(regular group)和注入组(injected group)的区别是什么?如果在一个高优先级中断里触发ADC采样,用哪个组?
-
ADC+DMA的连续采样模式下,DMA缓冲区满了之后会发生什么?如果DMA用了循环模式,怎么确保读到的数据是最新的不是上次的?
-
用定时器输出PWM时,自动重装载值(ARR)和预分频器(PSC)怎么计算目标频率?如果ARR=999,PSC=71,系统时钟72MHz,输出频率是多少? → 答案见第3篇
RTC 与复位源实战
-
MCU上电后,发现RTC的日期时间不对——是因为电池没电了、外部晶振没起振、还是软件初始化时把RTC重配了?怎么区分?
-
系统意外复位了——怎么判断是看门狗复位、低电压复位、外部复位还是软件复位?从哪个寄存器读复位标志?
CRC 与校验实战
-
STM32的硬件CRC外设和软件计算CRC-32比,快多少?如果通信协议里用了CRC,选硬件还是软件实现——为什么?
-
用CRC做固件完整性校验时,怎么确定一份固件是完整的?先读整个固件区域、计算CRC、再跟预期值比对——固件区域有多大、要花多久算完?
功能安全基础(ISO 26262)
-
ISO 26262 的 ASIL(A/B/C/D)等级是怎么定的?如果某个系统故障可能导致人身伤害,它一定是 ASIL D 吗?
-
功能安全要求"避免单点故障"——硬件冗余(双MCU互检)和软件多样化(两个不同的人写两套代码算同一个结果)各在什么成本层级上适用?
-
什么是"安全机制"(safety mechanism)?ECC、CRC、看门狗、锁步(lockstep)——它们各在防护什么类型的故障?
多核嵌入式
-
AMP(非对称多处理)和 SMP(对称多处理)在嵌入式多核系统里的区别是什么?AUTOSAR 多核属于哪种?
-
多核间的"核间通信"(IPC)有哪些方式?共享内存 + 自旋锁、消息邮箱——各有什么优劣?
-
多核调试里最头疼的问题是什么?一个核在跑代码,另一个核改了同一片内存——怎么定位谁改的?
嵌入式安全与加密
-
硬件安全模块(HSM / Crypto Cell)在 MCU 里是干什么的?用硬件 AES 加速器和纯软件实现 AES,除了速度,安全性上有什么本质区别?
-
什么是"侧信道攻击"(side-channel attack)?在嵌入式设备上,通过功耗曲线或者电磁辐射就能猜出密钥——怎么防范?
Trace 与高级调试
-
ETM(嵌入式跟踪宏单元)和 ITM(仪器化跟踪宏单元)的区别是什么?一个跟踪指令执行流,一个输出软件事件——什么场景下用哪个?
-
SWO(单线输出)是怎么工作的?在开发阶段,SWO 跟 UART printf 比,优势在哪?
UDS 诊断协议(汽车电子)
-
UDS(ISO 14229)在 CAN 上是怎么通信的?一个诊断请求通常包含哪几部分——SID、子功能、数据参数?
-
UDS 的 0x22(ReadDataByIdentifier)和 0x2E(WriteDataByIdentifier)——这个"Identifier"是对应 DID(数据标识符),DID 的范围划分是谁定的?
-
诊断会话的控制逻辑——ECU 上电后在默认会话(Default Session),收到 0x10 03 进入扩展会话(Extended Session),再收到 0x10 01 进入编程会话(Programming Session)——每个会话开放了哪些服务?
XCP 标定协议(汽车电子)
-
XCP(Universal Measurement and Calibration Protocol)和 UDS 的本质区别是什么——一个在线改标定参数,一个做故障诊断,两者能共用一条 CAN 总线吗?
-
XCP 的"DAQ 列表"(Data Acquisition List)是干什么用的?如果要用 XCP 以 1ms 周期采集 10 个标量信号——是每个信号单独请求,还是 DAQ 一次打包?
-
XCP 的"同步数据采集"是怎么做到不干扰 ECU 主任务时序的?它的时间戳来自 ECU 端还是测量工具端?
ARM TrustZone 与系统安全隔离
-
Cortex-M23/M33 的 TrustZone 把系统分成安全世界(Secure World)和非安全世界(Non-Secure World)——这两个世界之间的函数调用要经过什么特殊入口?SAU(安全属性单元)负责什么?
-
在 TrustZone 架构下,中断也能配置为安全中断或非安全中断——如果一个安全中断来了但 CPU 正在非安全世界执行代码,它会怎么办?
MISRA-C 深入:关键规则
-
MISRA C:2012 的规则 10.1(操作数不能是"本质上不安全的"类型)和规则 11.3(指针类型转换)——在实际的嵌入式代码里,这两条最容易在什么地方踩坑?
-
MISRA 为什么禁止使用 malloc(规则 21.3)?在嵌入式系统里如果不能动态分配内存,那"运行时才知道需要多大缓冲区"的问题怎么解决?
嵌入式构建系统
-
CMake 在嵌入式项目里相比 Keil/IAR 工程文件,最大的优势是什么?一个跨MCU平台的项目(比如同一套算法要在 STM32 和 S32K 上都编译),CMake 的 toolchain file 是怎么做到切换的?
-
Makefile 里的 -D、-I、-L、-l 这四个 flag 各在控制什么?如果链接时提示"undefined reference to xxx"——最常见的三个原因是什么?
Flash 控制器与读加速
-
MCU 从 Flash 读指令时为什么需要"等待周期"(wait state)?如果系统时钟频率提高后没同步改等待周期数——代码会跑得更快还是直接跑飞?
-
Flash 的预取缓冲(prefetch buffer)和指令缓存(I-cache)各在解决什么问题?一个顺序执行的循环和一堆乱序跳转的函数调用——哪个更受益于哪个?
OSEK/VDX 操作系统
-
OSEK 的任务分"基本任务"和"扩展任务"两类——区别是什么?为什么基本任务不能调用 WaitEvent 而扩展任务可以?
-
OSEK 的 Alarm 机制和 FreeRTOS 的软件定时器在原理上有什么不同?为什么 OSEK 的 Alarm 必须绑定到一个任务而不是一个回调函数?
汽车以太网与 SOME/IP
-
SOME/IP 是"面向服务的通信"——和传统的 CAN 信号(Signal-based)通信比,从"发一个信号"变成"调用一个方法",这个抽象层带来了什么好处和代价?
-
10BASE-T1S(单对线以太网)和传统的 100BASE-TX 相比,为什么不需要交换机就能组网?它和 CAN 在物理层上的设计哲学区别是什么?
嵌入式虚拟化 / Hypervisor
-
在嵌入式领域,Hypervisor 跟服务器虚拟化的区别是什么?一个跑在 Cortex-A 上的 Hypervisor(如 Jailhouse、Xen)怎么实现"多个 OS 共享同一颗多核 CPU"?
-
为什么汽车电子要用 Hypervisor——把 Linux 跑在"非实时"域、把 AUTOSAR 跑在"实时"域?如果不用 Hypervisor,靠双芯片方案能不能达到同样的隔离效果?
C++ 在现代嵌入式中的实践
-
嵌入式 C++ 和桌面 C++ 最大的不同是什么?为什么很多嵌入式项目禁止用异常(exception)和 RTTI(运行时类型信息)?
-
volatile 和 std::atomic 在嵌入式多任务环境里都能防止编译器优化——它们本质区别是什么?为什么 ISR 和主循环之间共享的 flag 用 volatile 就够了,但任务间共享要用 atomic?
CMSIS 标准深入
-
CMSIS-Core 给 ARM Cortex-M 定义了哪些标准化接口?如果一个库只依赖 CMSIS-Core 而不是直接操作寄存器,移植到另一个 Cortex-M 芯片要多改多少代码?
-
CMSIS-DSP 和 CMSIS-NN 分别加速了什么?在 STM32F4 上跑一个 FIR 滤波器,用 CMSIS-DSP 的 arm_fir_f32 和自己手撸一个 for 循环——性能差多少?
MCU 启动过程深入
-
MCU 上电后,从 Reset Vector 到 main() 之间发生了什么?startup_xx.s 里的 Reset_Handler 做了哪几件事——初始化栈指针、拷贝 .data、清零 .bss、调用 SystemInit 和 __libc_init_array?
-
如果 startup 代码里 .data 段拷贝的地址算错了(LMA 和 VMA 不一致),main() 里已初始化的全局变量会读到什么?
QEMU 与仿真调试
-
QEMU 的 system mode 和 user mode 在嵌入式开发里各自有什么用?在 QEMU 上跑 ARM 裸机代码和跑 Linux 内核,各要用什么命令启动?
-
用 QEMU 仿真 STM32(如 qemu-system-arm -M stm32vldiscovery)能仿真到什么程度?GPIO 电平变化能不能看到?UART 输出能不能重定向到终端?
非易失性存储管理与文件系统
-
为什么在 Flash 上跑文件系统(如 LittleFS、SPIFFS)需要"磨损均衡"和"掉电安全"?一个拔电测试频繁的 IoT 设备,如果文件系统不防掉电,最可能出什么故障?
-
MCU 内部 Flash 模拟 EEPROM(Emulated EEPROM)是怎么实现的?为什么 NXP 和 ST 都有各自的"EEPROM 模拟"方案——直接把数据按固定地址写不行吗?
Zephyr RTOS
-
Zephyr 和 FreeRTOS 在架构上最大的不同是什么?为什么 Zephyr 用"设备树(devicetree)"来描述硬件平台,而 FreeRTOS 靠手动改头文件?
-
Zephyr 的线程(thread)、信号量(semaphore)、消息队列(message queue)概念和 FreeRTOS 一一对应吗?如果一个 FreeRTOS 老手转用 Zephyr,最容易在哪踩坑?
FlexRay 协议
-
FlexRay 的"静态段"和"动态段"各在传输什么类型的消息?为什么 FlexRay 被设计为"确定性"总线——和 CAN 的"事件触发"比,在时间确定性上有什么本质不同?
-
FlexRay 为什么在航空和高级汽车底盘控制(如线控制动)里仍然在用?既然 CAN FD 的速度上来了,FlexRay 还有什么不可替代的优势?
裸机调度器设计
-
不用 RTOS 时,怎么在裸机上实现"多任务"效果?一个简单的前后台系统(超级循环 + 定时器中断标志)和协作式任务调度器(cooperative scheduler)——差别在哪?
-
裸机调度器的"任务控制块"(TCB)最小需要存什么?如果在 Cortex-M 上用协程(protothreads / coroutine)模拟多个执行流,切换时怎么保存和恢复上下文?
嵌入式图形(LVGL)
-
LVGL(LittlevGL)在 STM32 上跑时,最消耗 RAM 的是哪个部分?一个 480×320 分辨率、16位色深的显示缓冲区是怎么分配的——单缓冲、双缓冲还是局部刷新?
-
LVGL 的 tick(心跳)和显示刷新是两回事——为什么需要一个定时器产生 LVGL 的 tick 才能保证 UI 响应,而显示驱动通过 flush_callback 刷新?如果 tick 停了但 flush 还在跑,UI 会怎么样?
实时 Linux(PREEMPT_RT)
-
标准 Linux 内核的"最差中断延迟"对于实时应用来说为什么太大?PREEMPT_RT 补丁通过把 spinlock 变成可抢占的 rt_mutex 来降低延迟——它在原理上做了什么?
-
PREEMPT_RT 能保证微秒级确定性吗?一个跑着 PREEMPT_RT 的 Raspberry Pi 和一个裸机 MCU 相比,在 IO 响应时间上谁更可控?
物联网协议(MQTT / CoAP)
-
MQTT 的发布-订阅模型和传统客户端-服务器模型的本质区别是什么?一个传感器节点(发布端)和一个手机 App(订阅端)之间——MQTT Broker 起了什么作用?
-
CoAP 和 MQTT 都用于 IoT,但一个跑在 UDP 上、一个跑在 TCP 上——这个差异决定了它们各适合什么场景?一个电池供电的温湿度传感器,应该用 CoAP 还是 MQTT?
数字信号处理基础(IIR / FIR)
-
FIR 滤波器和 IIR 滤波器的核心区别是什么?为什么在嵌入式系统里 FIR 更稳定(始终有线性相位),但 IIR 用更少的阶数就能达到同样的截止效果?
-
在 MCU 上实现一个 FIR 滤波器,最耗时的操作是乘累加(MAC)。如果用 Cortex-M4 的 DSP 指令(SMUAD)和普通 C 写 for 循环算同一个 FIR——性能差多少?CMSIS-DSP 做了这个优化吗?
代码覆盖率分析
-
嵌入式测试里的语句覆盖、分支覆盖、MC/DC 覆盖有什么区别?为什么航空级(DO-178C)要求 MC/DC 覆盖,而一般工业项目只做到分支覆盖就够了?
-
在嵌入式 C 项目里,gcov 和 lcov 怎么用?一个跑在 QEMU 或实际板子上的测试程序,怎么把覆盖率数据从目标板导出来生成报告?
TFLite Micro 与模型量化
-
TFLite Micro 把一个训练好的 TensorFlow 模型部署到 Cortex-M 上——第一步是"量化":从 float32 变成 int8。模型精度会损失多少?为什么量化后推理速度能快 3-4 倍?
-
一个音频关键词识别模型(如 "Hey Google" 检测)部署到 Cortex-M4 上,推理一次大概要多少内存和多少毫秒?什么因素决定能不能塞进一个 256KB Flash 的 MCU?
MCU 选型与架构对比
- STM32F4(Cortex-M4)、S32K3(Cortex-M7)、TC3xx(TriCore)、RH850(G3KH)——四个架构的 MCU 各有什么不可替代的优势?为什么汽车动力域 ECU 选了英飞凌 TriCore 而不是 ARM Cortex?
专栏⑮进度:导航 + 10/10篇 + 补充一~四(共 14 篇)✅ 全部完成
Area/技术/嵌入式¶
Wiki 维护说明¶
- Flomo 原笔记保留不动;本页为副本。
- 将已回答的问题链接到对应答案页,避免重复复制答案。
- 答案应记录平台/版本、示例、验证步骤与来源。