跳转至

嵌入式 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篇)

  1. 上电到 main()——启动文件、向量表、栈指针,Bootloader 跳 APP 的三个坑

  2. 时钟配置——HSE→PLL→SYSCLK,顺序乱了 MCU 就 hang

  3. PWM 与定时器——ARR/PSC/CCR 的关系,一个公式算清频率和占空比

  4. 链接脚本——内存地图、段分配、LMA/VMA,5 个最常见的 .ld 错误

  5. 单片机学习路径——4 阶段:裸机筑基→寄存器级外设→综合项目→RTOS

  6. 基础概念与架构——嵌入式 vs 通用计算机、MCU vs MPU、冯诺依曼 vs 哈佛

  7. 中断与 ISR——中断延迟、嵌套、临界区,ISR 为什么越短越好

  8. 嵌入式 Linux 驱动入门——字符设备、设备树、file_operations、下半部

  9. 嵌入式调试三板斧——HardFault 定位、printf 的坑、示波器 vs 逻辑分析仪

  10. 嵌入式 15 项自检清单——上车前逐项打勾

▎补充篇(4篇)

  1. 补充一:RTOS 内核——从裸机 super-loop 到任务调度 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MDcx

  2. 补充二:DMA——数据搬运不占 CPU 的隐形引擎 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MDkw

  3. 补充三:低功耗设计——睡眠、唤醒、功耗测量 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MTEy

  4. 补充四:看门狗与可靠性——喂狗策略决定系统能不能自己活过来 → https://v.flomoapp.com/mine/?memo_id=MjUxMjA1MTM5

▎设计原则

  • 每条问题从"软件工程师真实踩坑"出发,不写教科书复述

  • 90+ 方向的问题库作为全景索引,每篇深挖一个方向的实战

  • 与 AUTOSAR(专栏①-⑩)、C语言(⑭)、硬件(⑬)互链,嵌入式是承上启下的主线

▎1000 问全景(问题库)

基础概念

  1. 嵌入式系统和通用计算机系统最本质的区别是什么?这个区别决定了哪些设计上的不同?

  2. MCU和MPU的核心区别是什么?什么时候该选MCU,什么时候该选MPU?

  3. 冯诺依曼结构和哈佛结构在嵌入式系统里怎么体现?STM32是哪一种?

  4. 为什么嵌入式软件经常要跟"寄存器"打交道?读写寄存器和读写普通内存有什么不同?

处理器与架构

  1. Cortex-M3的"三级流水线"是哪三级?它和Cortex-A系列的处理器的流水线有什么不同?

  2. 什么是"向量表"?中断来了以后CPU怎么从向量表找到对应的处理函数?

  3. ARM的Thumb指令集和Thumb-2是什么?为什么嵌入式里经常用Thumb而不是ARM指令集?

  4. RISC-V和ARM在架构设计哲学上有什么关键区别?为什么RISC-V近年发展这么快?

  5. 大端和小端(Big-endian / Little-endian)在嵌入式开发中什么时候会出问题?

存储器与链接

  1. 嵌入式系统的存储层级(SRAM、Flash、SDRAM、EEPROM)各有什么特点?代码放哪、数据放哪?

  2. 链接脚本(Linker Script)在做什么?为什么嵌入式开发要自己写.ld文件?

  3. 堆和栈在嵌入式系统里分别在哪?栈溢出了一般会发生什么?怎么预防?

  4. MMU和MPU有什么区别?什么场景下嵌入式系统需要MMU?

GPIO与外设

  1. GPIO的推挽输出和开漏输出有什么区别?什么场景下必须用开漏?

  2. 为什么UART要设波特率?收发双方的波特率差多少会出错?

  3. I2C为什么需要上拉电阻?它的"开漏"设计跟UART的推挽设计各自解决了什么问题?

  4. SPI和I2C在什么场景下选哪个?为什么说SPI比I2C快?

  5. ADC的采样率、分辨率和精度之间是什么关系?一个12位的ADC是不是一定比10位的"准"?

中断与异常

  1. 中断和异常的区别是什么?按中断向量表和异常向量表来区分的话,它们各自的入口在哪?

  2. 中断服务函数(ISR)为什么越短越好?如果必须做耗时操作,有哪些处理方式?

  3. 中断嵌套会发生什么?什么时候应该允许中断嵌套,什么时候应该禁止?

  4. 中断优先级和子优先级(如STM32的NVIC分组)——为什么要分成两组?怎么配置?

  5. 临界区(critical section)是什么?为什么在ISR里和任务里保护临界区的方式不一样?

