2022嵌入式工程师面经(2023年1月更新)

收录了一些在牛客网著名企业嵌入式软件工程师的面筋

如有侵权,立马删除


阿里巴巴嵌入式工程师面经

嵌入式工程师的职位,电话面试的主要内容很多:

项目模式(产品/模块)
蓝牙芯片在产品中的作用(MCU,控制外部DSP或其他芯片;或只作为蓝牙模块)

蓝牙软件成品模式(固件模式,通过SPI烧录)

蓝牙协议栈的架构和分层

蓝牙协议栈与网络协议栈(4层架构或7层架构)的对比

蓝牙芯片(是否基于Linux或其他常用架构)

蓝牙软件的软件架构(event-driven类型的,而不是单片机那种大while循环的)

函数指针与指针函数分别是什么?用简单的代码表示出来

Linux内核的版本;操作系统任务切换的关键是什么(保存上个任务的上下文,加载下个任务的上下文)

总的来说,电话面试有难度,需要好好准备专业知识才能通过。


百度 嵌入式工程师 面经

一面 1h

1.问项目,还问了神经网络的算法。

2.栈和队列。

3.数组和链表。

4.static,vailate,const关键字。

代码:

1.去除字符串里面的空格。

2.合并两个链表,按顺序。

马上二面 1.5h

1.还问项目,问里面的难点,还问了一下本科的毕设,因为写在简历上。

2.malloc,在函数里定义一个很大的数组,应该直接定义还是用malloc?

3.也问了static关键字,函数里用static定义的变量,存在哪个区?

代码:

1.复制链表。

2.两数之和,leetcode第一题。

3.判断计算机是大端还是小端。

4.Linux使用多线程,实现软件定时功能。聊了很久,写了一点伪代码,最好在面试官引导下,说出来他想要的解决方法。

三面 30min

部门经理面试这样,技术问题没怎么问,大致介绍了项目,问了难点,怎么解决,平时怎么学习,未来职业规划,还问了一些场景问题,比如团队做项目,怎么效率更高,对小度音响有了解吗,认为研发技术上有哪些难点。


CVTE嵌入式工程师面经

一开始是在校园招聘,开始在他的官网上报名,然后进行在线笔试,笔试完之后如果通过,就会开放面试预约时间,cvte的笔试时间一公布,第二天就会要求去面试,面试是在第二天早上的三个时间段自由选择,然后从地铁站坐大巴出发去cvte总部面试。

面试由三个部分组成,第一部分自我介绍,第二部分面试官提问,第三部分编程题。

感觉面试官似乎没有看我的简历的样子,什么项目也不问,从我的自我介绍出发,了解到我懂C、C++、C51,然后就开始问我相关的技术问题,他问的很多问题都可以从百度面试题找到,很常见。如C的话就会问define和const的区别等等,C++的话就问虚函数,构造函数等等,51的话就问中断函数这些东西。但是由于准备得不够充分,虽然答得感觉还不错,但每个点只能答上一两点回答不充分,让面试官见笑了。最后出了一道编程题,感觉跪在编程题上了,是一道关于字符串输入的一道编程题。由于我编程基础比较弱,也就感觉跪了


华为OD 嵌入式开发工程师 面经(一面)

机试

这一关主要在牛客网上面多刷题就可以了,机试我卡在80%的地方,不知道后面设的坑在哪里了,不过最后还是过了。

一面

主要是自我介绍,我围绕着我的简历做了自我介绍,关键叙述了一下我所做的几个项目节点,以及当前所负责的工作,之后面试官就围绕着简历中所写的内容,抽一两个项目来问具体的技术细节(记住简历是主体),着重问了tcp/ip的原理,状态位等在具体传输过程中的改变,还有一个OTA升级项目的细节问题,我觉得TCP的问题我回答的不太好,因为当时也是用的一些例程进行修改后得到的,虽然但是也用抓包工具具体查看过,每一包中状态位的改变,但是具体的原理没有深入研究过,之后面试官告诉我有一个手撕代码的环节,限时30分钟,题目是一个数组排序的问题,还好我大学期间做过先关的ACM试题,而且我还记得怎么做的,我十多分钟就写好了,确认没有问题后就发了过去,之后这次面试就到此结束了,没有询问其他问题。


