汇川技术 - 嵌入式软件工程师 - 面经(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. 内存对齐是什么?