定时器

  1. 定时器的本质是什么?一个定时器"溢出"时发生了什么?

  2. 通用定时器和高级定时器(如STM32的TIM和TIM1/8)在哪些功能上有差别?什么场景必须用高级定时器?

  3. PWM是怎么通过定时器产生的?占空比和频率各由什么寄存器控制?

  4. 输入捕获和输出比较——一个是读、一个是写,各自的典型应用场景是什么?

  5. 看门狗定时器(WDT)为什么叫"看门狗"?如果程序跑飞了,它是怎么"咬"的?

DMA

  1. DMA为什么能"不经过CPU"传输数据?那CPU在DMA工作期间在干什么?

  2. 什么时候该用DMA,什么时候直接CPU轮询或中断更合适?

  3. DMA的循环模式(circular mode)和普通模式有什么区别——什么时候需要循环?

  4. DMA传输完成的中断比普通外设中断在实时性上有什么不同?

低功耗

  1. 嵌入式系统的三种功耗模式(Sleep/Stop/Standby)分别在关什么?从Stop唤醒比从Standby快的原因是什么?

  2. 什么时候应该进入低功耗模式?频繁进出低功耗反而更耗电——这个阈值怎么判断?

  3. 低功耗设计不只是软件的事——外围电路(如GPIO上拉电阻、供电LDO的选择)在低功耗里起了什么作用?

RTOS(实时操作系统)

  1. FreeRTOS的任务调度是靠什么机制切换任务的?为什么叫"抢占式调度"?

  2. 任务状态机(就绪、运行、阻塞、挂起)——一个任务在这四个状态之间是怎么跳转的?

  3. 信号量(Semaphore)和互斥量(Mutex)的区别是什么?什么场景下用错会出问题?

  4. 消息队列和邮箱的本质区别是什么?如果要在多个任务之间传一组结构化数据,选哪个?

  5. 什么是优先级反转?FreeRTOS怎么处理这个问题?

  6. FreeRTOS的Tickless模式是干什么的?它和低功耗模式怎么配合?

Bootloader

  1. Bootloader的作用是什么?为什么嵌入式系统要有Bootloader而不是直接跑应用程序?

  2. 常见的"二级Bootloader"是怎么启动的?从ROM Boot→Bootloader→Application的跳转过程是怎样的?

  3. Bootloader做固件更新时,怎么保证更新中途掉电了还能恢复?

  4. Bootloader怎么用CRC或校验和来验证固件的完整性?如果校验失败怎么办?

  5. Bootloader和应用代码在Flash里怎么分区?两个区域的地址边界谁来定?

嵌入式Linux / 驱动

  1. Linux内核驱动的"字符设备"和"平台设备"有什么区别?什么时候该写哪一类?

  2. 设备树(Device Tree)是干什么的?以前没有设备树的时候怎么描述硬件?

  3. GPIO驱动程序里,request、direction_output、direction_input这几个操作各对应硬件上的什么动作?

  4. 中断下半部(Bottom Half)为什么需要?Tasklet、Workqueue、Threaded IRQ各自适合什么场景?

  5. 用户空间的open/read/write系统调用是怎么一步步到达硬件寄存器的?驱动模型里的file_operations结构体是干什么的?

调试与工具

  1. JTAG和SWD有什么区别?为什么STM32上SWD只用了两根线?

  2. printf调试和断点调试各自的优缺点——在实时嵌入式系统里,为什么printf本身可能改变问题的表现?

  3. 逻辑分析仪和示波器在嵌入式调试中各自看什么?什么场景下选逻辑分析仪,什么场景选示波器?

  4. 当程序跑飞了(HardFault)——一般第一步做什么来确定是哪里出了问题?

通信协议深入

  1. CAN总线为什么需要120Ω终端电阻?如果没接或少接一个,实际通信中会出现什么现象?

  2. CAN FD和Classic CAN在帧格式上有什么关键区别?为什么CAN FD能传更多数据还更快?

  3. LIN总线为什么是"低成本CAN"的定位?它的主从架构跟CAN的多主架构比,各适合什么场景?

  4. SPI的片选(CS)信号在多个从设备时怎么管理?如果片选信号抖动了一下,会发生什么?

RTOS深入实战

  1. 死锁(deadlock)在嵌入式RTOS里是怎么发生的?两个任务互相等对方释放资源的场景——实际遇到过吗?

  2. 任务优先级怎么定才合理?如果所有任务都是同一个优先级,调度器会怎么处理?

  3. 一个任务里调用了delay或vTaskDelay——这段时间里调度器在做什么?CPU在"空转"还是跑了别的任务?

  4. RTOS的栈(task stack)和裸机的栈有什么不同?为什么任务栈溢出比裸机栈溢出更难排查?

