嵌入式面经111题答案汇总(含技术答疑)_3大嵌入式项目源码分享—嵌入式Linux项目

111道嵌入式面试题答案汇总专栏链接(承诺免费技术答疑) --> 《嵌入式/C++面试题解析大全》

1、简介

本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业工作经验,整理超全面111道嵌入式面试题目答案解析(承诺提供专栏内容免费技术答疑),本专栏内容主要有:

  • 面试过程口头提问的问题答案汇总,承诺提供免费技术答疑,以及其他的交流,如要怎么入门c++,简历如何写,算法题如何刷等等,实现校招全陪伴!

2、项目经验

如果你找的是单片机,那就只要单片机的项目,如果你是嵌入式linux,你可以最多写一个单片机项目,其他都要写嵌入式linux的项目。

如果你找嵌入式linux应用开发工作,也可以写linux驱动项目,但必须有一个应用层的项目。

如果你找嵌入式linux驱动开发项目,最好也要有一个应用层项目,突出你对多进程多线程那些知识点有所了解。

项目数量2-4个,此时就需要靠过往的经验积累了,如果确实没有项目,可以向身边做嵌入式的同学请教一下,快速掌握,同时也分享几个项目供参考:

2.1 基于人脸属性识别的嵌入式电影推荐系统(嵌入式人工智能项目、可提供源码)

1)情况:为解决“信息过载”问题,提出基于人脸属性识别的广告推荐系统。

2)目标:独立负责,摄像头捕捉人脸并预测年龄、性别,显示屏可输入用户职业,系统根据此三大信息推荐8部电影并在显示屏显示。

3)行动:搭建RK3399开发板开发环境,通过OpenCV获取摄像头图像,Dlib检测人脸,采用WRN神经网络预测年龄、性别,结合基于用户的协同过滤以及决策树模型进行电影推荐。使用PyQt5设计人机交互界面实现职业获取和电影信息显示。

4)成果:在RK3399开发板可实时获取被推荐人年龄、性别、职业,据此推荐8部电影并将其电影名字和海报图显示在屏幕上。

alt

2.2 基于Linux6818开发板的视频播放器(最好的入门项目,可提供源码)

本项目基于嵌入式linux6818开发板,制作一个音视频播放器。开发板移植安装好mplayer,我提前下载了5个mv,使用mplayer命令分别在5个视频里截取某一秒的画面,共得到5张图片,也就是所谓的视频缩略图,将5个缩略图显示在显示屏的右边,当作是播放列表,支持上下滑动浏览播放列表,点击其中某个图片,即可播放对应视频,并实现播放器常见的开始、停止、上下首、音量调节、进度调节、全屏、静音等功能。使用到多进程技术:有名管道、消息队列、信号量;使用到多线程技术:互斥锁、条件变量。

alt

2.3 基于Linux6818开发板的智能车库项目(进阶项目,可提供源码)

没错,也是粤嵌6818开发板,搭配触摸屏、USB摄像头、音响,模拟实现真实场景中的智能车库常见功能:

  • 实时视频监控
  • 自动识别车牌
  • 自动语音播报
  • 停车计费

需要使用到V4L2子系统,FrameBuffer子系统、OpenCV、多进程多线程编程、ALSA子系统、智能语音引擎、网络编程、数据库编程等。

alt

3、嵌入式111道高频面试题

八股文不在于量多,熟悉以下111道题就够啦

第一章 进程线程

1.1 进程线程的基本概念

  • 1.1.1 什么是进程,线程,彼此有什么区别⭐⭐⭐⭐⭐
  • 1.1.2多进程、多线程的优缺点⭐⭐⭐⭐
  • 1.1.3什么时候用进程,什么时候用线程⭐⭐⭐
  • 1.1.4多进程、多线程同步(通讯)的方法⭐⭐⭐⭐⭐
  • 1.1.5进程的空间模型⭐⭐⭐⭐
  • 1.1.6进程线程的状态转换图 什么时候阻塞,什么时候就绪⭐⭐⭐
  • 1.1.7父进程、子进程的关系以及区别⭐⭐⭐⭐
  • 1.1.8什么是进程上下文、中断上下文⭐⭐
  • 1.1.9一个进程可以创建多少线程,和什么有关⭐⭐

