汇川技术 - 嵌入式软件工程师 - 面经(1)
-1、背景
岗位:
【25提前批-联合动力】嵌入式软件工程师
工作职责:
- 硕士及以上学历,自动化、计算机、电气工程及其自动化等专业等相关专业;
- 有嵌入式软件编程经验,熟练掌握C/C++,有simulink应用、芯片驱动设计等开发经验者优先。
- 工作严谨细致,有责任心,有良好沟通能力,具备团队合作精神。
任职资格:
- 负责新能源汽车相关产品软件开发,汽车电子嵌入式软件设计、开发与测试工作
- 负责基于ARM、DSP等单板控制器的软件开发
- 负责软件功能的需求分析、设计及代码开发
- 协助解决产品市场问题、技术难点等。
时间线:
0705(投递) -> 0705(测评) -> 0729(一面)-> ❌
0、笔试
提前批无笔试
1、面经汇总
一
- 介绍整体项目?
- XXX 是怎么运行的?
- 有没有做验证, 怎么知道 APP 有没有生效,损坏?
- 固件头包含什么信息?
- 介绍一下这几个 MCU 里用过的外设?
- 团队和个人工作的区别是什么?
- 更喜欢团队工作还是个人?
二
汇川联合动力一面,总时长不到 20min
- 自我介绍
- 聊了聊科研项目
- 本科基础课(数模电,自动控制现代控制)
- 简单的 C++ 基础提问
- TCP/IP 简单介绍
三
飞书视频会议 全程 25 分钟左右
- 自我介绍
- 手撕:兔子生兔子问题
- 实习相关内容
- 手撕汇编:十个数重新排列(写了 3 行面试官说可以了挺好的)
- 反问
- 公司作息时间?
- 西安岗位的情况?
- 几个城市的具体方向划分有没有区别?
四
总体难度不难,主要围绕项目,有少量八股,压力不大,全程半个小时
- 自我介绍
- 介绍项目
- 问了项目中的 C 语言高级用法,如函数指针、指针函数
- 闲聊
五
嵌入式软件工程师
- 自我介绍
- 项目相关问题
- 结构体字节对齐问题
- CAN 总线的仲裁机制,优先级问题
- 讲讲 FreeRTOS(任务调度,优先级机制)
- 队列和栈的区别
- 手撕代码:猴子吃桃
六
嵌入式软件工程师(西安)
0812(投递) -> 0824(一面)-> 0828(一面通过)-> 0910(线下二三面)
- 自我介绍
- 项目介绍
- 变换器控制环是不是自己写的,介绍下思路?
- 前馈解耦控制中包含电网电压项吗,如果不加电网电压项会有什么影响?
- 中断频率设置的是多少?怎么优化中断服务函数执行速度?
- F28335 中 int 类型占几个字节?
- 多进程操作需要注意哪些问题?临界资源有哪些?
- 局部变量与全局变量的存储位置分别是什么?
- 静态全局变量赋初值和不赋值有什么区别?
- 反问环节
- 嵌入式工作方向?(分为两个,DSP 控制算法或者偏底层车机系统)
- 面试一共会有几轮?(三轮)
七
- 自我介绍
- 项目介绍(只问了智能车比赛)
- 比赛难度?
- 获奖情况?
- 电感采集?
- 说说采样频率,单片机如何采集到信息的?
- 手撕字符串反转:“abcdefg -> gfedcba” ?
- 为什么用静态函数?什么地方用?
- 反问
- 入职有学习期吗?
八
30mins
- 自我介绍
- 实习项目拷打(相关度较高)
- 介绍 C++ 多态?
- C++ static 作用?
- 介绍 C++ 堆栈?
- 函数的行参为什么不放在寄存器,要放在栈里?
- 反问
九
0809(投递) -> 0809(测评) -> 0908(一面)
- 项目介绍
- Windows 操作系统和 SYS/BIOS 的区别?
- Linux 系统、计算机网络了解吗?
- 怎么看待将你临时借调到其他部门?
- 项目中遇到的困难?
十
- volatile 的作用?
- 选择题:数组指针
- 代码题:联合体
十一
- 讲一讲 UART/I2C/SPI/CAN的区别?
- 用过哪些 I2C 器件?
- 有硬件设计经验?你做过什么?
- 学过 PLC?用过哪些 PLC? 梯形图和 ST 都熟悉?
- 你知不知道汇川是做什么的?)
- 项目相关
- 反问
- 一面多久出结果?
2、一面(30min)- 20240729
- C 语言编译的过程
预处理 -> 编译 -> 汇编 -> 链接
*p++
和(*p)++
区别
*p++
返回指针p
指向的元素值,指针p
指向下一个元素,地址++
(*p)++
返回指针p
指向的元素值,并将该元素值加一,值++
- 编程题(三道题均为真题,但面试只会手撕一道)
有 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;
}
- 你都使用过 MCU 的哪些外设,挑一个你最熟悉的讲一讲?
- 使用 I2C 获取的从机数据是怎么样的?
- Linux 启动过程是怎么样的?
- 堆栈溢出是什么?
- 内存对齐是什么?