DJI大疆【嵌入式软件工程师】技术面(凉经)

1.自我介绍。

2.linux中的线程一般是怎么调度的?

3.如果现在是一个单核的CPU,那么多个线程是按什么顺序去运行的?也就是线程的系统调度?

4.如果现在多个线程,怎么确定哪一个会先被执行?

5.能简单说一些你用过的stm32的一些芯片的配置吗?CPU主频,flash和RAM分别都是多大的?

6.你在stm32上都做过哪些开发?

7.你开发过哪些驱动吗?

8.你了解整个SPI的通信过程吗?SPI有几根线,分别是什么?你使用SPI的时候速率配置的是多少?

9.有使用过DMA吗?解释一下什么是DMA?

10.SPI有4种模式你知道是那4种模式吗?

11.你在开发调试过程中有遇到过哪些难以解决的问题可以分享一下吗?

12.你有做过一些比较大型的软件开发吗?就是一些比较大的功能需要做一些设计、分层的东西。

我说了其中一个项目分层驱动层、中间层和应用层。

13.中间层的设计你考虑了哪些因素?

14.进程通信有使用过一些锁和同步的东西吗?

15.多个进程在获取不到锁的时候会进入什么状态?

A:阻塞。

16.假设一个低优先的进程A获取先到锁,高优先级的进程B获取不到锁,那高优先级进程B的进行也会阻塞吗?

A:还是会阻塞。

17.那如果还有一个任务C,优先级介于A和B之间,那么C任务会去抢占CPU资源吗?

A:会的.

18.那这样导致B等待资源的时候会越来越长,这样的问题有方法可以解决吗?因为B的优先级才最高。

A:先把A优先级提高,等A释放后再给B。

19.用什么方式提高A的优先级?

RTOS有函数可以提高。

20.那么A的优先级需要提高到多少?

面试过后才突然想起来,从问题15-20,其实面试官想考的是“优先级反转问题”。但是我当时回答的磕磕绊绊,甚至有一些错误。

21.linux你是在用户态开发还是内核态开发?

22.在用户态开发中程序跑飞,出现段错误等情况,你通过什么方式去定位?

23.运行态的错误怎么调试?

24.知道程序分成那几个段吗?

25.堆和栈有什么区别?

26.你有什么需要问我的吗?

很遗憾,这是一篇凉经,不过经过大疆的面试后我总结了很多经验,对后续的面试也有很大帮助。


CVTE-嵌入式工程师 面经

面试的是cvte提前批嵌入式工程师单片机方向,网上申请后先做笔试题,20多道单选和2道编程。两天后晚上面试官打电话过来表示笔试通过并打算当场找我谈谈技术,我将时间换到下午进行面试。

面试时,面试官刚开完会,仍然是电话面试,首先是自我介绍,然后挖介绍中的两个项目,随后对我的项目提了一些改进的要求,问我如何实现,我这个部分答的不好。随后就是问

1.程序设计上,如何使用中断方式代替你原来的查询方式

2.C语言指针

3.静态存储和动态存储区别及引申

4.IIC和SPI区别,UART奇偶校验

5.队列,栈,二叉数介绍

6.平时如何进行嵌入式学习的C语言,数据结构的一些比较基础知识,以及在项目中用到的接口协议如IIC,UART等,

大部分回答上来了,然后问了一些学习方法问题。

随后反问环节,全程大概45分钟左右。


华为电子硬件工程师面经

最开始网申,之后会有一个测评,性格测试,接着过了收到一个硬件(通用)在线测试题,覆盖的内容很广,硬件方面的都沾边,包含有嵌入式、数字、模拟、射频,还有示波器的一些使用和注意,但都是很基础的东西,课堂上都学过的。

测评过了收到了面试邀约,地点在成都研究所,面试了2轮,第一轮面完后等了一会面2轮,第一轮问的都是简历中项目的问题,偶有延伸,第二轮是综合面试,会找简历中项目,更多的是和你了解家庭情况,工作地点的选择,和个人想法之类的,还包括了父母的工作,是否是独生等。


