小鹰锐视-嵌入式开发 一面 面经
1. 先做个自我介绍,说说你的技术背景和擅长的方向
参考答案:
面试官您好,我是XXX,目前是XX大学计算机专业的研究生/本科生。我从大二开始接触嵌入式开发,到现在有两年多的学习和项目经验。
技术方面,我熟悉C/C++编程,有扎实的编程基础。掌握STM32等MCU的开发,熟悉GPIO、UART、SPI、I2C、ADC、定时器等外设的使用。了解FreeRTOS等实时操作系统,有多任务开发经验。熟悉常见的通信协议和传感器的使用。
项目经验方面,我做过基于STM32的智能环境监测设备,采集温湿度、光照等数据,通过蓝牙上传到手机。还做过基于Linux的高性能服务器项目,使用epoll实现高并发。我对嵌入式系统开发很感兴趣,特别是底层驱动和系统优化方向。
2. 详细介绍一下你的项目,用到了哪些传感器?传感器的工作原理是什么?
参考答案:
我做的智能环境监测设备项目,主要用到了以下几种传感器。
温湿度传感器用的是SHT30,这是一个数字式传感器,通过I2C接口通信。工作原理是,温度测量基于能隙原理,利用半导体PN结的正向压降随温度变化的特性。湿度测量基于电容式原理,湿敏电容的介电常数随湿度变化,导致电容值变化,通过测量电容值得到湿度。SHT30内部有ADC和微处理器,将模拟信号转换为数字信号,通过I2C输出。测量精度很高,温度±0.2℃,湿度±2%RH。
光照传感器用的是BH1750,也是数字式传感器,I2C接口。工作原理是光电效应,光照射到光敏二极管上,产生光电流,光电流的大小与光照强度成正比。内部电路将光电流转换为数字信号输出。测量范围是1到65535 lux,适合室内光照测量。
气体传感器用的是MQ-2,这是模拟式传感器。工作原理是,传感器内部有氧化锡半导体材料,在高温下(200-300℃)与空气中的氧气反应,形成氧离子吸附层,电阻很高。当有可燃气体存在时,气体与氧离子反应,释放电子,电阻下降。通过测量电阻变化,可以检测气体浓度。MQ-2输出模拟电压,需要用ADC采集。
姿态传感器用的是MPU6050,这是六轴传感器,包含三轴加速度计和三轴陀螺仪,I2C接口。加速度计的工作原理是,内部有微机械结构,质量块在加速度作用下产生位移,通过电容式或压阻式方法测量位移,得到加速度。陀螺仪的工作原理是科里奥利效应,振动质量块在旋转时受到科里奥利力,产生垂直于振动方向的位移,通过测量位移得到角速度。通过融合加速度计和陀螺仪的数据,可以计算出设备的姿态角(俯仰、横滚、偏航)。
这些传感器的选择主要考虑了精度、功耗、接口、成本等因素。数字式传感器接口简单,精度高,但成本较高。模拟式传感器成本低,但需要ADC采集,精度受ADC影响。
3. 你在项目中如何测量STM32中某个算法或函数的执行时间?
参考答案:
测量STM32中算法执行时间有几种方法,我在项目中主要用以下几种。
最常用的方法是使用定时器。配置一个定时器,比如TIM2,设置为向上计数模式,时钟源选择内部时钟,预分频器设置为系统时钟频率除以1MHz,这样定时器每计数1,就是1微秒。在算法执行前读取定时器的计数值,算法执行后再读取计数值,两次读取的差值就是执行时间。代码示例:
uint32_t start_time = TIM2->CNT; // 执行算法 algorithm_function(); uint32_t end_time = TIM2->CNT; uint32_t elapsed_time = end_time - start_time; // 单位:微秒
另一种方法是使用SysTick定时器,这是Cortex-M内核自带的定时器,不占用外设资源。SysTick通常用于操作系统的时基,但也可以用于时间测量。配置SysTick为1MHz计数,方法类似定时器。
还有一种方法是使用DWT(Data Watchpoint and Trace)单元,这是Cortex-M3及以上内核的调试功能。DWT有一个CYCCNT寄存器,记录CPU的时钟周期数。使能DWT后,读取CYCCNT的值,执行算法,再读取CYCCNT的值,差值就是执行的时钟周期数,除以系统时钟频率就得到时间。这种方法精度最高,可以精确到时钟周期。
// 使能DWT CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; DWT->CYCCNT = 0; DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; uint32_t start_cycles = DWT->CYCCNT; algorithm_function(); uint32_t end_cycles = DWT->CYCCNT; uint32_t elapsed_cycles = end_cycles - start_cycles; float elapsed_time_us = (float)elapsed_cycles / (SystemCoreClock / 1000000);
还可以用GPIO翻转的方法,在算法执行前拉高GPIO,执行后拉低GPIO,用示波器或逻辑分析仪测量GPIO高电平的时间。这种方法适合测量很短的时间,精度取决于示波器。
选择哪种方法要看需求,如果只是粗略测量,用定时器就够了。如果需要精确测量,用DWT。如果要分析时序,用GPIO配合示波器。
4. 说说I2C和SPI通信协议的区别,各自的优缺点和应用场景
参考答案:
I2C和SPI是两种常用的串行通信协议,特点不同。
I2C是同步串行通信,需要SCL时钟线和SDA数据线,支持一主多从,通过7位或10位地址寻址不同的从设备。优点是只用两根线就能连接多个设备,节省IO口,支持热插拔。缺点是速度较慢,标准模式100Kbps,快速模式400Kbps,高速模式3.4Mbps。传输距离短,一般几十厘米,因为是开漏输出需要上拉电阻。I2C是半双工的,同一时刻只能单向传输。
SPI是同步串行通信,需要SCLK时钟、MOSI主出从入、MISO主入从出、CS片选四根线,主从模式。优点是速度快,可以达到几十Mbps甚至上百Mbps,全双工通信,硬件简单。缺点是需要的IO口多,每个从设备需要一根片选线,不支持多主。SPI没有标准的协议规范,不同厂商的实现可能不同。
应用场景上,I2C适合连接多个低速外设,比如传感器、EEPROM、RTC、ADC/DAC等,适合板内通信。SPI适合连接高速外设,比如Flash、SD卡、LCD、无线模块等,适合需要高速传输的场合。
在我的项目中,温湿度传感器、光照传感器、姿态传感器都用I2C连接,因为它们速度要求不高
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
这是一个全面的嵌入式面试专栏。主要内容将包括:操作系统(进程管理、内存管理、文件系统等)、嵌入式系统(启动流程、驱动开发、中断管理等)、网络通信(TCP/IP协议栈、Socket编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。
查看7道真题和解析