性能分析与代码优化

  1. 怎么确定一个嵌入式系统CPU的负载率(utilization)?是算出来的还是测出来的?

  2. 代码放在Flash里跑和放在RAM里跑,速度差多少?什么情况下你会把关键代码放到RAM里执行?

  3. 为什么C语言里用全局变量有时候比函数传参快?这个"快"的代价是什么?

硬件-软件边界

  1. 去耦电容(decoupling capacitor)是硬件的事还是软件也该懂?如果去耦不充分,软件上可能看到什么症状?

  2. GPIO输出电流不够驱动外部继电器或LED时——软件能做什么?不能做什么?

  3. 电平转换(3.3V↔5V)在I2C和UART上做法有什么不同?配置错了软件上会看到什么现象?

  4. 为什么有时候用示波器看一个信号是对的,但软件读到的值是错的?同步问题还是电平问题?

传感器与执行器

  1. I2C传感器的"地址"是怎么来的?如果总线上两个传感器地址冲突了,软件能做什么、硬件能做什么?

  2. 模拟信号传感器(如NTC热敏电阻、电位器)和数字信号传感器(如I2C温湿度计)在集成时的设计难点分别是什么?

  3. 为什么有些传感器需要"上电等待时间"(power-up time)?如果上电后立刻读数据,会读到什么?

  4. 用继电器和用MOSFET做开关控制负载,各自适合什么场景?

电机控制基础

  1. 直流有刷电机用H桥控制正反转和速度——H桥四个开关管的状态表是什么样的?为什么不能同时打开同一侧的两个开关?

  2. 为什么无刷直流电机(BLDC)需要"换向"?霍尔传感器在BLDC里起了什么作用?

  3. 步进电机的"步距角"是什么意思?为什么步进电机可以精确定位但直流电机不行?

安全性与可靠性

  1. 为什么Flash和RAM需要ECC(纠错码)?ECC能纠正多少位错误?发现无法纠正的错误时应该怎么办?

  2. 冗余设计的两种方式——"双机热备"和"三模冗余"——各自在什么成本层级上适用?

  3. 内建自测试(BIST)在嵌入式系统里通常测什么?上电自检跑多久才算合理?

固件升级深入

  1. 安全固件升级为什么需要"签名校验"?签名和CRC校验在安全性上的本质区别是什么?

  2. A/B分区升级(dual bank OTA)是怎么实现"升级失败还能回滚"的?两个区怎么切换?

  3. 如果OTA下载过程中通信断了,已经下载到一半的数据怎么处理?下次是续传还是重头来?

实时性分析

  1. 什么是"最差执行时间"(WCET)?理论和实际之间为什么总有一个差值?

  2. 从GPIO中断触发到ISR第一条代码开始执行——这中间的延迟(interrupt latency)包含了哪些环节?

  3. 任务抖动(jitter)是什么?在一个实时控制系统中,抖动超标会导致什么后果?

CANopen 协议

  1. CANopen是在CAN物理层之上的"应用层"协议——它跟直接发CAN原始报文比,多了什么结构化能力?

  2. CANopen的对象字典(Object Dictionary)是什么?为什么每个设备都要有一个,里面的索引范围是怎么划分的?

  3. PDO(过程数据对象)和SDO(服务数据对象)各自用于什么场景?为什么实时控制数据走PDO而配置数据走SDO?

Modbus 协议

  1. Modbus RTU和Modbus TCP在帧格式上有什么关键区别?为什么RTU需要CRC校验而TCP不需要?

  2. Modbus的主从架构里,从设备能不能主动发数据?如果需要从设备上报事件,怎么实现?

  3. Modbus的"功能码"(Function Code)是什么意思?03(读保持寄存器)和04(读输入寄存器)有什么区别?

嵌入式测试框架

  1. 在嵌入式里做单元测试(如Ceedling+Unity+CMock)——被测函数里调用了硬件寄存器操作,怎么模拟?

  2. 回环测试(loopback test)在通信栈调试里为什么是第一步?UART和CAN的回环测法有什么不同?

代码规范与静态分析

  1. 静态分析工具(PC-Lint、Coverity、SonarQube)能发现哪类bug是编译器警告发现不了的?

  2. 代码审查(code review)在嵌入式项目里应该重点关注什么?变量命名还是竞态条件?

USB 基础

  1. USB的"主机"和"设备"角色是怎么决定的?OTG(On-The-Go)让一个设备能切换角色——切换时发生了什么?

  2. USB描述符(Device Descriptor、Configuration Descriptor、Interface Descriptor、Endpoint Descriptor)这四级结构解决了什么问题?

