小鹰锐视-嵌入式开发 一面 面经

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编程等)、开发工具(交叉编译、调试工具等)以及实际项目经验分享。专栏将采用理论结合实践的方式,每个知识点都会附带相关的面试真题和答案解析。

全部评论

相关推荐

评论
点赞
3
分享

创作者周榜

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