华为电子硬件工程师面经

一面:自我介绍,简历上比赛相关的问题,简历上项目项目相关的问题,有没有做过数字电路方面的东西,项目状态。问一下会的仿真软件PCB板之类的、讲一个虚构的物品研制过程(应该算研制,算不上研发感觉)、讲一下公司具体情况让画一个DC/DC电路和用STM32驱动蜂鸣器的电路、提问。

二面:自我介绍,项目相关的问题,采集的信号类型,干扰源有哪些?怎么处理的?做的几层板,本科和研究生课程有哪些。为什么选择硬件开发,而不是做机械。为什么不做嵌入式软件。兴趣爱好,家庭情况,个人情况。

总的来说,很人性化体验感很不错的公司,第二天HR面了收到口头offer了。


海尔集团(海尔智家)嵌入式硬件工程师面经

首先打个差评,海纳云你不收人就明说,软硬件嵌入式工程师岗位标准那么低,结果我简历全挂,你清高。

海尔智家(彩电部门)嵌入式硬件工程师

面试时间相当短,不到十分钟,一共俩人,看起来一个是工程师一个主管或者hr,工程师心不在焉,另一个人就没听几句。

1.自我介绍

2.项目介绍

3.蓝桥杯比赛内容介绍

4.二极管原理……

5.给个题目,让下午做,当天交:做一个带取样电阻反馈的DC-DC降压控制电路,要求写出基本工作原理,推导PWM占空比和取样电阻计算公式

6.反问:培训内容、工作地点(海尔工业园八号门附近)

当天晚上写完的,第二天短信来了,挂了,呵。


中兴硬件测试工程师面经

面试了中兴的专业面试(一面)。由于是我提前批投递简历后的第一次面试,处女面之前都有一些紧张。提前两天的晚上发了面试链接的邮件,确认时间。收到邮件后,我先提前在脑中回顾了自己的项目经历。

面试安排在上午,可能那边面试官网不是很好,耽搁了一会。进入面试后,首先让我自我介绍。简单的介绍了自己研究生阶段的项目以及自己承担的任务。面试官问是否有做过电路相关的项目经验,我说本科毕设的时候做过锁频环的设计,主要介绍了几个模块。接着面试官问,能否说一下环形振荡器的工作原理,我主要介绍了两种,分别是单端延迟单元和伪差分延迟单元构成的vco,讲了一下它俩的区别。然后问是否有软件开发的经历,我说本科做过嵌入式竞赛,关于图像处理的,因为这些项目隔得有些久了,我也只能说个大概。然后问我,在你的项目中发挥了什么作用,我简要说了一下我的任务和对项目进展的帮助。另外还问了一下我的成绩,以及为什么要投测试岗位。本来中间面试官想问一下一个接口的,因为我没有接触过,就说不了解,他提了三个接口,我说我可能对USB接口比较熟悉,然后他问我USB的最快传输速率是多少,我直接答了不知道。。。然后就没有问我与项目无关的问题了。最后他问我有什么问题要问他吗,我主要问了一下培训和晋升机制。

全程20多分钟,面试官还算温和,面试感觉还可以,最后面试官还和我抱歉,说是因为网不好,耽误了我的时间,感觉很有礼貌。第一次面试,把自己的项目理了一遍,虽然感觉提前批过的几率不大,嘿嘿。


美团秋招嵌入式笔试编程题

1烤串

题目描述:

小团想要自己来烤串!不过在烤串之前,需要串好烤串。小团有n个荤菜和n个素菜,他想按顺序分别一个荤菜一个素菜串起来,想请你帮他串好!

给出两个长度分别为n的仅包含小写英文字母的串A和B,分别代表荤菜和素菜的种类(用字母来表示菜的种类)。请你以从左到右的顺序依次串好他们!例如对于荤菜串A1A2…An

和素菜串B1B2…Bn,串好应该是A1B1A2B2…AnBn

输入描述

第一行一个正整数n,表示烤串长度

第二行为一个长度为n的字符串A,表示荤菜按次序都是哪些菜。

第三行为一个长度为n的字符串B,表示素菜按次序都是哪些菜。