无线通信基础

  1. 蓝牙和BLE(低功耗蓝牙)在协议设计上的核心区别是什么?为什么BLE能以低功耗完成同样的数据收发?

  2. WiFi模块在嵌入式里集成时,最棘手的通常不是WiFi协议本身,而是TCP/IP协议栈——裸机MCU上跑lwIP时,内存管理要注意什么?

实时控制算法

  1. PID控制器的三个参数(P、I、D)各自在做什么?如果只调P不调I和D,系统会怎么样?

  2. 什么是"积分饱和"(integral windup)?在电机控制或温控系统里,积分饱和会导致什么后果?

电源管理与PMIC

  1. 嵌入式系统的"电源树"(power tree)是什么?为什么软件也要了解它——你不能让一个3.3V的外设在还在1.8V的域没上电时就访问它?

  2. LDO和DC-DC在嵌入式系统里各自适合什么场景?为什么有时LDO会发热而DC-DC不会?

  3. 上电时序(power sequencing)——MCU核电压和IO电压谁先上?如果顺序错了会怎样?

SPI / I2C 深入

  1. SPI的四种模式(CPOL=0/1, CPHA=0/1)到底在控制什么?主设备和从设备模式不匹配时,会读到什么?

  2. I2C的时钟拉伸(clock stretching)是什么场景下触发的?如果从设备拉低时钟不放,主设备会怎么办?

看门狗深入

  1. 独立看门狗(IWDG)和窗口看门狗(WWDG)的本质区别是什么?一个监控"是不是还在跑",另一个监控"跑得是不是太快了"——你能理解这个差异吗?

  2. 外部看门狗芯片和MCU内部看门狗,各有什么优缺点?在功能安全要求高的项目里,为什么有时候两个都要用?

PID 调参与控制深入

  1. Ziegler-Nichols调参法是怎么操作的?为什么先调P使系统震荡,再根据震荡周期算出P、I、D?

  2. 前馈控制(feedforward)和反馈控制(feedback)的区别是什么?在实际电机控制里,前馈解决了PID的什么问题?

安全启动(Secure Boot)

  1. 安全启动的"信任链"(chain of trust)是怎么层层验证的:从BootROM→Bootloader→Application,每一级验证下一级的什么?

  2. 如果BootROM被攻破了,还有救吗?为什么安全启动的"根信任"必须从芯片硬件开始?

嵌入式AI / TinyML

  1. 在Cortex-M上跑一个神经网络推理,内存和算力瓶颈分别在哪?CMSIS-NN通过什么方式把推理速度提升了4-5倍?

  2. 什么情况下应该在MCU上做AI推理,而不是把数据发到云端?功耗、延迟、隐私,哪个因素最决定性?

FPGA / CPLD 基础

  1. FPGA和CPLD的本质区别是什么?在汽车电子里,什么场景下会在MCU旁边挂一个FPGA?

  2. Verilog和C语言在思维方式上的最大不同是什么?"并行"和"顺序"在两种语言里怎么体现?

  3. 在Cortex-M上SPI通信是软件写寄存器——在FPGA里SPI是什么?用硬件描述语言"实现"一个SPI从设备,大概要写什么?

嵌入式存储技术深入

  1. NOR Flash和NAND Flash在读取和写入上有什么本质区别?为什么代码通常跑在NOR上而大容量数据存在NAND上?

  2. 什么是"写平衡"(wear leveling)?为什么Flash不能无限次写入?如果一直写同一个地址,它多久会坏?

  3. SPI Flash和并行NOR/NAND Flash在接口上的区别意味着什么?为什么越来越多的MCU通过QSPI连外部Flash?

Ethernet / IP 协议栈

  1. 在嵌入式MCU上跑lwIP时,最消耗内存的是TCP的什么特性?为什么说一个TCP连接可能需要几十KB的RAM?

  2. 裸机MCU上跑Ethernet时,用轮询(polling)方式和中断方式接收网络包,各自的优缺点是什么?为什么高速网络通常用DMA+中断而不是轮询?

嵌入式设计模式

  1. 状态机(state machine)在嵌入式里为什么是最常见的设计模式?什么时候用switch-case实现,什么时候用函数指针表实现?

  2. 回调和观察者模式在嵌入式系统里的区别是什么?一个GPIO中断和一个按钮事件的通知——哪个是回调、哪个是观察者?

  3. 环形缓冲区(ring buffer)的"单生产者单消费者"和"多生产者多消费者"场景下,实现上有哪些不同?

CI/CD 与自动化测试

  1. 嵌入式项目的CI pipeline跟纯软件项目的CI有什么关键不同?为什么"烧录+运行测试"这一步是CI的瓶颈?

  2. 硬件在环(HIL)测试怎么自动化?一个nightly build的HIL测试跑完要多久才算正常?

