禾赛科技 嵌入式软件工程师 一面面试题

前言

禾赛科技作为全球领先的激光雷达制造商,嵌入式岗位主要面向激光雷达底层驱动、数据处理、通信协议等方向。一面考察C语言基础、操作系统、嵌入式系统、网络通信及激光雷达行业知识,难度中等偏上,时长约40分钟。

禾赛科技嵌入式一面14题详解

1. 请介绍一下你自己,以及你对激光雷达行业的了解

参考答案:

面试官您好,我是XXX,XXX大学XXX专业。技术栈方面熟练掌握C/C++,熟悉ARM Cortex-M/A系列开发,有Linux驱动和FreeRTOS经验,掌握UART、SPI、CAN、以太网等通信协议。

项目经验上做过多传感器融合系统和Linux工业相机驱动开发,对传感器数据采集和处理有深入理解。

关于激光雷达行业:激光雷达是自动驾驶核心传感器,通过发射激光脉冲测量反射时间获取三维点云数据,具有高精度、不受光照影响、直接获取深度信息等优势。目前主流技术路线包括机械式、半固态(MEMS、转镜)和纯固态(OPA、Flash)。禾赛在机械式和半固态领域全球领先,AT128等产品已在多家主机厂量产应用。核心技术挑战包括高精度TOF测量、大量点云实时处理、多传感器时间同步等,这些都需要强大的嵌入式能力支撑。

2. malloc和calloc有什么区别?

参考答案:

  1. 函数原型不同:malloc只需一个参数指定字节数malloc(size),calloc需要两个参数calloc(num, size)表示元素个数和单个大小,分配数组时更直观。
  2. 初始化行为不同:malloc分配的内存不初始化,内容是随机值;calloc会将分配的内存全部清零。这是最关键的区别。
  3. 性能差异:calloc需要清零理论上更慢,但现代操作系统由于虚拟内存机制,性能差异通常可忽略。
  4. 使用场景:嵌入式开发中更倾向malloc,需要初始化时显式用memset,代码意图更清晰。在资源受限系统中应避免频繁动态分配,优先使用静态分配或内存池。
  5. 注意事项:都要检查返回值是否NULL,使用完及时free并置NULL,避免野指针和内存泄漏。

3. 什么是野指针?如何避免野指针?

参考答案:

  1. 定义和危害:野指针指向未知或已释放的内存区域,访问会导致程序崩溃、数据破坏,在嵌入式系统中可能错误修改硬件寄存器引发严重故障。
  2. 产生原因:指针未初始化就使用;内存释放后指针未置NULL(悬空指针);指针指向栈上局部变量,函数返回后变量被销毁;数组越界;多次释放同一内存。
  3. 避免方法:所有指针定义时初始化为NULL;malloc后检查返回值;free后立即置NULL;不返回局部变量地址;使用前检查指针有效性;使用断言检查关键指针。
  4. 调试手段:使用Valgrind、AddressSanitizer等工具;硬件调试器设置内存访问断点;关键位置打印指针值;记录日志分析崩溃前操作。

4. 请说明C语言中的存储类别:auto、static、extern、register

参考答案:

  1. auto:局部变量默认类别,存储在栈上,作用域限于代码块,生命周期从进入到离开代码块。嵌入式中栈空间有限,避免定义过大auto数组。
  2. static:修饰局部变量时改变存储位置到静态区,只初始化一次,保持上次值;修饰全局变量/函数时限制作用域为本文件,实现文件级封装,避免命名冲突。
  3. extern:声明变量/函数在其他文件定义,存储在全局数据区,生命周期是整个程序,作用域可跨文件。通常在头文件声明,一个源文件定义。
  4. register:建议编译器将变量存储在寄存器中提高速度,但现代编译器优化能力强,该关键字已很少使用。register变量不能取地址。
  5. 实际应用:大数据结构用全局变量或动态分配;模块内部函数用static限制作用域;临时变量用auto;需要保持状态的用static局部变量。

5. 什么是字节对齐?#pragma pack的作用是什么?

参考答案:

  1. 定义和原因:数据在内存中的地址必须是某个数值的整数倍。原因:CPU按字长读取内存,对齐数据一次读取完成,不对齐需要多次读取拼接,效率低;某些处理器要求必须对齐,否则触发硬件异常。
  2. 对齐规则:基本类型对齐值等于其大小(char-1, short-2, int-4, double-8);结构体对齐值是最大成员的对齐值;结构体大小必须是对齐值的整数倍,不足部分填充padding。
  3. #pragma pack作用:#pragma pack(n)指定结构体按n字节对齐,#pragma pack(1)表示不对齐紧凑排列。用于网络通信和文件格式解析,保证数据包格式与协议一致。使用完要#pragma pack()恢复默认。
  4. 激光雷达应用:点云数据包需要与协议严格一致,用#pragma pack(1)定义数据包结构体,可直接将字节流转换为结构体解析。但取消对齐会降低访问效率,某些平台可能导致异常。
  5. 优化建议:调整成员顺序减少padding,大类型在前小类型在后。合理内存布局可节省空间,提高缓存命中率。

6. 进程间通信有哪些方式?

参考答案:

  1. 管道(Pipe/FIFO):单向

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式面试八股文全集 文章被收录于专栏

这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

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