对于80%的数据,n≤1000

对于20%的数据,n≤50000

对于所有数据,A和B为仅包含小写英文字母的字符串。

输出描述

输出一行,包含2n个字符串表示串好的烤串。

#include <bits/stdc++.h>

using namespace std;

int main() {
    
    
  int n; cin >> n;
  string a, b;
  cin >> a >> b;
  string ans;
  for (int i = 0; i < n; ++i) {
    
    
    ans += a[i];
    ans += b[i];
  }
  cout << ans << endl;
  return 0;
}

2定位

小团在地图上放了三个定位装置,想依赖他们来进行定位!

小团的地图是一个n×n的一个棋盘,他在(x1,y1),(x2,y2),(x3,y3) xi,yi ∈ Z ∩ [1,n] 这三个位置分别放置了一个定位装置(两两不重叠)。

然后小团在一个特定的位置(a,b)a,b ∈ Z ∩ [1,n]放置了一个信标。每个信标会告诉小团它自身到那个信标的曼哈顿距离,即对i=1,2,3 小团知道(|xi-a|+|yi-b|),

现在小团想让你帮他找出信标的位置!注意,题目保证最少有一个正确的信标位置。

因为小团不能定位装置确定出来的信标位置是否唯一,如果有多个,输出字典序最小的那个。(a,b)的字典序比(c,d)小,当且仅当 a<c或者a==c∧b<d

第一行一个正整数n,表示棋盘大小。

第二行两个整数,分别表示x1与y1,即第一个定位器的位置。

第三行两个整数,分别表示x2与y2,即第二个定位器的位置。

第四行两个整数,分别表示x3与y3,即第三个定位器的位置。

第五行三个整数,分别表示第一、二、三个定位器到信标的曼哈顿距离。第i个定位器到信标的曼哈顿距离即(|xi-a|+|yi-b|)

数字间两两有空格隔开,对于所有数据, n≤50000, 1≤xi,yi≤n

#include <bits/stdc++.h>

using namespace std;

#define all(x) x.begin(), x.end()

pair<int, int> op(int x, int y, int dx, int dy, int t) {
    
    
  switch(t) {
    
    
    case 0: return make_pair(x+dx, y+dy);
    case 1: return make_pair(x-dx, y+dy);
    case 2: return make_pair(x+dx, y-dy);
    case 3: return make_pair(x-dx, y-dy);
  }
  return make_pair(1, 1);
}

int main() {
    
    
  int n; cin >> n;
  vector<int> xx(3), yy(3), dd(3);
  set<pair<int, int>> ans;
  for (int i = 0; i < 3; ++i) {
    
    
    cin >> xx[i] >> yy[i];
  }
  for (int i = 0; i < 3; ++i) cin >> dd[i];

  for (int i = 0; i < 3; ++i) {
    
    
    set<pair<int, int>> nloc;
    set<pair<int, int>> validl;
    int d = dd[i], x = xx[i], y = yy[i];
    for (int dx = 0; dx <= d; ++dx) {
    
    
      int dy = d - dx;
      for (int t = 0; t < 4; ++t) {
    
    
        pair<int, int> co = op(x, y, dx, dy, t);
        int nx = co.first, ny = co.second;
        if (nx > 0 && nx <= n && ny > 0 && ny <= n) {
    
    
          validl.emplace(nx, ny);
        }
      }
    }
    if (ans.empty()) {
    
    
      ans = move(validl);
    } else {
    
    
      set_intersection(all(ans), all(validl), inserter(nloc, nloc.begin()));
      ans = move(nloc);
    }
  }

  cout << ans.begin()->first << " " << ans.begin()->second << endl;
  return 0;
}

3最高效率的复习

题目描述

小美将要期中考试,有n道题,对于第i道题,小美有pi的几率做对,获得ai的分值,还有(1-pi)的概率做错,得0分。

小美总分是每道题获得的分数。

小美不甘于此,决定突击复习,因为时间有限,她最多复习m道题,复习后的试题正确率为100%。

如果以最佳方式复习,能获得期望最大总分是多少?

输入n、m