工具链与烧录实战

  1. 用STM32CubeProgrammer还是OpenOCD烧录?如果是命令行烧录,一条完整的烧录命令怎么写——指定接口(SWD)、速度、目标文件?

  2. 烧录时提示"no target connected"——第一步检查什么?SWD的四根线(SWDIO、SWCLK、GND、VCC)哪根没接会导致这个错误?

  3. 一个项目用Keil MDK,另一个用STM32CubeIDE——两个IDE生成的.hex或.bin文件有什么区别?能不能混用烧录工具?

时钟配置实战(HAL/LL)

  1. 用STM32CubeMX生成时钟树时,HSE、HSI、PLL这三者的关系是什么?为什么外部晶振(HSE)通常比内部振荡器(HSI)更精准?

  2. 启动时SystemClock_Config函数里先配HSE再配PLL再配SYSCLK——如果顺序乱了,比如SYSCLK选了PLL但PLL还没配好,会怎么样? → 答案见第2篇

  3. APB1和APB2总线的时钟频率限制不同——你把一个需要50MHz的外设挂在APB1(通常上限36MHz)上,外设会正常工作吗?

外设初始化实战

  1. 初始化一个UART外设时,GPIO的复用功能(AF)应该在UART初始化之前还是之后配?如果顺序颠倒了,通信会出什么问题?

  2. SPI的片选信号(CS)用硬件控制还是GPIO软件控制好?各有什么优缺点?

  3. I2C外设初始化后,用HAL_I2C_IsDeviceReady检查从设备是否在线——如果返回HAL_TIMEOUT,可能的原因按排查优先级怎么排列?

故障排查流程实战

  1. 焊接好的板子上电后MCU不启动——按什么顺序排查?供电电压、复位引脚、时钟、BOOT引脚?

  2. 代码功能正常但运行不稳定——随机死机、偶发数据错乱——第一步应该先排查电源去耦还是代码里的竞态条件?

  3. 一个GPIO输出电平跟预期相反,且改代码里GPIO的电平设置也不起作用——硬件上可能是什么问题?烧录错了还是GPIO被复用了?

总线调试实战

  1. 两个设备用UART通信,但收到的数据全是乱码——最可能的原因是波特率不匹配还是电平不匹配?怎么确认?

  2. 用逻辑分析仪抓了一根SPI的MISO线,发现从设备在CS拉低后没有任何响应——这个从设备的SPI使能了没有?供电正常吗?CS引脚极性对不对?

  3. CAN总线上只接了两个节点,但一个发报文另一个收不到——用示波器量CAN_H和CAN_L的差分电压,正常应该是多少?终端电阻120Ω接了对不对?

FreeRTOS 配置实战

  1. FreeRTOSConfig.h里的configTICK_RATE_HZ、configTOTAL_HEAP_SIZE、configMAX_PRIORITIES这三个参数对系统行为的影响最大——调错了会出什么问题?

  2. FreeRTOS的heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c五种堆管理方案分别适合什么场景?如果频繁创建和删除任务,应该选哪个?

  3. 一个任务栈设了128字(512字节),但运行一段时间后任务栈溢出了——除了直接加大栈大小,还有什么方法能准确算出任务栈的实际使用峰值?

Flash 运行时编程实战

  1. MCU在运行代码的同时要擦写同一片Flash上的另一个扇区——擦写期间CPU还能执行中断服务函数吗?如果Flash是统一的,代码执行会怎么样?

  2. 用HAL_FLASH_Program写Flash时,写入单位是byte、halfword还是word?写之前为什么要先擦除?擦除的单位和写入的单位一样吗?

  3. 如果在写Flash的过程中断电了,再次上电时怎么知道上一次写成功了没有?

ADC / DMA / PWM 外设实战

  1. ADC用规则组(regular group)和注入组(injected group)的区别是什么?如果在一个高优先级中断里触发ADC采样,用哪个组?

  2. ADC+DMA的连续采样模式下,DMA缓冲区满了之后会发生什么?如果DMA用了循环模式,怎么确保读到的数据是最新的不是上次的?

  3. 用定时器输出PWM时,自动重装载值(ARR)和预分频器(PSC)怎么计算目标频率?如果ARR=999,PSC=71,系统时钟72MHz,输出频率是多少? → 答案见第3篇

RTC 与复位源实战

  1. MCU上电后,发现RTC的日期时间不对——是因为电池没电了、外部晶振没起振、还是软件初始化时把RTC重配了?怎么区分?

  2. 系统意外复位了——怎么判断是看门狗复位、低电压复位、外部复位还是软件复位?从哪个寄存器读复位标志?

