汇川技术 - 嵌入式软件工程师 - 面经(1)


-1、背景

岗位:【25提前批-联合动力】嵌入式软件工程师

工作职责:

  1. 硕士及以上学历,自动化、计算机、电气工程及其自动化等专业等相关专业;
  2. 有嵌入式软件编程经验,熟练掌握C/C++,有simulink应用、芯片驱动设计等开发经验者优先。
  3. 工作严谨细致,有责任心,有良好沟通能力,具备团队合作精神。

任职资格:

  1. 负责新能源汽车相关产品软件开发,汽车电子嵌入式软件设计、开发与测试工作
  2. 负责基于ARM、DSP等单板控制器的软件开发
  3. 负责软件功能的需求分析、设计及代码开发
  4. 协助解决产品市场问题、技术难点等。

时间线:

0705(投递) -> 0705(测评) -> 0729(一面)-> ❌


0、笔试

提前批无笔试

1、面经汇总

  1. 介绍整体项目?
  2. XXX 是怎么运行的?
  3. 有没有做验证, 怎么知道 APP 有没有生效,损坏?
  4. 固件头包含什么信息?
  5. 介绍一下这几个 MCU 里用过的外设?
  6. 团队和个人工作的区别是什么?
  7. 更喜欢团队工作还是个人?

汇川联合动力一面,总时长不到 20min

  1. 自我介绍
  2. 聊了聊科研项目
  3. 本科基础课(数模电,自动控制现代控制)
  4. 简单的 C++ 基础提问
  5. TCP/IP 简单介绍

飞书视频会议 全程 25 分钟左右

  1. 自我介绍
  2. 手撕:兔子生兔子问题
  3. 实习相关内容
  4. 手撕汇编:十个数重新排列(写了 3 行面试官说可以了挺好的)
  5. 反问
    1. 公司作息时间?
    2. 西安岗位的情况?
    3. 几个城市的具体方向划分有没有区别?

总体难度不难,主要围绕项目,有少量八股,压力不大,全程半个小时

  1. 自我介绍
  2. 介绍项目
  3. 问了项目中的 C 语言高级用法,如函数指针、指针函数
  4. 闲聊

嵌入式软件工程师

  1. 自我介绍
  2. 项目相关问题
  3. 结构体字节对齐问题
  4. CAN 总线的仲裁机制,优先级问题
  5. 讲讲 FreeRTOS(任务调度,优先级机制)
  6. 队列和栈的区别
  7. 手撕代码:猴子吃桃

嵌入式软件工程师(西安)

0812(投递) -> 0824(一面)-> 0828(一面通过)-> 0910(线下二三面)

  1. 自我介绍
  2. 项目介绍
    1. 变换器控制环是不是自己写的,介绍下思路?
    2. 前馈解耦控制中包含电网电压项吗,如果不加电网电压项会有什么影响?
    3. 中断频率设置的是多少?怎么优化中断服务函数执行速度?
    4. F28335 中 int 类型占几个字节?
    5. 多进程操作需要注意哪些问题?临界资源有哪些?
    6. 局部变量与全局变量的存储位置分别是什么?
    7. 静态全局变量赋初值和不赋值有什么区别?
  3. 反问环节
    1. 嵌入式工作方向?(分为两个,DSP 控制算法或者偏底层车机系统)
    2. 面试一共会有几轮?(三轮)

  1. 自我介绍
  2. 项目介绍(只问了智能车比赛)
    1. 比赛难度?
    2. 获奖情况?
    3. 电感采集?
    4. 说说采样频率,单片机如何采集到信息的?
  3. 手撕字符串反转:“abcdefg -> gfedcba” ?
  4. 为什么用静态函数?什么地方用?
  5. 反问
    1. 入职有学习期吗?

30mins

  1. 自我介绍
  2. 实习项目拷打(相关度较高)
  3. 介绍 C++ 多态?
  4. C++ static 作用?
  5. 介绍 C++ 堆栈?
  6. 函数的行参为什么不放在寄存器,要放在栈里?
  7. 反问

0809(投递) -> 0809(测评) -> 0908(一面)

  1. 项目介绍
  2. Windows 操作系统和 SYS/BIOS 的区别?
  3. Linux 系统、计算机网络了解吗?
  4. 怎么看待将你临时借调到其他部门?
  5. 项目中遇到的困难?

  1. volatile 的作用?
  2. 选择题:数组指针
  3. 代码题:联合体

十一

  1. 讲一讲 UART/I2C/SPI/CAN的区别?
  2. 用过哪些 I2C 器件?
  3. 有硬件设计经验?你做过什么?
  4. 学过 PLC?用过哪些 PLC? 梯形图和 ST 都熟悉?
  5. 你知不知道汇川是做什么的?)
  6. 项目相关
  7. 反问
    1. 一面多久出结果?

2、一面(30min)- 20240729

  1. C 语言编译的过程

预处理 -> 编译 -> 汇编 -> 链接

  1. *p++(*p)++ 区别

*p++ 返回指针 p 指向的元素值,指针 p 指向下一个元素,地址++
(*p)++ 返回指针 p 指向的元素值,并将该元素值加一,值++

  1. 编程题(三道题均为真题,但面试只会手撕一道)

有 1、2、3、4 四个数字,用 C 语言编程计算能组合出多少个不重复的三位数,并输出各个数

#include <stdio.h>

int main() {
    int count = 0;
    for (int i = 1; i <= 4; i++) {
        for (int j = 1; j <= 4; j++) {
            if (j == i) continue; // 保证数字不重复
            for (int k = 1; k <= 4; k++) {
                if (k == i || k == j) continue; // 保证数字不重复
                printf("%d%d%d\n", i, j, k);
                count++;
            }
        }
    }
    printf("总共组合数量: %d\n", count);
    return 0;
}