接下来输入n个整数,代表pi%,为了简单期间,将概率扩大了100倍。

接下来输入n个整数,代表ai,某道题的分值

输出最大期望分值,精确到小数点后2位

输入描述

2 1

89 38

445 754

输出描述

1150.05

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
int main() {
    
    
  int n, m;
  cin >> n >> m;
  vector<ll> p(n), a(n);
  for (auto& e : p) cin >> e;
  for (auto& e : a) cin >> e;
  for (int i = 0; i < n; ++i) {
    
    
    p[i] *= a[i];
  }
  for (int i = 0; i < n; ++i) {
    
    
    a[i] = a[i] * 100 - p[i];
  }
  sort(a.begin(), a.end(), greater<ll>());
  ll ans = 0;
  for (int i = 0; i < n; ++i) {
    
    
    ans += p[i];
  }
  for (int i = 0; i < min(n, m); ++i) {
    
    
    ans += a[i];
  }
  double ret = (double) ans / 100.;
  cout << fixed << setprecision(2) << ret << endl;
  return 0;
}

4拟合

题目描述

小团生日收到妈妈送的两个一模一样的数列作为礼物!他很开心的把玩,不过不小心没拿稳将数列摔坏了!现在他手上的两个数列分别为A和B,

长度分别为n和m。小团很想再次让这两个数列变得一样。他现在能做两种操作,操作一是将一个选定数列中的某一个数a改成数b,

这会花费|b-a|的时间,操作二是选择一个数列中某个数a,将它从数列中丢掉,花费|a|的时间。小团想知道,他最少能以多少时间将这两个数列变得再次相同!

输入描述

第一行两个空格隔开的正整数n和m,分别表示数列A和B的长度。

接下来一行n个整数,分别为A1 A2…An

接下来一行m个整数,分别为B1 B2…Bm

对于所有数据,1≤n,m≤2000, |Ai|,|Bi|≤10000

输出描述

输出一行一个整数,表示最少花费时间,来使得两个数列相同。

#include <bits/stdc++.h>

using namespace std;
using LL = long long;

int main() {
    
    
    freopen("test.txt", "r", stdin);
    ios::sync_with_stdio(false);
    int n, m;
    cin >> n >> m;
    vector<int> a(n), b(m);
    for (int i = 0; i < n; ++i) {
    
    
        cin >> a[i];
    }
    for (int i = 0; i < m; ++i) {
    
    
        cin >> b[i];
    }
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
    for (int i = 1; i < n + 1; ++i) {
    
    
        dp[i][0] = dp[i - 1][0] + abs(a[i - 1]);
    }
    for (int i = 1; i < m + 1; ++i) {
    
    
        dp[0][i] = dp[0][i - 1] + abs(b[i - 1]);
    }
    for (int i = 1; i < n + 1; ++i) {
    
    
        for (int j = 1; j < m + 1; ++j) {
    
    
            if (a[i - 1] == b[i - 1]) dp[i][j] = dp[i - 1][j - 1];
            else dp[i][j] = min(abs(a[i-1] - b[j-1]) + dp[i - 1][j - 1], min(dp[i - 1][j] + abs(a[i - 1]), dp[i][j - 1] + abs(b[j - 1])));
        }
    }
    cout << dp[n][m];
    return 0;
}

5多项选择题

进程间的通信方式有哪些?


迈瑞嵌入式硬件工程师面经( 深圳南山 )

面试的使硬件工程师的暑期实习生,由于自己的专业是机械电子工程,主要擅长的也是机械设计方面,迈瑞当时比较缺硬件工程师的实习生,自己恰巧在简历里写到一部分硬件方面的项目经历,被推到了硬件工程师实习生面试,过程不太理想。

1.首先开场是自己进行一个简单的自我介绍;

2.面试官问了一些简历上写的项目经历;

3.面试官让解释一下自己项目中机械设计方面工作的细节;

4.说一下项目过程中自己认为比较有挑战的地方;

5.理想的工作状态是什么样的。

总的来说,结果不理想,但是可以学到一些硬件的东西,还是nice的

猜你喜欢

转载自blog.csdn.net/weixin_43233219/article/details/128663460