001 嵌入式软件开发工程师实习篇面试——首战总结
2025年5月17日人生中第一次面试
紧张是藏不住的。但是不应该的。
目录
0.准备一份合适的自我介绍
1.结构体内存对齐问题
2.变量在内存中的存储模式
3.嵌入式中程序框架有哪些
4.程序代码设计要遵循什原则
5.版本号书写
6.单片机最小系统板有哪些组成
必须:
非必须:
7.复位方式有哪些
硬件复位
软件复位
其他复位类型
8.hex文件和bin文件有什么区别
9.如何导出bin文件,如何在bin文件中添加第三方的校验或者序列号
导出bin文件
添加校验
序列号管理
10.嵌入式中阶梯形状的波形可以用哪些实现
11.12位ADC中测到的数值为n对应的电压是多少
12.采样电阻作用是什么
1. 电流与电压测量
2. 系统保护与安全控制——监控电压电流
3. 功率计算与能效分析
13.一个GPIO如何控制一个多个按键
二极管扩展法
大概就是电阻配合二极管配合电路网络生成不同逻辑电平(数字输入)或者电压(ADC)
电阻分压法(ADC方案)
充放电时间检测法(GPIO+RC方案)
14.按键LED有哪些模式
15.PA0和PB0引脚能不能一起作为外部中断信号输入
16.STM32中起始地址是多少,每次读取写入数据的长度大小是多少,他的擦除方式有哪些
Flash起始地址——0x0800 0000 结束地址取决于芯片型号
读写数据长度
擦除方式
17.如何获取芯片序列号
18.如何降低单片机功耗
低功耗模式
降低频率
关闭未使用的外设
减少CPU的计算负载
使用DMA
19.如何快速PID调参
20.一个完整的产品设计开发需要导出哪些设计文件
一、需求分析阶段
二、硬件设计阶段
三、软件开发阶段
四、测试验证阶段
五、生产制造阶段
六、认证与合规
七、产品交付文件
八、维护与迭代
21.如何快速掌握单片机应用
0.准备一份合适的自我介绍
1.结构体内存对齐问题
数据地址是数据类型大小的整数倍,则触发单周期访问。未对齐访问会触发总线错误(HardFault)或产生多次内存操作。
2.变量在内存中的存储模式
小端序
3.嵌入式中程序框架有哪些
框架类型 | 资源占用 | 实时性 | 开发复杂度 | 适用场景 |
---|---|---|---|---|
顺序执行的前后台系统 | 低 | 差 | 简单 | 简单MCU控制 |
时间片轮询系统 | 中 | 一般 | 中等 | 中等复杂度任务轮询 |
RTOS | 高 | 高 | 复杂 | 高实时性、多任务系统 |
Linux嵌入式架构 | 高 | 一般 | 复杂 | 复杂功能设备(如网关、服务器) |
硬件抽象层框架 | 中 | 一般 | 中等 | 跨平台开发、快速原型 |
状态机
4.程序代码设计要遵循什原则
1、简单、明了、清晰:
2、精简
3、保持第三方代码风格
4、减少封装
5.注释信息:文件信息注释(文件开头)、函数的注释、代码注释
作用域标识
- 全局变量:以
g_
前缀标识(如g_system_state
),避免滥用全局变量。 - 静态变量:以
s_
前缀标识(如s_counter
),提升模块封装性。 - 结构体变量:以
st_
前缀标识(如st_date
),区分普通变量。 - 指针:以
p_
前缀标识(如p_data
),明确指针类型
场景 | 规范命名 | 不规范命名 | 说明 |
全局变量、文件名 | g_sensor_value | value | 明确作用域和用途。 |
结构体成员 | st_time.year | year | 区分结构体内外变量。 |
局部变量 | sensor_value (小写,无须作用域) | value | 明确数据来源和类型。 |
函数 | App_InitMotor(首字母大写) | InitMotor | 明确模块归属 |
函数指针 | p_callback_func | func | 明确指针类型。 |
常量宏定义 | MAX_BUFFER_SIZE | maxsize | 全大写+下划线,区分变量与常量。 |
5.版本号书写
参考金典的:V1.2.3.20240518_rc
(主版本1,次版本2,修订3,2024年5月18日构建,候选版本)
HAL_LABL_V2.1.1.20250518_rc
6.单片机最小系统板有哪些组成
必须:
主芯片(单片机核心)
电源电路
时钟电路(晶振)
复位电路
需启动电路
程序下载电路
非必须:
指示与扩展电路
7.复位方式有哪些
硬件复位
- 外部复位:通过外部信号触发,低电平复位信号。通常连接到单片机的复位引脚(如NRST)
- 电源复位:当系统上电或电源不稳定时,由电源管理电路自动触发的复位
- 看门狗复位:看门狗定时器未在规定时间内被刷新,系统认为程序运行异常,自动触发复位
软件复位
- 指令复位:通过执行特定的非法指令或访问非法地址,强制触发硬件复位
- 寄存器复位:通过向特定的控制寄存器写入复位命令,实现软件控制的复位
其他复位类型
- 上电复位(POR):系统首次上电时触发的复位,确保系统从已知的初始状态开始运行
- 系统复位:影响整个系统,包括CPU、外设和内存等,恢复到默认状态
- 模块复位:仅对特定模块或外设进行复位,不影响其他部分
- 备份域复位:针对备份区域(如RTC和备份寄存器)的复位,通常用于低功耗模式
- 低功耗复位:在系统进入低功耗状态时触发的复位,确保系统正确退出低功耗模式
8.hex文件和bin文件有什么区别
- HEX文件:适合需要地址信息和校验的复杂场景,如ISP烧录和调试。
- BIN文件:适合简单烧录或地址固定的系统,文件更紧凑且烧录效率更高
属性 | HEX文件 | BIN文件 |
---|---|---|
格式 | ASCII文本(带元数据) | 纯二进制数据 |
地址信息 | 包含起始地址,支持分段映射 | 无地址信息,需手动指定起始地址 |
校验机制 | 每行校验和确保数据完整性 | 无校验,需额外处理数据完整性 |
文件大小 | 较大(含元数据) | 较小(仅数据) |
可读性 | 可读(适合调试) | 不可读(需工具解析) |
典型用途 | 复杂场景(多段地址映射、ISP烧录) | 简单任务(Bootloader升级、固定地址) |
9.如何导出bin文件,如何在bin文件中添加第三方的校验或者序列号
导出bin文件
1.调用工具链,Keil mdk中添加生成语句:fromelf --bin --output=@L.bin !L
2.GCC工具链生成:arm-none-eabi-objcopy -O binary -S ${ProjName}.elf ${ProjName}.bin
添加校验
方案1:CRC尾部校验(校验