💌 所属专栏:【嵌入式面试】
😀 作 者:兰舟比特 🐾
🚀 个人简介:热爱开源系统与嵌入式技术,专注 Linux、网络通信、编程技巧、面试总结与软件工具分享,持续输出实用干货!
💡 欢迎大家:这里是兰舟比特的技术小站,喜欢的话请点赞、收藏、评论三连击!有问题欢迎留言交流😘😘😘
在嵌入式开发岗位的面试中,通常会围绕以下几个方面来提问:基础知识、编程能力(特别是C语言)、操作系统、硬件理解、项目经验、算法与调试技巧等。下面是一些经典的嵌入式面试问题及参考答案,希望你能收获到满意的offer:
一、C语言相关问题
1. #define
和 const
的区别?
- #define 是预处理宏,在编译前替换,不带类型检查。
- const 是常量修饰符,具有类型信息,编译时分配内存,有作用域限制。
2. volatile
关键字的作用是什么?什么情况下使用?
- 告诉编译器该变量可能会被意外修改(如中断、DMA、多线程),不要进行优化。
- 常用于:
- 寄存器访问
- 中断服务程序中的变量
- 多线程/多进程共享变量
3. static
关键字的作用?
- 在函数内部:静态局部变量,生命周期延长至整个程序运行期间。
- 在文件作用域:限制变量或函数的作用域为本文件(隐藏)。
- 对类成员(C++):属于类而非对象。
4. 指针和数组的区别?
- 数组名是常量指针,不能自增;指针可以改变指向。
sizeof(array)
返回整个数组大小,sizeof(ptr)
返回指针大小。
5. 大端和小端的区别?
- 大端(Big-endian):高位字节在前,低位字节在后(如网络字节序)。
- 小端(Little-endian):低位字节在前,高位字节在后(如x86架构)。
二、操作系统与并发
1. 进程和线程的区别?
- 进程:资源分配的基本单位,独立地址空间。
- 线程:调度的基本单位,共享所属进程的资源。
2. 什么是死锁?产生的条件有哪些?
- 死锁是指多个进程/线程因争夺资源而相互等待,导致程序无法继续执行。
- 四个必要条件:
- 互斥
- 请求与保持
- 不可抢占
- 循环等待
3. 什么是中断?硬中断和软中断的区别?
- 中断:CPU响应外部事件的一种机制。
- 硬中断:由外设触发(如定时器、串口)。
- 软中断:由软件触发(如系统调用、异常)。
4. 实时操作系统(RTOS)的特点?
- 可预测性强,任务调度延迟确定。
- 支持硬实时任务。
- 内核轻量级,占用资源少。
三、硬件基础与单片机
1. 解释一下GPIO的工作原理?
- GPIO(通用输入输出)引脚可以通过配置寄存器设置为输入或输出模式。
- 输出高电平时驱动外部设备,低电平则接地。
- 输入模式下可读取外部高低电平状态。
2. 看门狗定时器(WDT)的作用?
- 防止程序跑飞或死循环,定期喂狗(reset WDT)否则系统复位。
3. SPI/I2C/UART的区别?
协议 | 通信方式 | 引脚数 | 特点 |
---|---|---|---|
SPI | 同步全双工 | 4根(SCLK, MOSI, MISO, CS) | 速度快,支持主从结构 |
I2C | 同步半双工 | 2根(SDA, SCL) | 支持多主多从,速度较慢 |
UART | 异步全双工 | 2根(TXD, RXD) | 简单,点对点通信 |
4. ADC/DAC的作用?
- ADC:将模拟信号转换为数字信号。
- DAC:将数字信号转换为模拟信号。
四、项目经验与场景题
1. 描述一个你参与过的嵌入式项目?
建议结构:
- 项目背景与目标
- 使用的平台/芯片/工具链
- 你的职责与贡献
- 遇到的问题及解决方法
- 最终成果
2. 如果串口通信收不到数据,你会怎么排查?
- 检查波特率、数据位、停止位是否一致
- 检查引脚连接是否正确(TX-RX交叉)
- 是否开启接收中断或DMA
- 使用示波器/逻辑分析仪抓信号
- 添加打印语句或LED指示灯辅助调试
3. 如何降低嵌入式系统的功耗?
- 使用低功耗模式(待机、休眠)
- 减少外设使用频率
- 使用高效的算法减少CPU负载
- 选用低功耗MCU
五、开放性问题
1. 你如何理解“裸机”开发?
- 不使用操作系统,直接操作硬件,适用于资源有限的系统。
2. 你熟悉哪些嵌入式开发平台?
- STM32、ESP32、Arduino、树莓派、TI MSP430、ARM Cortex-M系列等。
3. 你常用的调试工具有哪些?
- JTAG/SWD调试器(如ST-Link、J-Link)
- 示波器、逻辑分析仪(如Saleae)
- printf调试、日志系统
- GDB调试工具
六、进阶问题(适合高级职位)
1. ARM Cortex-M内核启动流程?
- 上电复位 -> 初始化堆栈指针 -> 跳转到Reset_Handler -> 系统初始化 -> main函数执行
2. 写一个原子操作的宏?
#define ATOMIC_BLOCK() \
do { \
__disable_irq(); \
// 执行关键代码 \
__enable_irq(); \
} while(0)
3. 写一个简单的环形缓冲区结构体和操作函数?
七、算法与数据结构(嵌入式中常用)
- 位运算(移位、掩码)
- 状态机设计
- 链表、队列、栈
- 查找与排序(简单实现)
- CRC校验算法
版权声明:
本文为 兰舟比特 原创内容,如需转载,请注明出处及作者,禁止未经授权的引用或商用。