CETV-面试
CVTE嵌软提前批8.25 一面 全程1h多一.目前实习最大的收获是开始根据实习内容问相关问题并根据回答中提到的进一步提问二.介绍iic和spi的区别两者的最高速率是IIC 与 SPI 区别 最高速率1.核心区别总线引脚IIC2 线制SDA 数据线、SCL 时钟线半双工SPI4 线制SCK 时钟、MOSI 主发、MISO 主收、CS 片选全双工通信方式IIC同步串行、地址寻址一主多从靠设备地址选从机SPI同步串行、片选寻址靠 CS 引脚单独选中从机拓扑结构IIC总线型所有设备挂同一两根线SPI星型每个从机单独接 CS应答机制IIC有ACK 应答可靠性高SPI无固定应答纯高速收发电平与容错IIC开漏输出需上拉电阻支持多设备线与SPI推挽输出无需上拉驱动能力强使用场景IIC低速外设温湿度、EEPROM、RTC、传感器SPI高速外设Flash、显示屏、ADC、无线模块2.最高通信速率IIC标准最高 400Kbps高速模式 Fast-mode超高速模式可达3.4Mbps极少用日常工程默认400KbpsSPI无标准固定上限硬件决定普通 MCU SPI10MHz~20MHz高速 SPI可达几十 MHz工业常用极限最高 100Mbps三.确认实习内容做的是哪个层面的工作是偏向驱动开发还是协议解析二者核心定义驱动开发底层硬件层直接操作寄存器、配置时钟、初始化 IIC/SPI/UART/CAN 等外设写硬件初始化、收发底层函数对接芯片引脚与控制器偏向硬件操控、寄存器配置、硬件时序适配贴近 MCU 内核与硬件电路。协议解析应用 / 中间层基于现成底层驱动接口做数据帧封装、校验、解包、指令解析、业务指令交互解析设备通信协议、数据格式、指令码不碰底层寄存器偏向数据逻辑、通信报文、业务交互。四.用户态和内核态的区别是1. 基本定义内核态Ring0操作系统内核运行层级权限最高用户态Ring3普通应用程序运行层级权限受限2. 核心区别权限不同内核态可访问全部物理内存、操作硬件、读写寄存器、修改系统资源用户态只能访问自己进程内存不能直接操作硬件资源访问内核态直接操控磁盘、网卡、串口、CPU 寄存器用户态不能直接操作硬件必须通过系统调用运行代码内核态驱动、操作系统内核、中断服务程序用户态APP、应用软件、业务程序切换方式用户态 → 内核态系统调用、中断、异常内核态 → 用户态中断返回、调度返回安全性内核态代码出错直接系统崩溃用户态程序崩溃只卡死自己不影响系统五.iic总线最多能挂载多少个设备待定7 位地址最常用地址范围0x00 ~ 0x7F → 共128 个地址0x00 是广播地址不分配给从机另有少量保留地址如 0x01~0x07、0x78~0x7F一般面试直接说理论最多 127 个实际受 400pF 电容限制 → 建议 ≤ 8 个六.iic的起始信号和结束信号是怎么样的默认空闲状态SCL 高电平SDA 高电平1. 起始信号StartSCL 为高电平时SDA 由高电平跳变到低电平时序SCL1 → SDA 下降沿作用通知所有从机开始通信2. 停止信号StopSCL 为高电平时SDA 由低电平跳变到高电平时序SCL1 → SDA 上升沿作用结束本次 IIC 通信七.那spi的起始信号和结束信号又是怎么样的SPI 无专用启停电平拉低 CS 开始通信拉高 CS 结束通信八.有实际测过iic和spi接口的信号波形实际使用示波器实测过 IIC、SPI 两种通信波形熟悉两种总线真实时序。1. IIC 实测波形空闲状态SCL、SDA 均为高电平起始信号SCL 高SDA 由高变低示波器能清晰看到下降沿停止信号SCL 高SDA 由低变高出现上升沿数据位SCL 高电平时数据稳定SCL 低电平才允许 SDA 跳变可测出高低电平宽度、通信波特率、ACK 应答低电平脉冲常见问题上拉电阻不合适导致波形畸变、上升沿过缓2. SPI 实测波形空闲CS 片选高电平时钟 SCK 无波形通信开始CS 拉低后出现连续周期性 SCK 时钟方波两根数据线 MOSI、MISO跟随时钟同步跳变全双工同时有数据波形可直观看出时钟极性 CPOL、时钟相位 CPHA配置对应的不同采样边沿通信结束CS 拉高时钟与数据波形立即消失实测能区分高位在前 / 低位在前也能测出实际传输速率九. 多从机的情况下spi的片选如何设计1.核心原理SPI无地址寻址依靠独立片选 CS区分不同从机同一时刻只能拉低一个 CS避免总线数据冲突。四种常用设计方案1. 独立 GPIO 直连最常用2. 译码器扩展GPIO 不够首选3. 软件模拟片选分时复用4. 菊花链模式串联多从机通信规则必背任意时刻仅一个 CS 拉低其余全部高电平切换从机前必须结束上一次 SPI 传输所有从机共用同一组 SCK、MOSI、MISO三根总线严禁同时拉低两个片选会造成数据总线短路错乱十.讲一下Linux系统的中断机制追问底层实现逻辑中断上下文不能休眠没有进程栈无法调度中断优先级硬件中断 软中断 进程中断嵌套Linux 默认允许中断嵌套高优先级可打断低优先级中断耗时太长会导致键盘卡顿、网口丢包、定时器不准1.整体流程外设产生电信号拉低 / 拉高中断引脚向 CPU 发中断请求CPU 暂停当前进程跳转到内核中断入口内核判断中断号找到对应中断服务函数执行中断处理分顶半部、底半部处理完成恢复现场回到原先程序继续运行十一.中断有什么注意点吗中断上下文不许休眠、不许阻塞、执行要快耗时业务下放底半部优先用工作队列共享资源用自旋锁不用互斥锁内存分配用原子模式合理选择触发方式尽量缩短中断执行时间。2. 顶半部 / 底半部完整区分顶半部硬中断纯中断上下文严禁休眠快进快出底半部分两种轻量底半部tasklet / 软中断还是中断上下文→ 不能睡重型底半部工作队列进程上下文→ 随便睡3.中断里用自旋锁不用互斥锁二者核心区别1. 互斥锁 mutex获取不到锁主动休眠放弃 CPU等锁释放再唤醒依赖进程调度只能在进程上下文使用中断上下文没有调度能力休眠直接死锁崩溃2. 自旋锁 spinlock获取不到锁原地循环空转一直轮询等锁不休眠、不切换进程可用于中断上下文缺点拿不到锁会一直占用 CPU3.中断分配内存为什么必须用 GFP_ATOMIC 原子模式1. GFP_KERNEL普通常用内存不足时会阻塞休眠等待系统释放空闲内存休眠行为在中断上下文直接禁用会崩系统2. GFP_ATOMIC 原子分配绝不休眠、绝不阻塞不管内存够不够立刻尝试分配失败直接返回 NULL完全适配中断上下文不能休眠的硬性规则十二.中断和轮询哪个效率高选择其一的考虑因素有空闲多时中断效率远高于轮询数据极密集、连续高速收发轮询反而更快1. 轮询原理CPU 死循环不断查询外设状态优点无上下文切换开销连续高速传输吞吐极高缺点全程占用 CPU空转极度浪费资源适用高频连续数据、无空闲等待场景2. 中断原理外设有事主动通知 CPU没事 CPU 正常跑业务优点CPU 利用率极高空闲时完全不占用缺点存在中断响应、上下文切换开销频繁中断会造成系统抖动十三.Linux系统的驱动有哪几种分类Linux 驱动三大主流分类字符设备驱动字节流读写顺序访问无缓冲区。例串口、LED、按键、传感器、I2C/SPI 外设。块设备驱动整块读写随机访问自带缓存。例硬盘、U 盘、SD 卡、闪存。网络设备驱动面向数据包收发无文件节点走协议栈。例以太网网卡、WiFi 模块。十四.介绍一下字符设备驱动定义Linux 三大驱动之一以字节流形式逐字节读写数据按顺序访问不支持随机寻址。核心特点访问方式像读写普通文件一样 open/read/write/close存在形式在/dev下生成设备文件节点无硬件缓存数据串行收发应用层与内核层通过文件操作接口交互常用硬件LED、按键、串口、I2C/SPI 外设、传感器、激光雷达、触摸屏等。十五.详细介绍其中一个需求开发具体如何实现的我拿激光雷达驱动开发举例。首先完成雷达和板卡硬件接线确定串口通信方式和私有通信协议然后基于 Linux 字符设备框架开发驱动申请设备号、实现文件操作接口配置串口参数并注册接收中断中断里逐字节接收原始数据通过帧头帧尾匹配、校验校验拼成完整数据帧解析出角度距离等点云信息放到内核环形缓存应用层通过读取 /dev 下的设备节点获取点云数据供给上层视觉和避障算法使用同时做了缓存、容错和资源释放保证驱动稳定运行。十六. 其中激光雷达和板卡的通信方式激光雷达和板卡常用四种通信UART 串口、以太网、CAN 总线、USB 虚拟串口。低端单线雷达多用UART 串口接线简单、协议简易多线高端雷达用以太网带宽大、能传输海量点云数据车载工业场景用CAN 总线抗干扰能力强还有 USB 虚拟串口调试方便、即插即用。十七. 还问了项目中视觉识别的细节问题整个视觉识别流程图像采集 → 预处理 → 目标检测推理 → 后处理 → 与激光雷达数据融合 → 输出结果给业务层。我们项目视觉识别整体是摄像头采集图像先做裁剪、降噪、归一化预处理采用轻量级 YOLO 模型导出 ONNX 在板卡端做轻量化部署和 INT8 量化推理推理后经过 NMS 非极大值抑制、置信度过滤得到目标检测框再和激光雷达做数据融合通过相机标定和手眼标定把像素坐标转换成实际物理距离坐标整个架构采用多线程加队列解耦保证嵌入式端实时性同时针对光照、误检、推理速度问题做了对应的优化。十八. 团队成员之间意见冲突时如何处理遇到团队意见冲突我会先冷静倾听对方思路理性梳理双方方案的优缺点以项目进度和落地效果为核心进行沟通讨论技术上对比可行性与风险若仍有分歧就交由上级定夺自己服从团队安排专注配合完成开发任务。十九. 有同事指出你的问题时你会怎么办我会虚心接受同事的意见放平心态认真听取问题细节先自查确认自身不足有问题及时整改修正有理解差异就平和沟通、同时做好复盘总结避免后续再犯保持团队良好协作。二十. c语言的编译过程C 语言编译分四步预处理、编译、汇编、链接。预处理展开头文件和宏、删除注释编译做语法检查转成汇编汇编把汇编转为机器码生成目标文件最后链接合并目标文件和库生成可执行程序。二十一. 引用和指针的区别引用是变量的别名必须初始化、不能为空、不能更改指向不占额外内存指针是存放地址的变量可以为空、可以随时改指向占用独立内存使用需要解引用。二十二. 介绍volitate4. 易错点面试常考volatile 不保证原子性、不保证线程安全只防止编译器优化不能替代互斥锁、信号量。5. 面试精简口述版volatile 关键字主要用来禁止编译器优化强制变量每次都从内存读取而不是缓存到寄存器主要用在硬件寄存器、多线程共享变量、中断全局变量场景二十三.介绍c的纯虚数1. 定义格式virtual void func() 0;2. 核心作用只声明接口没有具体实现包含纯虚函数的类 抽象类抽象类不能实例化只能被继承3. 派生类要求子类必须重写纯虚函数否则子类也变成抽象类也不能创建对象。4. 应用场景用来做接口设计、多态规范统一标准接口让所有子类必须实现同一套方法比如设备驱动、业务模块统一接口。因为纯虚函数只有声明、没有具体实现如果抽象类能实例化调用这个无实现的函数程序会崩溃所以语法规定抽象类不能创建对象只能作为父类被继承强制子类重写纯虚函数、补齐实现后才能实例化使用。面试精简背诵版C 纯虚函数用virtual 函数 0定义没有函数实现包含纯虚函数的类是抽象类不能实例化只能被继承派生类必须重写纯虚函数否则自身也是抽象类主要用来定义统一接口实现多态和规范子类行为。四.进程和线程的区别资源隔离进程有独立虚拟地址空间互不共享线程共享所在进程的地址空间、全局变量、文件描述符只有私有栈和寄存器。开销大小进程创建、销毁、切换开销大线程轻量创建切换开销小、速度快。通信方式进程间通信复杂管道、消息队列、共享内存、信号量、Socket线程直接读写全局变量即可通信。崩溃影响一个进程崩溃不影响其他进程一个线程崩溃整个进程直接退出。调度单位进程是资源分配的基本单位线程是CPU 调度的基本单位。从属关系一个进程至少有一个主线程一个进程可以包含多个线程。五.进程的通信方式六.信号量和互斥锁的应用场景互斥锁用于临界资源互斥访问同一时刻只允许一个线程操作共享数据保证数据安全信号量多用于生产者消费者、线程同步、并发限流可以控制多个线程同时访问数量还能协调线程执行顺序。七.堆栈的区别栈由系统自动分配自动释放空间小、速度快存放局部变量和函数参数函数结束立即回收堆由程序员手动申请释放空间大、速度慢存放动态内存不及时释放会造成内存泄漏。八.在c语言中如何判断两浮点数相等不能直接用 判断浮点数相等因为浮点数存在精度误差。正确做法是计算两个数差值的绝对值判断是否小于一个极小精度值如 1e-6如果小于就认为相等。单精度 float 用1e-6双精度 double 用1e-9九.指针数组和数组指针的区别看括号括号跟数组是数组指针括号跟指针是指针数组指针数组int *arr[]—— 存放指针的数组 char *str[] {abc,123};数组指针int (*p)[]—— 指向数组的指针 int arr[3][4]; int (*p)[4] arr;十.什么是平衡二叉树平衡二叉树是高度差不超 1 的二叉搜索树通过旋转维持平衡保证查找效率稳定。左旋、右旋、左右旋、右左旋十一.介绍排序算法冒泡排序选择排序插入排序希尔排序快速排序归并排序堆排序基数排序简单排序冒泡、选择、插入复杂度\(O(n^2)\)高效排序快排、归并、堆排复杂度\(O(n\log n)\)十二.反转字符串中的单词先把整个字符串全部反转再遍历字符串遇到空格就反转当前单词最终实现单词顺序颠倒、单词内部字母顺序不变。十三.说完思路后追问一个单词要反转几次整个字符串整体反转 1 次每一个独立单词各自反转 1 次// 反转指定区间字符 void reverse(char *s, int l, int r) { while(l r) { char t s[l]; s[l] s[r]; s[r] t; l; r--; } } // 反转单词 void reverseWords(char *s) { int len strlen(s); // 1.整体反转 reverse(s, 0, len-1); int start 0; // 2.逐个反转单词 for(int i 0; i len; i) { if(s[i] || s[i] \0) { reverse(s, start, i-1); start i 1; } } }十四.问理想的工作环境首先团队氛围轻松融洽同事之间沟通顺畅、互帮互助没有内耗其次技术氛围浓厚大家乐于交流探讨问题能互相学习共同进步再者公司制度规范合理权责清晰做事流程简洁不繁琐同时重视员工成长有培训、项目实战等提升机会最后办公环境舒适劳逸结合工作氛围积极正向。十五.你认为比较合理的上班时间十六.职业规划短期1 年内快速熟悉公司业务、项目流程与所用技术栈尽快上手独立完成分配任务补齐自身技术短板融入团队站稳脚跟。中期2-3 年深耕岗位技术熟练掌握核心业务逻辑能够独立负责模块开发与问题排查提升项目实战能力往资深开发方向发展。长期持续精进专业能力不断学习新技术争取能够主导项目功能开发逐步向技术骨干方向发展在岗位上创造更多价值和公司共同成长。十七.工作地倾向反问9.14 综合面hr面 就20min一.上一轮面试体验感如何整体体验很不错面试官提问专业细致沟通氛围轻松友好不仅考察专业知识也让我认清自身不足收获很大也更加坚定我求职方向。二.秋招进展收到offer了吗目前正在积极参与秋招面试处于面试推进阶段暂时还没有确定最终 offer希望能找到契合自身发展、平台合适的岗位。三.在选择工作上最关注的三个维度平台与发展公司行业前景好有完善培养体系能学到实用技术工作内容岗位贴合自身专业能发挥所学积累项目实战经验团队氛围团队氛围和睦同事好沟通工作氛围积极轻松四.父母对你工作上有什么建议父母希望我找一份稳定踏实、正规靠谱的工作不用急于求成优先注重个人成长脚踏实地做事放平心态好好积累经验兼顾身体健康。五.小时候对你影响最大的事六.简历有的经历中最大的技术挑战有哪些方面可以改进七. 近期实习的工作节奏是怎么样的工作时间个人状态八. 最近有关注什么最新的技术吗九. 压力最大的时候十.怎样的offer会吸引到你十一.又聊回到压力最大的阶段当时状态和平时有什么不一样吗十二.未来10 15年后你理想的工作状态是十三.期待的工作时间薪资和地点