1.2 并发,同步,异步,互斥,阻塞,非阻塞的理解

  • 1.2.1什么是线程同步和互斥⭐⭐⭐⭐⭐
  • 1.2.2线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐⭐
  • 1.2.3并发,同步,异步,互斥,阻塞,非阻塞的理解⭐⭐⭐⭐⭐

1.3 孤儿进程、僵尸进程、守护进程的概念

  • 1.3.1基本概念⭐⭐⭐⭐⭐
  • 1.3.2如何创建守护进程:⭐⭐
  • 1.3.3正确处理僵尸进程的方法⭐⭐⭐⭐

第二章 C/C++高频面试题

2.1 c和c++区别、概念相关面试题

  • 2.1.1 new和malloc的区别⭐⭐⭐⭐⭐
  • 2.1.2 malloc的底层实现⭐⭐⭐⭐
  • 2.1.3在1G内存的计算机中能否malloc(1.2G)?为什么?⭐⭐
  • 2.1.4指针与引用的相同和区别;如何相互转换?⭐⭐⭐⭐⭐
  • 2.1.5 C语言检索内存情况 内存分配的方式⭐⭐⭐
  • 2.1.6 extern”C” 的作用⭐⭐⭐
  • 2.1.7头文件声明时加extern定义时不要加 因为extern可以多次声明,但只有一个定义⭐⭐⭐⭐
  • 2.1.8函数参数压栈顺序,即关于__stdcall和__cdecl调用方式的理解⭐⭐⭐
  • 2.1.9重写memcpy()函数需要注意哪些问题⭐⭐
  • 2.1.10数组到底存放在哪里⭐⭐⭐
  • 2.1.11 struct和class的区别 ⭐⭐⭐⭐⭐
  • 2.1.12 char和int之间的转换;⭐⭐⭐
  • 2.1.13 static的用法(定义和用途)⭐⭐⭐⭐⭐
  • 2.1.14 static的用法(定义和用途)⭐⭐⭐⭐⭐
  • 2.1.15const常量和#define的区别(编译阶段、安全性、内存占用等) ⭐⭐⭐⭐
  • 2.1.16 volatile作用和用法 ⭐⭐⭐⭐⭐
  • 2.1.17有常量指针 指针常量 常量引用 没有 引用常量⭐⭐⭐
  • 2.1.18没有指向引用的指针,因为引用是没有地址的,但是有指针的引用⭐⭐⭐
  • 2.1.19c/c++中变量的作用域⭐⭐⭐⭐⭐
  • 2.1.20 c++中类型转换机制?各适用什么环境?dynamic_cast转换失败时,会出现什么情况?⭐⭐⭐

2.2 继承、多态相关面试题 ⭐⭐⭐⭐⭐

  • 2.2.1继承和虚继承 ⭐⭐⭐⭐⭐
  • 2.2.2多态的类,内存布局是怎么样的 ⭐⭐⭐⭐⭐
  • 2.2.3被隐藏的基类函数如何调用或者子类调用父类的同名函数和父类成员变量 ⭐⭐⭐⭐⭐
  • 2.2.4多态实现的三个条件、实现的原理 ⭐⭐⭐⭐⭐
  • 2.2.5对拷贝构造函数 深浅拷贝 的理解 拷贝构造函数作用及用途?什么时候需要自定义拷贝构造函数?⭐⭐⭐
  • 2.2.6析构函数可以抛出异常吗?为什么不能抛出异常?除了资源泄露,还有其他需考虑的因素吗?⭐⭐⭐
  • 2.2.7什么情况下会调用拷贝构造函数(三种情况)⭐⭐⭐
  • 2.2.8析构函数一般写成虚函数的原因⭐⭐⭐⭐⭐
  • 2.2.9构造函数为什么一般不定义为虚函数⭐⭐⭐⭐⭐
  • 2.2.10什么是纯虚函数⭐⭐⭐⭐⭐
  • 2.2.11静态绑定和动态绑定的介绍⭐⭐⭐⭐
  • 2.2.12 C++所有的构造函数 ⭐⭐⭐
  • 2.2.13重写、重载、覆盖的区别⭐⭐⭐⭐⭐
  • 2.2.14成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?⭐⭐⭐⭐
  • 2.2.15如何避免编译器进行的隐式类型转换;(explicit)⭐⭐⭐⭐

第三章 网络编程