CRC 与校验实战

  1. STM32的硬件CRC外设和软件计算CRC-32比,快多少?如果通信协议里用了CRC,选硬件还是软件实现——为什么?

  2. 用CRC做固件完整性校验时,怎么确定一份固件是完整的?先读整个固件区域、计算CRC、再跟预期值比对——固件区域有多大、要花多久算完?

功能安全基础(ISO 26262)

  1. ISO 26262 的 ASIL(A/B/C/D)等级是怎么定的?如果某个系统故障可能导致人身伤害,它一定是 ASIL D 吗?

  2. 功能安全要求"避免单点故障"——硬件冗余(双MCU互检)和软件多样化(两个不同的人写两套代码算同一个结果)各在什么成本层级上适用?

  3. 什么是"安全机制"(safety mechanism)?ECC、CRC、看门狗、锁步(lockstep)——它们各在防护什么类型的故障?

多核嵌入式

  1. AMP(非对称多处理)和 SMP(对称多处理)在嵌入式多核系统里的区别是什么?AUTOSAR 多核属于哪种?

  2. 多核间的"核间通信"(IPC)有哪些方式?共享内存 + 自旋锁、消息邮箱——各有什么优劣?

  3. 多核调试里最头疼的问题是什么?一个核在跑代码,另一个核改了同一片内存——怎么定位谁改的?

嵌入式安全与加密

  1. 硬件安全模块(HSM / Crypto Cell)在 MCU 里是干什么的?用硬件 AES 加速器和纯软件实现 AES,除了速度,安全性上有什么本质区别?

  2. 什么是"侧信道攻击"(side-channel attack)?在嵌入式设备上,通过功耗曲线或者电磁辐射就能猜出密钥——怎么防范?

Trace 与高级调试

  1. ETM(嵌入式跟踪宏单元)和 ITM(仪器化跟踪宏单元)的区别是什么?一个跟踪指令执行流,一个输出软件事件——什么场景下用哪个?

  2. SWO(单线输出)是怎么工作的?在开发阶段,SWO 跟 UART printf 比,优势在哪?

UDS 诊断协议(汽车电子)

  1. UDS(ISO 14229)在 CAN 上是怎么通信的?一个诊断请求通常包含哪几部分——SID、子功能、数据参数?

  2. UDS 的 0x22(ReadDataByIdentifier)和 0x2E(WriteDataByIdentifier)——这个"Identifier"是对应 DID(数据标识符),DID 的范围划分是谁定的?

  3. 诊断会话的控制逻辑——ECU 上电后在默认会话(Default Session),收到 0x10 03 进入扩展会话(Extended Session),再收到 0x10 01 进入编程会话(Programming Session)——每个会话开放了哪些服务?

XCP 标定协议(汽车电子)

  1. XCP(Universal Measurement and Calibration Protocol)和 UDS 的本质区别是什么——一个在线改标定参数,一个做故障诊断,两者能共用一条 CAN 总线吗?

  2. XCP 的"DAQ 列表"(Data Acquisition List)是干什么用的?如果要用 XCP 以 1ms 周期采集 10 个标量信号——是每个信号单独请求,还是 DAQ 一次打包?

  3. XCP 的"同步数据采集"是怎么做到不干扰 ECU 主任务时序的?它的时间戳来自 ECU 端还是测量工具端?

ARM TrustZone 与系统安全隔离

  1. Cortex-M23/M33 的 TrustZone 把系统分成安全世界(Secure World)和非安全世界(Non-Secure World)——这两个世界之间的函数调用要经过什么特殊入口?SAU(安全属性单元)负责什么?

  2. 在 TrustZone 架构下,中断也能配置为安全中断或非安全中断——如果一个安全中断来了但 CPU 正在非安全世界执行代码,它会怎么办?

MISRA-C 深入:关键规则

  1. MISRA C:2012 的规则 10.1(操作数不能是"本质上不安全的"类型)和规则 11.3(指针类型转换)——在实际的嵌入式代码里,这两条最容易在什么地方踩坑?

  2. MISRA 为什么禁止使用 malloc(规则 21.3)?在嵌入式系统里如果不能动态分配内存,那"运行时才知道需要多大缓冲区"的问题怎么解决?

嵌入式构建系统

  1. CMake 在嵌入式项目里相比 Keil/IAR 工程文件,最大的优势是什么?一个跨MCU平台的项目(比如同一套算法要在 STM32 和 S32K 上都编译),CMake 的 toolchain file 是怎么做到切换的?

  2. Makefile 里的 -D、-I、-L、-l 这四个 flag 各在控制什么?如果链接时提示"undefined reference to xxx"——最常见的三个原因是什么?