已知一个数列的前3个数为3,4,5,以后每个数为前3个数的和,编程序求此数列的第N项

int fibonacci_recursive(int n) {  
    if (n <= 0) {  
        return 3;  
    } else if (n == 1) {  
        return 4;  
    } else if (n == 1) {  
	    return 5;
	} else {
        return fibonacci_recursive(n - 1) 
	        + fibonacci_recursive(n - 2) 
	        + fibonacci_recursive(n - 3);  
    }  
}

给定一个整型数 a,清除 a 的 bit15 ~ bit23 ,保证其他位不变

#include <stdio.h>  
#include <stdlib.h>  

// 打印 32 位二进制数
void printBinary(int n) {  
    char binary[33];  
    // 字符串结尾
    binary[32] = '\0';
    for (int i = 31; i >= 0; i--) {  
        // 使用位操作来检查每一位  
        binary[i] = (n & 1) ? '1' : '0';  
        // 右移一位  
        n >>= 1; 
    }  
    printf("%s\n", binary);  
}  
  
int main() {  
    int num=0xFFFFFFFF;  
  
    printBinary(num);  
	// 1.掩码方式 
    int method1 = num;  
    int mask = 0xFF007FFF;  
    method1 &= mask;  
    printBinary(method1);  
    
	// 2.移位方式
    int method2 = num;  
    method2 &=~(0x1FF << 15);  
    printBinary(method2);  
    return 0;  
}
  1. 你都使用过 MCU 的哪些外设,挑一个你最熟悉的讲一讲?
  2. 使用 I2C 获取的从机数据是怎么样的?
  3. Linux 启动过程是怎么样的?
  4. 堆栈溢出是什么?
  5. 内存对齐是什么?
<think>好的,我需要处理用户关于MCU嵌入式软件驱动开发面试题的需求。首先,用户提供的引用内容中有几个相关资源,我需要从中提取有用的信息。引用1提到MCU的定义和内部集成ROM、RAM等功能,这可能涉及存储管理相关的题目。引用2提到了嵌入式项目经验、问题解决能力,这可能对应项目类问题。引用3和4则涉及C语言、操作系统、驱动开发、Bootloader等,这些都是常见的面试考点。 接下来,我需要根据这些引用内容生成相关的面试题目。题目类型可能包括基础概念、驱动开发、中断处理、外设通信、存储管理、代码调试、项目经验等。每个问题需要确保覆盖用户提到的关键词,如MCU、驱动开发、面试题等,并引用合适的来源。 同时,用户要求生成的问题要符合格式,使用中文,并正确引用。例如,关于Bootloader的问题可以引用[^4],而关于I2C驱动的问题可以引用[^3]。需要确保每个问题都有对应的引用标记,并且问题内容与引用内容相关。 还要检查是否有遗漏的重要知识点,比如RTOS、低功耗设计、看门狗等,这些在嵌入式开发中也很常见。最后,生成的问题需要分类清晰,覆盖多个方,帮助用户全准备面试。</think>### MCU嵌入式软件驱动开发面试题整理 #### **一、基础概念与C语言** 1. **MCU的存储结构** MCU内部通常集成ROM、RAM、Flash等存储器,解释这些存储器的用途及访问特点[^1]。 **问题**:如何优化MCU的Flash和RAM使用效率? 2. **中断处理机制** 描述中断服务程序(ISR)的编写注意事项,如何避免中断嵌套导致的资源竞争? 3. **C语言关键知识点** - 指针与数组的区别,举例说明指针在寄存器操作中的应用。 - 解释`volatile`关键字的作用,并说明在驱动开发中的使用场景。 --- #### **二、外设驱动开发** 1. **GPIO配置** 如何实现一个按键的长按和短按检测?需考虑消抖和状态机设计。 2. **通信协议驱动** - I2C总线的时序如何实现?若从设备无响应,如何排查问题?[^3] - SPI通信的全双工与半双工模式有何区别?如何配置DMA传输? 3. **ADC与PWM** 设计一个电池电压检测功能,要求ADC采样频率为1kHz,并过滤噪声。 --- #### **三、系统与底层开发** 1. **Bootloader设计** Bootloader的存储地址如何规划?如何实现固件升级的校验与回滚机制?[^4] 2. **RTOS应用** - 在FreeRTOS中,任务优先级和调度策略如何影响实时性?[^3] - 如何通过信号量保护共享资源(如UART发送队列)? 3. **低功耗设计** MCU进入低功耗模式(如Sleep模式)前需要保存哪些上下文?如何唤醒?[^1] --- #### **四、调试与实战经验** 1. **调试工具与方法** 如何通过逻辑分析仪捕捉SPI通信异常?列举常见错误(如时钟极性配置错误)[^3]。 2. **项目经验** - 描述一个你参与的MCU项目,负责的驱动模块及遇到的挑战(如时序不匹配)[^2]。 - 如何解决外设驱动中的硬件兼容性问题(如不同型号传感器的I2C地址冲突)?[^2] 3. **内存管理** 动态内存分配在MCU开发中是否安全?如何避免内存碎片?[^1] --- #### **五、扩展问题** 1. **看门狗(WDT)应用** 独立看门狗与窗口看门狗的区别是什么?如何配置超时时间?[^3] 2. **固件加密与安全** 如何实现MCU固件的加密传输与存储? 3. **RTOS与裸机开发对比** 什么场景下适合使用RTOS?举例说明。 --- §§ 相关问题 §§ 1. MCU的Flash和RAM优化方法有哪些实际案例? 2. I2C总线中如何实现多主设备通信? 3. Bootloader设计中如何确保固件升级的可靠性? 4. RTOS任务堆栈溢出有哪些调试手段? 5. 如何通过硬件定时器实现精准的P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OSnotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值