3.1 TCP UDP

  • 3.1.1 TCP、UDP的区别 ⭐⭐⭐⭐⭐
  • 3.1.2 TCP、UDP的优缺点⭐⭐⭐
  • 3.1.3 TCP UDP适用场景⭐⭐⭐
  • 3.1.4 TCP为什么是可靠连接⭐⭐⭐⭐
  • 3.1.5典型网络模型,简单说说有哪些;⭐⭐⭐
  • 3.1.6 Http1.1和Http1.0的区别⭐⭐⭐
  • 3.1.7 URI(统一资源标识符)和URL(统一资源定位符)之间的区别⭐⭐

3.2 三次握手、四次挥手

  • 3.2.1什么是三次握手⭐⭐⭐⭐⭐
  • 3.2.2为什么三次握手中客户端还要发送一次确认呢?可以二次握手吗?⭐⭐⭐⭐
  • 3.2.3为什么服务端易受到SYN攻击?⭐⭐⭐⭐
  • 3.2.4什么是四次挥手⭐⭐⭐⭐⭐
  • 3.2.5为什么客户端最后还要等待2MSL?⭐⭐⭐⭐
  • 3.2.6为什么建立连接是三次握手,关闭连接确是四次挥手呢?⭐⭐⭐⭐

第四章 常见算法

4.1 排序算法

  • 4.1.1各种排序算法的时间空间复杂度、稳定性⭐⭐⭐⭐⭐
  • 4.1.2各种排序算法什么时候有最好情况、最坏情况(尤其是快排) ⭐⭐⭐⭐
  • 4.1.3冒泡排序⭐⭐⭐⭐
  • 4.1.4选择排序⭐⭐⭐⭐
  • 4.1.5插入排序⭐⭐⭐⭐
  • 4.1.6希尔排序⭐⭐⭐⭐
  • 4.1.7归并排序⭐⭐⭐⭐
  • 4.1.8快速排序⭐⭐⭐⭐⭐
  • 4.1.9快排的partition函数与归并的Merge函数⭐⭐⭐

4.2 STL库相关

  • 4.2.1 vector list异同⭐⭐⭐⭐⭐
  • 4.2.2 vector内存是怎么增长的vector的底层实现⭐⭐⭐⭐
  • 4.2.3 vector和deque的比较⭐⭐⭐⭐
  • 4.2.4为什么stl里面有sort函数list里面还要再定义一个sort⭐⭐⭐
  • 4.2.5 STL底层数据结构实现⭐⭐⭐⭐
  • 4.2.6利用迭代器删除元素会发生什么?⭐⭐⭐⭐
  • 4.2.7 map是如何实现的,查找效率是多少⭐⭐⭐⭐⭐
  • 4.2.8几种模板插入的时间复杂度 ⭐⭐⭐⭐⭐

第五章 Linux操作系统常见面试题

5.1 Linux内核相关

  • 5.1.1 Linux内核的组成⭐⭐
  • 5.1.2用户空间与内核通信方式有哪些?⭐⭐⭐⭐⭐
  • 5.1.3系统调用read()/write(),内核具体做了哪些事情⭐⭐
  • 5.1.4系统调用的作用⭐⭐⭐⭐⭐
  • 5.1.5内核态,用户态的区别⭐⭐⭐⭐⭐
  • 5.1.6 bootloader内核 根文件的关系⭐⭐⭐⭐
  • 5.1.7 Bootloader多数有两个阶段的启动过程:⭐⭐⭐
  • 5.1.8 linux的内核是由bootloader装载到内存中的?⭐⭐⭐
  • 5.1.9为什么需要BootLoader⭐⭐⭐⭐
  • 5.1.10 Linux内核同步方式总结⭐⭐⭐⭐
  • 5.1.11为什么自旋锁不能睡眠 而在拥有信号量时就可以?⭐⭐⭐⭐
  • 5.1.12 linux下检查内存状态的命令⭐⭐⭐

5.2 其他操作系统常见面试题

  • 5.2.1大小端的区别以及各自的优点,哪种时候用⭐⭐⭐⭐⭐
  • 5.2.2 一个程序从开始运行到结束的完整过程(四个过程)⭐⭐⭐⭐⭐
  • 5.2.3什么是堆,栈,内存泄漏和内存溢出?⭐⭐⭐⭐
  • 5.2.4堆和栈的区别⭐⭐⭐⭐⭐
  • 5.2.5死锁的原因、条件 创建一个死锁,以及如何预防⭐⭐⭐⭐⭐
  • 5.2.6硬链接与软链接的区别;⭐⭐⭐⭐⭐
  • 5.2.7虚拟内存,虚拟地址与物理地址的转换⭐⭐⭐⭐
  • 5.2.8计算机中,32bit与64bit有什么区别⭐⭐⭐
  • 5.2.9中断和异常的区别⭐⭐⭐⭐⭐
  • 5.2.10中断怎么发生,中断处理大概流程⭐⭐⭐⭐
  • 5.2.11 Linux 操作系统挂起、休眠、关机相关命令⭐⭐
  • 5.2.12数据库为什么要建立索引,以及索引的缺点⭐⭐