Flash 控制器与读加速

  1. MCU 从 Flash 读指令时为什么需要"等待周期"(wait state)?如果系统时钟频率提高后没同步改等待周期数——代码会跑得更快还是直接跑飞?

  2. Flash 的预取缓冲(prefetch buffer)和指令缓存(I-cache)各在解决什么问题?一个顺序执行的循环和一堆乱序跳转的函数调用——哪个更受益于哪个?

OSEK/VDX 操作系统

  1. OSEK 的任务分"基本任务"和"扩展任务"两类——区别是什么?为什么基本任务不能调用 WaitEvent 而扩展任务可以?

  2. OSEK 的 Alarm 机制和 FreeRTOS 的软件定时器在原理上有什么不同?为什么 OSEK 的 Alarm 必须绑定到一个任务而不是一个回调函数?

汽车以太网与 SOME/IP

  1. SOME/IP 是"面向服务的通信"——和传统的 CAN 信号(Signal-based)通信比,从"发一个信号"变成"调用一个方法",这个抽象层带来了什么好处和代价?

  2. 10BASE-T1S(单对线以太网)和传统的 100BASE-TX 相比,为什么不需要交换机就能组网?它和 CAN 在物理层上的设计哲学区别是什么?

嵌入式虚拟化 / Hypervisor

  1. 在嵌入式领域,Hypervisor 跟服务器虚拟化的区别是什么?一个跑在 Cortex-A 上的 Hypervisor(如 Jailhouse、Xen)怎么实现"多个 OS 共享同一颗多核 CPU"?

  2. 为什么汽车电子要用 Hypervisor——把 Linux 跑在"非实时"域、把 AUTOSAR 跑在"实时"域?如果不用 Hypervisor,靠双芯片方案能不能达到同样的隔离效果?

C++ 在现代嵌入式中的实践

  1. 嵌入式 C++ 和桌面 C++ 最大的不同是什么?为什么很多嵌入式项目禁止用异常(exception)和 RTTI(运行时类型信息)?

  2. volatile 和 std::atomic 在嵌入式多任务环境里都能防止编译器优化——它们本质区别是什么?为什么 ISR 和主循环之间共享的 flag 用 volatile 就够了,但任务间共享要用 atomic?

CMSIS 标准深入

  1. CMSIS-Core 给 ARM Cortex-M 定义了哪些标准化接口?如果一个库只依赖 CMSIS-Core 而不是直接操作寄存器,移植到另一个 Cortex-M 芯片要多改多少代码?

  2. CMSIS-DSP 和 CMSIS-NN 分别加速了什么?在 STM32F4 上跑一个 FIR 滤波器,用 CMSIS-DSP 的 arm_fir_f32 和自己手撸一个 for 循环——性能差多少?

MCU 启动过程深入

  1. MCU 上电后,从 Reset Vector 到 main() 之间发生了什么?startup_xx.s 里的 Reset_Handler 做了哪几件事——初始化栈指针、拷贝 .data、清零 .bss、调用 SystemInit 和 __libc_init_array?

  2. 如果 startup 代码里 .data 段拷贝的地址算错了(LMA 和 VMA 不一致),main() 里已初始化的全局变量会读到什么?

QEMU 与仿真调试

  1. QEMU 的 system mode 和 user mode 在嵌入式开发里各自有什么用?在 QEMU 上跑 ARM 裸机代码和跑 Linux 内核,各要用什么命令启动?

  2. 用 QEMU 仿真 STM32(如 qemu-system-arm -M stm32vldiscovery)能仿真到什么程度?GPIO 电平变化能不能看到?UART 输出能不能重定向到终端?

非易失性存储管理与文件系统

  1. 为什么在 Flash 上跑文件系统(如 LittleFS、SPIFFS)需要"磨损均衡"和"掉电安全"?一个拔电测试频繁的 IoT 设备,如果文件系统不防掉电,最可能出什么故障?

  2. MCU 内部 Flash 模拟 EEPROM(Emulated EEPROM)是怎么实现的?为什么 NXP 和 ST 都有各自的"EEPROM 模拟"方案——直接把数据按固定地址写不行吗?

Zephyr RTOS

  1. Zephyr 和 FreeRTOS 在架构上最大的不同是什么?为什么 Zephyr 用"设备树(devicetree)"来描述硬件平台,而 FreeRTOS 靠手动改头文件?

  2. Zephyr 的线程(thread)、信号量(semaphore)、消息队列(message queue)概念和 FreeRTOS 一一对应吗?如果一个 FreeRTOS 老手转用 Zephyr,最容易在哪踩坑?

