C 语言与嵌入式基础面试手册
适用:嵌入式软件、MCU、RTOS、驱动和应用方案实习面试。
阅读方法:S 级必须能直接回答并写代码,A 级理解常见追问,B 级知道用途即可。
每题先背“直接回答”。“补充”只在面试官追问时展开。
1. 复习顺序
优先级
内容
S
volatile、static、const、指针和数组、内存分区、结构体对齐、宏、函数指针、编译链接
S
中断、临界区、互斥锁、信号量、FreeRTOS 调度、环形缓冲区
A
整数转换、动态内存、位域、大小端、C++ 对象模型、RAII
B
格式化 I/O、变参、文件接口、Linux 进程和 I/O 多路复用
回答顺序统一为:定义 -> 作用 -> 不能保证什么 -> 嵌入式场景。
2. 数据类型、运算符与控制流2.1 int 一定是 32 位吗? [S]直接回答:
不一定。C 标准只规定类型的最小范围和大小关系,具体位宽由平台决定。协议字段、寄存器和文件格式需要固定宽度时,我会使用 <stdint.h> 中的 uint8_t、int16_t、u ...
1. 请先讲系统架构回答顺序:硬件分工 -> 启动顺序 -> 业务任务 -> 快照 -> UI。先说明 P4 是主控、C6 是 BLE Controller,ESP-Hosted SDIO 是 HCI 通道;再说明 BLE/Wi-Fi/地图/音频都是独立 task,最终都写入运动或业务快照,LVGL 每秒/按页面周期消费。
2. 地图如何从 GeoJSON 到屏幕GeoJSON 在 PC 端流式转 mapbin。idx 是边界和稠密网格索引,dat 是按 cell 存储的折线/三角形/点。设备从 idx 计算中心 3x3 cell,逐字段校验后把 0.1 m 局部坐标加网格原点,形成 dm 世界坐标。完整路线/PHONE 是 GCJ-02,路线 task 用两次迭代的 WGS84->GCJ02 反算统一到 WGS84,再通过同一投影函数进入路线投影。
3. 如何处理路线传输可靠性BEGIN 固定 route_id、点数、总长度和 CRC;DATA 必须严格按 offset 递进,重复包只 ...
1. 页面路由ui_page_manager.c 用静态 route 表把 page id 映射到 create/destroy/update。切页先 destroy 当前页,再 create 新页;同页切换只调用 update。当前包含 Boot、Menu、Cycling、MTB、Map、SD Route、History、History Detail、Weather、Sensors、Settings、Xiaozhi 和测试页。
页面拥有自己的 LVGL root、timer、event callback 和 PSRAM cache。destroy 必须删除 timer、注销按键 handler、删除 root、释放缓存,避免页面切换后隐藏对象仍参与布局。
2. 中央 UI 数据ui_app.c 维护 system_data_t。全局 update timer 每 1000 ms 读取运动快照、系统时间、BLE 连接、电量,并调用当前页面 update。运动字段由 valid_flags 控制;传感器离线会清零对应字段并把状态设为 OFFLINE。UI 不直接读 B ...
1. 责任边界esp_xiaozhi 组件不负责扫描、配网或 Wi-Fi 重连。main/app_net/app_wifi.c 负责 Remote STA、扫描、连接、超时、重试和 profile NVS;main/ai_voice/app_ai_voice.c 负责 HTTP 获取配置、MCP、WebSocket、OPUS 音频;app_xiaozhi_controller.c 负责双击按键、页面确认和跨模块通知。
2. 手动联网流程开机不启动 Wi-Fi。实体电源键 500 ms 窗口内双击,控制器保存返回页面并切到 Xiaozhi 页面;用户确认后才 app_wifi_request_scan()。扫描结果去重、按 RSSI 降序、最多 10 个,支持开放/WPA2/WPA3 混合认证。连接单次 20 s,最多 3 次,退避 2 s/4 s;认证失败直接失败。
只有 IP_EVENT_STA_GOT_IP 后才把 profile 写入 app_wifi NVS,最多保存 5 个最近网络。Wi-Fi event handler 不做网络操作,只投递 S ...
1. ESP-Hosted BLE 架构P4 关闭本地 Bluetooth Controller,运行 NimBLE Host/GATT Server;C6 提供 Controller,HCI 通过 ESP-Hosted VHCI over SDIO。P4 上的 bt/app_ble.c 负责广播、连接和 notify,app_ble_gatt.c 定义 characteristic,app_ble_proto.c 解析统一包头,业务数据再进入各自 task。
设备名 Aero-Wtach,单连接,preferred MTU=247,Legacy connectable advertising。Ride Service 下有 Live Metrics、Command、Config、Ride Record、Route Status;另注册标准 Battery Service。
2. 通用 Command1cmd_id:u8 | seq:u8 | payload_len:u8 | payload[payload_len]
实际长度必须等于 3+payload_len, ...
1. 两条独立音频路径123Xiaozhi 下行:WebSocket binary raw OPUS -> ai_audio -> libopus -> PCM16 -> MAX98357AXiaozhi 上行:ICS43434 I2S 32 bit -> PCM16 mono -> 静音门 -> libopus -> WebSocket本地主动播报:SD 裸 PCM16 -> 2048 B PSRAM buffer -> MAX98357A
本地播报不让服务端生成文本,运动/导航事件直接组合预录数字和单位片段,延迟和离线可控。
2. Xiaozhi 会话启动app_ai_voice_task 等待 Wi-Fi ready event。顺序固定为:稳定等待 1 s -> esp_xiaozhi_chat_get_info() -> 再等 1 s -> 创建 MCP engine、注册 chat callback、强制 WebSocket -> 等 connected 最多 8 s -> ...
1. 任务清单
任务
优先级/栈
触发或周期
主要职责
LVGL adapter
24,PSRAM
最长延迟 5 ms
唯一 UI 线程
app_button
5/4 KiB
队列事件
按键去抖、单击/双击/长按分发
ble_route
4/4 KiB PSRAM
BLE 命令队列
路线接收、CRC、快照发布
phone_location
4/3 KiB
定位队列/超时
过滤定位、更新运动模型
map_store
4/4 KiB
地图请求
SD 读取、校验、解析、快照交换
map_route
4/4 KiB PSRAM
路线 generation
坐标转换、投影、高程预处理
app_wifi
4/6 KiB PSRAM
命令队列
扫描、连接、超时、重试、NVS
ai_voice
4/8 KiB PSRAM
event group
Xiaozhi 生命周期
ai_audio
4/12 KiB
OPUS 队列
下行 OPUS 解码 ...
1. 离线转换为什么做成 mapbin完整广东 GeoJSON 不能在设备上解析。tools/geojson_to_c_array_gui.py 采用两遍流式扫描:第一遍建立边界和网格统计,第二遍写入 SQLite 临时几何,再输出 map.idx/map.dat。最终文件先写 .tmp,完成后替换正式文件,避免断电留下半包地图。
设备侧只解析定长二进制,避免 JSON token、字符串和浮点对象造成的 RAM 峰值。所有字段按 little-endian 逐字段读取,不能直接 fread() 到 C struct,因为编译器 padding 会破坏协议兼容。
2. 坐标与网格mapbin 使用局部等距圆柱投影:
12x_m = radians(lon - min_lon) * 6378137 * cos(radians(projection_lat))y_m = radians(lat - min_lat) * 6378137
默认网格边长 2000 m。grid_x=floor(x_m/cell_size_m),grid_y=floor(y_m/cell_size_m ...
1. 一句话定义这是一个运行在 ESP32-P4 上的圆形 LVGL 骑行终端。P4 负责业务计算、SD 地图、显示、音频和协议栈;ESP32-C6 只提供 Bluetooth Controller,二者通过 ESP-Hosted SDIO 交换 HCI。设备侧把 BLE 路线、手机定位、GNSS、传感器和 DEMO 数据汇聚到统一运动模型,再由 UI、历史记录和主动播报分别消费快照。
2. 分层边界123456789101112板级层 components/board_peripherals PMIC / LCD / Touch / SDMMC / GNSS UART / I2S 音频 / IMU |业务模型层 main/app_model + map motion snapshot / weather / history / system time map_store SD 数据 + map_route 路线投影 |协议接入层 bt + app_net + ai_voice NimBLE GATT / BLE route / Wi-Fi STA ...
骑行码表项目面试深挖手册
用途:面试时从项目概括展开到源码、数据结构、RTOS、异常和取舍。文中“源码事实”来自当前工程;没有实测的帧率、功耗、吞吐和声学指标明确标成待测,不在面试中夸大。
1. 先把项目讲清楚1.1 30 秒版本这是一个基于 ESP32-P4/C6 的智能骑行码表。P4 负责 LVGL 图形、离线地图和骑行业务,C6 通过 ESP-Hosted SDIO 提供蓝牙 Controller。手机小程序通过 BLE 下发路线和定位,设备用分片状态机接收并校验路线,再把 GCJ-02 坐标转换到 WGS84 地图坐标,计算路线进度、偏离距离、转向和坡度。运动数据统一进入 app_motion_model,Cycling、MTB、地图、历史、本地播报和小智 MCP 都读取同一份快照。小智走 Wi-Fi/WebSocket/Opus,本地导航播报走 SD 卡预生成 PCM;所有网络、SD 和音频操作都放在独立任务,LVGL 线程只负责显示。
1.2 三分钟版本项目的难点是多模块并发,而不是单独调用某个 SDK。输入有手机 BLE、GNSS、IMU ...

