第六章 单片机常见面试题

  • 6.1 CPU 内存 虚拟内存 磁盘/硬盘 的关系⭐⭐⭐
  • 6.2 CPU内部结构⭐⭐⭐⭐
  • 6.3 ARM结构处理器简析 ⭐⭐
  • 6.4波特率是什么,为什么双方波特率要相同,高低波特率有什么区别;⭐⭐⭐⭐
  • 6.5arm和dsp有什么区别⭐⭐
  • 6.6 ROM RAM的概念浅析⭐⭐⭐
  • 6.7 IO口工作方式:上拉输入 下拉输入 推挽输出 开漏输出⭐⭐⭐⭐
  • 6.8扇区 块 页 簇的概念⭐⭐⭐⭐
  • 6.9简述处理器在读内存的过程中,CPU核、cache、MMU如何协同工作?画出CPU核、cache、MMU、内存之间的关系示意图加以说明⭐⭐
  • 6.10请说明总线接口USRT、I2C、USB的异同点(串/并、速度、全/半双工、总线拓扑等)⭐⭐⭐⭐⭐
  • 6.11什么是异步串口和同步串口⭐⭐⭐⭐⭐
  • 6.12 I2C时序图⭐⭐⭐⭐⭐

alt

高级系列专栏:

安卓(安卓系统开发也要掌握)

嵌入式

#嵌入式##嵌入式笔面经分享##嵌入式测试,嵌入式开发##嵌入式面经##许乔丹嵌入式面经#
全部评论
谢谢大哥
1 回复 分享
发布于 08-15 21:43 湖南

相关推荐