FlexRay 协议

  1. FlexRay 的"静态段"和"动态段"各在传输什么类型的消息?为什么 FlexRay 被设计为"确定性"总线——和 CAN 的"事件触发"比,在时间确定性上有什么本质不同?

  2. FlexRay 为什么在航空和高级汽车底盘控制(如线控制动)里仍然在用?既然 CAN FD 的速度上来了,FlexRay 还有什么不可替代的优势?

裸机调度器设计

  1. 不用 RTOS 时,怎么在裸机上实现"多任务"效果?一个简单的前后台系统(超级循环 + 定时器中断标志)和协作式任务调度器(cooperative scheduler)——差别在哪?

  2. 裸机调度器的"任务控制块"(TCB)最小需要存什么?如果在 Cortex-M 上用协程(protothreads / coroutine)模拟多个执行流,切换时怎么保存和恢复上下文?

嵌入式图形(LVGL)

  1. LVGL(LittlevGL)在 STM32 上跑时,最消耗 RAM 的是哪个部分?一个 480×320 分辨率、16位色深的显示缓冲区是怎么分配的——单缓冲、双缓冲还是局部刷新?

  2. LVGL 的 tick(心跳)和显示刷新是两回事——为什么需要一个定时器产生 LVGL 的 tick 才能保证 UI 响应,而显示驱动通过 flush_callback 刷新?如果 tick 停了但 flush 还在跑,UI 会怎么样?

实时 Linux(PREEMPT_RT)

  1. 标准 Linux 内核的"最差中断延迟"对于实时应用来说为什么太大?PREEMPT_RT 补丁通过把 spinlock 变成可抢占的 rt_mutex 来降低延迟——它在原理上做了什么?

  2. PREEMPT_RT 能保证微秒级确定性吗?一个跑着 PREEMPT_RT 的 Raspberry Pi 和一个裸机 MCU 相比,在 IO 响应时间上谁更可控?

物联网协议(MQTT / CoAP)

  1. MQTT 的发布-订阅模型和传统客户端-服务器模型的本质区别是什么?一个传感器节点(发布端)和一个手机 App(订阅端)之间——MQTT Broker 起了什么作用?

  2. CoAP 和 MQTT 都用于 IoT,但一个跑在 UDP 上、一个跑在 TCP 上——这个差异决定了它们各适合什么场景?一个电池供电的温湿度传感器,应该用 CoAP 还是 MQTT?

数字信号处理基础(IIR / FIR)

  1. FIR 滤波器和 IIR 滤波器的核心区别是什么?为什么在嵌入式系统里 FIR 更稳定(始终有线性相位),但 IIR 用更少的阶数就能达到同样的截止效果?

  2. 在 MCU 上实现一个 FIR 滤波器,最耗时的操作是乘累加(MAC)。如果用 Cortex-M4 的 DSP 指令(SMUAD)和普通 C 写 for 循环算同一个 FIR——性能差多少?CMSIS-DSP 做了这个优化吗?

代码覆盖率分析

  1. 嵌入式测试里的语句覆盖、分支覆盖、MC/DC 覆盖有什么区别?为什么航空级(DO-178C)要求 MC/DC 覆盖,而一般工业项目只做到分支覆盖就够了?

  2. 在嵌入式 C 项目里,gcov 和 lcov 怎么用?一个跑在 QEMU 或实际板子上的测试程序,怎么把覆盖率数据从目标板导出来生成报告?

TFLite Micro 与模型量化

  1. TFLite Micro 把一个训练好的 TensorFlow 模型部署到 Cortex-M 上——第一步是"量化":从 float32 变成 int8。模型精度会损失多少?为什么量化后推理速度能快 3-4 倍?

  2. 一个音频关键词识别模型(如 "Hey Google" 检测)部署到 Cortex-M4 上,推理一次大概要多少内存和多少毫秒?什么因素决定能不能塞进一个 256KB Flash 的 MCU?

MCU 选型与架构对比

  1. STM32F4(Cortex-M4)、S32K3(Cortex-M7)、TC3xx(TriCore)、RH850(G3KH)——四个架构的 MCU 各有什么不可替代的优势?为什么汽车动力域 ECU 选了英飞凌 TriCore 而不是 ARM Cortex?

专栏⑮进度:导航 + 10/10篇 + 补充一~四(共 14 篇)✅ 全部完成

Area/技术/嵌入式


Wiki 维护说明

  • Flomo 原笔记保留不动;本页为副本。
  • 将已回答的问题链接到对应答案页,避免重复复制答案。
  • 答案应记录平台/版本、示例、验证步骤与来源。