CVTE - 嵌入式软件开发工程师(Linux方向)- 面经(12)
-1、背景
职位:
嵌入式软件开发工程师(Linux方向)
项目:
2025 届校园招聘提前批
岗位职责:
嵌入式开发工程师会参与全球市场显示类产品的开发,工作包括了系统底层驱动的调试、相关功能模块的代码实现、用户交互设计和上层应用开发等内容。
- 负责全球市场显示类产品的系统设计、实现、优化与调试
- 负责产品需求分析,功能设计与代码编写
- 负责在嵌入式平台上的应用以及用户交互设计开发
- 负责客户反馈问题的处理
岗位要求:
- 有良好的编程基础,熟练掌握 C/C++ 语言
- 掌握操作系统、数据结构等软件开发必备知识
- 具有良好的团队协作、亲和力、乐意与人交往
- 有 Linux/Android 系统平台的开发经验者优先
时间线:
0701(投递) -> 0719(笔试) -> 0728(一面)-> 0801(二面)-> ✅
0、笔试
1、面经汇总
1.1、综合面试(HR面)
基本情况面试,不涉及技术知识,具体可看 [[#2、综合面试(10min)- 20240728]]
一
- 为什么选择这个岗位
- 最满意的项目,怎么实现
- 10-15 年职业规划
- 理想的工作和家庭状态
- 接受的工作时长
1.2、专业面试(技术面)
一
- static 关键字有什么作用
- final 关键字的作用
- 虚函数和程序函数的区别
- 内存划分
- mmap 的原理,映射到哪块区域
- 堆存的什么,如何扩展堆的内存大小
- 宏定义和函数
- C 和 C++ 的区别
- C 语言的文件操作,fopen 和 open 的区别
- C++ 的三大特性
- 重写和重载的区别
- 模板
- STL 容器,list 对应的数据结构
- C++ 中怎么使用 C 语言的库
- 大端存储小端存储
- 交叉编译原理,makefile
- 中断流程,区分硬中断和软中断
- I2C 原理,如何保证数据的准确性
- 串口通信,如何保证通信成功。波特率修改
- 进程和线程的区别
- 进程的创建和销毁
- 判断父进程与子进程
- 父进程比子进程先死,子进程会变成什么(没爸爸了,孤儿)
- 线程的创建和销毁
- Linux 操作系统常用指令
- 查看物理内存
- TCP 传输协议,客户端与服务端的编写流程
- listen 是阻塞的还是非阻塞的
- select
- 怎么保证客户端能够正确连接到服务端
- UDP 编程
- TCP 和 UDP 的区别
- 三次握手和四次挥手是什么流程
- 数组和链表的区别
- 判断环形链表
- 栈和队列的区别
- 判断循环队列是空的还是满的
- 排序算法例举
- 快速排序
- 介绍项目
- .ko 文件的加载与卸载
- 音频部分的开发做了什么工作
- 开发流程
- 音频编解码
- 项目开发完成后,是否存在一些遗留问题
- 本科生与研究生的生活是怎么过的
- 如何平衡研究工作与私下生活
- 未来发展
- 从事算法类的岗位和工作
- 工作地点和工作时间
- 是否忍受的长期加班的时间生活,怎么看加班10点以后常态化
- 工作内容和学到的内容以及期望的工作内容不匹配
- 手撕:给定一个字符串,将字符串中的每个单词逐个翻转
比如输入:
blue is sky the
输出:the sky is blue
输入:a good example!
输出:example! good a (如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个)。
- 遇到的新的技术难点怎么解决
- 反问
二
- 进程和线程的区别
- 共享内存的原理
- 谈一谈进程通信
- 哪些通信方式是单向的(管道和信号),哪些需要借助内核
- 中断的概念
- 中断有传参和返回值吗,为什么
- 串口数据帧格式
- Linux 的设备:字符设备、块设备、网络设备
- 手撕代码:求素数
- volatile
- 对待加班看法,职业规划等等
- Linux 的一些基本命令(ifconfig、touch、vim等)
三
- 自我介绍
- 三极管和 MOS 管如何识别
- 链表和数组的区别
- 常用的数据结构有哪些
- 一个物品开 3 个线程,100 个物品开多少个线程
- 什么是线程池、select 和 epoll 的区别
- GPIO 口配置分为那几种
- 如何处理按键误触
- 如何开一个新线程
- C 语言分配内存有几种方式
- C++ 分配内存
- new 和 malloc 区别
- 如何判断堆栈内存大小
- 如何证明函数栈大小
- 进程间通信的方式
- 用户态的函数向内核态调用主要有几种方式
- 什么是系统调用
- 排序算法的时间复杂度
- 内存比较吃紧用那种排序算法
- 什么是 shell 脚本
- Linux 中软连接和硬连接
- 在 Linux 中如何查找指定后缀的进程名称
- 解释一下 I2C 协议中止信号
- Socket 滑动窗口
- 一个服务端对应多个客户端机制
- 断点传输
- 手撕:C 语言实现链表的逆序排序不能用递归(可以用二分法实现)
四
- 自我介绍
- 你怎么理解嵌入式,嵌入式对你来说意味着什么
- 项目介绍
- 电容屏的驱动是自己写的吗,怎么写的
- 我看你第一个项目是偏应用层一点,为什么想要做底层
- 说一下 SPI 和 I2C 的时序以及特点、选用场景、区别
- 自电容和互电容
- 你在做项目的过程中有考虑过抗电磁干扰(抗静电干扰)
- 技术栈有哪些
- Linux 你常用什么命令,用的都熟吗
- 如果要你在 Linux 中使用命令找出 “xxx” 前缀的文件,该怎么找呢?
- 怎么查看当前所有进程、内存占用量怎么查看
- 我看你写过驱动,详细描述下驱动是咋写的呢
- 手写几个指针数组、数组指针、引用
- 常量指针和指针常量
- 共享屏幕,看 IDE 环境,看项目触摸驱动代码部分,询问是否使用联合体
- 反问:
- 什么时候出结果?(大概3、4天)
- 后续流程?(本轮面试通过要去公司实习一周再决定是否录用)
- 培养制度?
五
- 自我介绍
- 问做驱动还是应用
- LCD 驱动的编写过程(简历上的)
- 驱动的匹配机制
- Linux的启动过程
- 设备树
- 设备树是为了解决什么问题
- 输入子系统
六
2023.10
- 自我介绍
- 什么时候开始学 Linux 的
- 最近在看什么书
- 你是怎么学习 Linux 的
- 学了什么开发板
- 更倾向于驱动还是应用
- Uboot 之前是什么
- 开发板的启动流程是什么
- Uboot 中的步骤
- 你编写代码的流程是怎么样的
- C++ 移动构造函数和复制构造函数的区别
- 常用的 Linux 命令
- Linux find 命令所需要的参数,如果在 find 之后执行删除操作呢?
- 你有用过锁吗,用的最多的是什么锁,读写锁有了解过吗
- C++ 浅拷贝和深拷贝
- C++ 如何避免浅拷贝
- C++ 多态
- C++ vector/list/map 介绍一下异同
- C++ 创建一个类的时候,默认生成的函数是什么
- 如何创建一个线程?需要什么参数?
- 如何创建一个进程?
- 进程和线程的区别
- 进程在什么时候会崩溃
- 如何调试进程的崩溃
- 手撕:字符串转换为数字
七
- 自我介绍
- 项目介绍
- 编译运行过程中常用的调试手段
- 嵌入式开发有哪些特点,限制,有哪些需要注意的地方
- 传输 float 数据,怎么设计
- float 数据可以移位吗?
- 中断的概念和优缺点、什么是时候使用软中断
- 一个函数,在 main 和中断中都要同时调用,这个函数要做什么设计?
- 一个全局变量 a,在 main 和中断中要传递数据,这个变量要注意什么问题?
- volatile 的本质以及作用有哪些?
- 串口波特率有用过更大的传输速度吗? 串口传的数据包的格式?
- GPIO的工作模式有哪些?实际使用的例子举例说明
八
- Linux 和 Windows 的换行符有什么不同
- I2C 设备的地址多少位 (7/10)
- I2C 读时序
- 宏函数定义写一个交换数据 不能用 temp
- 宏定义写循环
- UART 怎么确定数据正确性
- TCP 中大端小端的问题
- 了解 Shell 脚本吗?写过什么?
- ABC 类网络分类
- 了解多线程多进程吗?怎么写多进程编程?
- 假如中断函数要返回一个值,怎么写?
- 用过 fgets 等读取文件的函数吗?
- open 函数传入什么参数?什么模式?参数怎么写?
- 有没有试过用 USB 等给 IO 设备等写数据?
- 给你一个不联网的电脑 怎么找关于 grep 的用法?
- TCP、UDP 异同?函数?
- I2C 的特点?速度?硬件软件 I2C 有什么异同?
- 中断要传入什么参数?中断可以有返回值吗?
- 堆栈的区别?内存不 free 会怎样?
- 若栈的长度较小有什么注意事项
- 程序还可以存放在哪里
- 链表和顺序表的区别?
- 怎么确定该用链表还是数组
- 反问
九
25分钟
- TCP/IP 协议讲一下
- 用过哪些基于 TCP/IP 协议的,例如抓包啥的?
- 项目介绍
- 了解哪些设计模式?
- Linux 内核空间与用户空间的区别?通信方式?
- Linux 中堆栈的区别?
- 回调函数了解吗?
- 了解哪些 Linux 驱动模型,讲一下?
- 讲一下外设总线,I2C、SPI、UART ?
- 内核同步机制有哪些?
十
- 怎么理解嵌入式,嵌入式的概念
- 写自己的驱动,做修改和功能怎么确保在目标板正常运行
- 编译运行过程中常用的调试手段
- 开发功能时,嵌入式开发有哪些特点,有哪些限制,有哪些需要注意的地方
- 除了串口,还了解哪些?
- 传输 float 数据,怎么设计,四个字节?
- 两边大小端不一致怎么办?
- float 数据可以移位吗?
- 中断的概念?
- 中断的优缺点是什么?
- 软中断的概念?写代码什么时候用软中断?
- 软中断和函数调用的区别?
- 一个函数,在 main 和中断中都要同时调用,这个函数要做什么设计?
- 一个全局变量 a,在 main 和中断中要传递数据,这个变量要注意什么问题?
- volatile 的本质以及作用有哪些?
- 串口波特率有用过更大的传输速度吗?
- 串口传的数据包的格式?是自己定义的吗?
- 串口发送数据量比较大的时候或者传输比较频繁的时候,怎么保证每个包的数据完整?
- GPIO 的工作模式有哪些?用过哪几种?
- I2C 需要几根线?分别是什么线?
- I2C 优势有哪些?
- I2C 总线可以挂多少个从设备?
十一
50 分钟左右
- 自我介绍
- 职业规划,以前在那家公司为什么不继续做
- 手撕:字符串分割,程序检错
pritnf()
底层实现原理,是如何打印到控制台上的new
和malloc
的区别(内存分配,分配位置,返回值类型等)- 数组和指针的区别
- Linux 下创建子进程的方式,创建进程的 API 函数
- 介绍下 Linux 下创建线程的方式,以及创建线程的 API 函数
- Linux 下的内核空间和用户空间有什么区别,内核空间为什么要和用户空间隔离
- ARM+Linux 的嵌入式开发板是如何启动的,Linux 是如何跑在 ARM 开发板上的
- Linux 中文件系统是如何启动的?挂载文件系统时步骤?如何挂载?
- U-boo t如何引导启动?
- 什么是多态?如何实现多态?
- 项目演示(问项目技术实现,算法原理)
- 反问
2、综合面试(10min)- 20240728
基本情况面试,无任何技术知识
- 还在学校?最近找工作进展如何?
- 都是投的嵌入式方向的工作吗?
- 为啥会选择嵌入式这个方向?
- 过往你经历过的一个最有技术难度或者挑战性的项目是什么?
- 当时遇到的具体难点是什么?
- 项目中你还有哪些遗憾吗?觉得还有能做的更好地方?
- 你最近一次意见或者观点跟身边的人有不一致是什么时候?
- 做项目的时候会出现大家观点不一致的时候吗?
- 遇到过什么不太公平的事情吗?
- 过往压力最大的时间是什么时候?
- 这段时间状态会和现在有什么不一样吗?
- 你性子比较着急还是比较慢?
- 对未来求职的工作地点,时间长度,薪资有什么要求?
- 未来十年之后你自己理想的生活和工作状态是什么样子的?
- 为什么会想做领导?
3、专业面试(40min)- 20240801
- 自我介绍
- 项目介绍
- 画图板和音乐播放器怎么实现的?
- 音乐播放器如何实现拖动进度条改变音乐进度?
- UBoot 启动流程
- Linux Kernel 和设备树如何加载到 CPU RAM 中的?
- bootargs 参数里面一般都有什么内容?
- 进程和线程的区别?
- GPIO 有哪几种模式?
- I2C 能挂载多少个设备?
- 手撕:用 C 实现自己的
memcpy()
函数?(写出来后让再换一种高级写法) - 项目里面最难忘的一个问题是什么?怎么解决的?
- 中断能不能传递参数