一、学习方向选择以下仅代表笔者个人看法:嵌入式软件总体分为linux和mcu方向。这两个方向的应用场景不同,导致无法在同一份工作中既做Linux,又做mcu。因此,如果在时间不充裕的情况下,大家根据自身情况挑一个方向去学习就够了。mcu方向(也称为嵌入式软硬件方向)更专注于软硬件结合,也就是说除了软件部分之外,还需要懂硬件。如果在软件和硬件分的没那么开的公司,作为一名嵌入式软件工程师,不仅要自己写代码,还需要自己画原理图,画PCB。在软硬件分开的情况下,基本要求是要能看的懂电路原理图,这也是大多数转行者很容易忽视的点。linux方向由于岗位较少,通常需要驱动/内核/应用一起做,仅有部分公司或者原厂才会放出单一的岗位出来,如单独的linux驱动岗位,内核/应用岗位等,这个方向比较偏软件一点。但由于岗位较少,门槛也就稍微高一些。二、mcu方向学习路线0基础的同学建议按照步骤走(再次重申是个人看法,如果你觉得不对,就不要看下去了):1、掌握基本电路知识,重点主要为电容、电感及滤波电路,还有一个傅立叶变换(可以看刘陈版本的电路分析基础这本书或者是b站进行学习)2、模电(主要掌握二极管、稳压管、三极管、mos管、放大电路、运算放大器、反馈电路);笔者个人推荐的书籍是黄丽亚的第三版模拟电子技术基础,学完前7章就够了。当然,也可以选择其他版本的,看个人喜好。3、数电(主要掌握进制转换,反码补码、逻辑电路、触发器、寄存器、AD转换及存储器知识),推荐书籍为华中科技大学的电子技术基础(数字部分)。上述三步就是为了打牢硬件基础,能看懂电路原理图。4、接下来学习一款EDA工具的使用,不要再去学嘉立创了!企业里边只有三大EDA工具:Altium Designer/Candence/Pads,任意挑一个去学习。个人比较推荐学习AD,可以在b站上看凡亿教育的课程进行学习。5、学习C语言,个人还是推荐谭浩强红色的那本高校书籍,当然也有其他优秀课程,大家可以自行选择。C语言的学习是一个持续加深的过程,前期先掌握基础就行,需要学习的是前1-7章,第8章的指针变量/数组指针,第9章的结构体/共用体/枚举/typedef。6、学习stm32,不要再浪费时间去学51老古董了。个人推荐正点原子,资料很充足,按照资料学基本就够了。同时一定要学标准库,前期不要把精力浪费在学hal库上,hal库等后边自己看一下就行。学习方法是买一款开发板(F1/F4都可以),跟着资料一步一步学,掌握基本常用外设如串口/GPIO/定时器/中断/PWM/输入捕获/LCD/ADC/IIC/SPI/485/CAN/IAP等。ps:学习过程中不要只看,一定要做!看懂了不等于你掌握了,毕竟实践是检验真理的唯一标准!7、做完上述步骤,恭喜你已经打好基础了,进一步继续深入学习c语言的提高部分,把前边说的第8章的二维指针/数组指针/指针数组等等指针的高阶用法掌握,以及动态内存分配函数等;还有第9章的链表;此处笔者推荐看人民出版社的c和指针一书,进行c语言的加深学习。这本书需要掌握如编译的底层原理/指针的高阶用法/递归函数/单向或者双向链表/预处理器等。8、完成c语言的进阶学习之后,开始学习stm32内核,这里推荐看CM3权威指南这本资料,主要看前9章内容,至少要知道寄存器组/PendSV/SVC/systick定时器等,为学习RTOS打好基础。9、开始学习RTOS,自行挑选一款rtos进行学习(ucos/freertos/rt-thread),笔者是同时学了ucos和free,个人比较推荐从ucos学起(也是正点原子的资料),毕竟资料比较多,底层原理讲的比较细,比如任哲老师的嵌入式实时操作系统原理及应用就是以ucosii进行讲解的。当然大家也可以选择其他的,这个阶段建议还是多看资料,少看课。因此笔者并没有什么推荐的课程。ps:到这一步要开始做32和rtos的项目了,做完项目以后就可以去投实习/秋招,这个程度已经够找工作了。10、学习常用数据结构:数组/堆/栈/链表/树/哈希表/队列,图不要求掌握,树学二叉搜索树就够,在弄清楚基本数据结构以后再去力扣上进行刷题,比如要知道栈不仅可以用数组实现,还可以用链表实现。ps:这一步想进大厂必不可少,毕竟面试都是要手撕的!11、学习RTOS源码,弄清楚任务调度/任务通信/时钟及延时/内存管理等。为什么要先去学习数据结构再回来看rtos源码,就是因为其源码中包含大量链表和队列的使用,如freertos中列表与列表项中涉及到双向链表的插入和删除操作,这样才能看得懂源码。ps:到这一步已经够卷了,笔者觉得不用担心找不到工作了。接下来说的东西可以入职以后再进行学习12、其他通用中间件的学习,如网络协议(mqtt/lwip协议等),选一个进行学习。还有图形库lvgl/ewmin等,也是选择一个进行学习。学习方法也是找资料,我依然用的是正点原子。13、学习代码版本管理工具git的使用,需要掌握常用命令,如克隆,提交,上传以及创建分支等。学习方法笔者推荐是看官网。三、linux方向学习路线linux方向笔者还在摸索中,因此就简单说一下1、先学会使用linux系统,学会Linux基本命令使用,学习方法推荐b站尚硅谷。2、学习gcc、make工具链的使用及makefile脚本。3、学习c++,主要掌握面向对象特性,如类和对象/继承/重载/多态/封装/虚函数/智能指针/动态内存等。推荐书籍为c++ primer第五版以及菜鸟编程网站。4、Linux应用编程,如进程/线程、文件io、网络编程等。推荐资料--正点原子。5、学习QT开发,推荐资料正点原子。6、Linux下的裸机开发(推荐买板子学习,如imx6ull;掌握常用外设以及CortexA处理器架构),推荐资料--正点原子或者韦东山。ps:学习linux驱动需要有电路原理图能力。7、Linux驱动开发(结束裸奔,上操作系统了, 包括移植uboot/linux内核/根文件系统等、掌握Linux三大类驱动,包括字符设备/块设备/网络设备驱动),同时需要掌握GDB调试。可以看到嵌入式两个方向的内容都非常多,因此大家选一个学,找工作足够了。本次讲解就到这里,感谢观看!
点赞 评论 收藏
分享
评论
4
33
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务