汇川联合动力 一面 面经 题目很常规不难
1. 自我介绍。
答:(根据个人情况作答,建议包含:教育背景、项目经历、技术栈、求职意向,控制在2分钟内)
2. 你在项目中有没有用过RTOS?讲一下任务调度的原理?
答:RTOS(实时操作系统)常见的有FreeRTOS、RT-Thread、uCOS等。任务调度核心原理:
- 基于优先级的抢占式调度:高优先级任务就绪后,立即抢占当前运行的低优先级任务
- 时间片轮转:相同优先级的任务按时间片轮流执行
- 调度器维护就绪队列、阻塞队列、挂起队列,每次tick中断触发调度器选出最高优先级就绪任务运行
- 上下文切换时保存当前任务的寄存器现场(PC、SP、通用寄存器等)到TCB(任务控制块),恢复目标任务的现场
3. 为什么嵌入式系统中频繁使用位操作?举例说明。
答:
- 嵌入式系统直接操作硬件寄存器,寄存器的每一位往往控制不同功能
- 位操作效率高,不需要读-改-写整个字节,节省内存和CPU周期
- 常见操作:
// 置位第3位
reg |= (1 << 3);
// 清除第3位
reg &= ~(1 << 3);
// 翻转第3位
reg ^= (1 << 3);
// 检测第3位是否为1
if (reg & (1 << 3)) { ... }
4. const和#define有什么区别?在嵌入式中更推荐用哪个?
答:
类型检查 |
有 |
无 |
作用域 |
遵循C作用域规则 |
全局替换 |
调试 |
可见符号名 |
预处理后消失 |
存储 |
占用内存(可放flash) |
不占内存,直接替换 |
指针操作 |
可以取地址 |
不可以 |
嵌入式中推荐用 const,原因:
- 有类型安全检查,避免隐式类型错误
- 编译器可以将const变量优化到ROM/Flash区域,节省RAM
- 调试时符号可见,便于排查问题
5. 解释一下内存对齐,为什么需要内存对齐?
答:内存对齐是指数据存储的起始地址必须是其自身大小的整数倍。
原因:
- CPU访问内存时,通常以固定字长(4字节或8字节)为单位读取
- 如果数据跨越两个字长边界,CPU需要两次访问并拼接,效率低
- 部分架构(如ARM Cortex-M0)不支持非对齐访问,会触发硬件异常
示例:
struct A {
char a; // 1字节,偏移0
// 3字节padding
int b; // 4字节,偏移4
char c; // 1字节,偏移8
// 3字节padding
};
// sizeof(A) = 12,而非6
可用 __attribute__((packed)) 取消对齐,但会降低访问效率。
6. 什么是DMA?它的工作原理是什么?在什么场景下使用?
答:DMA(Direct Memory Access,直接内存访问)是一种允许外设不经过CPU直接与内存交换数据的机制。
工作原理:
- CPU配置DMA控制器(源地址、目标地址、传输长度、传输方向)
- CPU启动DMA传输后可以去做其他事情
- DMA控制器独立完成数据搬运,占用总线
- 传输完成后通过中断通知CPU
使用场景:
- UART/SPI/I2C大量数据收发
- ADC连续采样数据搬运到内存
- 内存到内存的大块数据拷贝
- 音频/视频数据流传输
优点:释放CPU,提高系统吞吐量,降低中断频率。
7. 中
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式面试八股文全集 文章被收录于专栏
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。


查看16道真题和解析