芯海科技 嵌入式开发软件开发 一面 面经

1. 先做个自我介绍,说说你对这个岗位的理解

参考答案:面试官您好,我是XXX,目前是XX大学XX专业的学生。我主要的技术方向是嵌入式系统开发,熟悉C/C++编程、RTOS、常见通信协议等。做过基于STM32的XX项目,使用FreeRTOS实现多任务调度,用到了UART、SPI、I2C等外设通信。

对于这个岗位,我理解主要是做嵌入式固件开发,包括驱动开发、RTOS应用、通信协议实现、系统调试优化等工作。芯海科技在ADC芯片和MCU方面有很强的技术实力,我希望能在这里深入学习芯片底层开发,积累实际项目经验,提升自己的技术能力。

2. 说说RTOS的工作原理,你用过哪些RTOS?它们的调度机制是怎样的?

参考答案:我主要用过FreeRTOS和RT-Thread。RTOS的核心是任务调度器,负责在多个任务之间分配CPU时间,保证高优先级任务能及时响应。

FreeRTOS采用抢占式优先级调度,每个任务有一个优先级,高优先级任务就绪时会立即抢占低优先级任务。同优先级的任务采用时间片轮转,每个任务运行一个时间片后切换到下一个。

调度器维护多个就绪队列,每个优先级一个队列,选择最高优先级队列中的第一个任务运行。任务可以处于运行、就绪、阻塞、挂起等状态,通过信号量、消息队列等机制在状态间转换。

调度时机包括:系统滴答定时器中断时检查是否需要切换、任务主动调用延时或阻塞API时、中断服务程序退出时检查是否有更高优先级任务就绪。

调度器通过保存和恢复任务的上下文(寄存器、栈指针等)实现任务切换,切换开销通常在几微秒。RTOS还提供任务间通信和同步机制,包括信号量用于资源互斥和同步、消息队列用于数据传递、事件标志组用于多事件等待、互斥锁防止优先级反转等。这些机制让多任务协作变得简单可靠。

3. 详细说说任务切换的原理,上下文切换具体保存哪些内容?切换过程是怎样的?

参考答案:任务切换的本质是保存当前任务的运行状态,恢复下一个任务的运行状态。需要保存的上下文包括CPU寄存器,比如通用寄存器R0-R12、栈指针SP、链接寄存器LR、程序计数器PC、程序状态寄存器PSR等。对于Cortex-M系列,硬件会自动保存部分寄存器到栈上,软件需要保存剩余的寄存器。

切换过程分几步。首先在系统滴答中断或任务主动让出CPU时,触发PendSV中断,这是一个低优先级的系统异常,专门用于任务切换。进入PendSV中断处理函数后,先保存当前任务的上下文,把剩余的寄存器压入当前任务的栈,更新任务控制块中的栈指针。

然后调用调度器选择下一个要运行的任务,获取其栈指针。接着恢复下一个任务的上下文,从其栈中弹出寄存器值,恢复到CPU寄存器。最后从PendSV中断返回,硬件自动恢复剩余寄存器,跳转到新任务继续执行。

整个过程中,每个任务都有独立的栈空间,栈中保存了任务的局部变量和上下文。任务控制块TCB记录了任务的栈指针、优先级、状态等信息。使用PendSV而不是直接在SysTick中切换,是因为PendSV优先级低,可以等其他中断处理完再切换,避免中断嵌套过深。

4. 如果有两个相同优先级的任务,它们的运行时间是一样的吗?如何保证公平性?

参考答案:相同优先级的任务采用时间片轮转调度,理论上每个任务获得的CPU时间应该是相等的,但实际运行时间可能不完全一样。

时间片轮转的机制是,每个任务运行一个时间片(比如10ms)后,如果还没有主动让出CPU,系统滴答中断会触发任务切换,切换到同优先级的下一个就绪任务。这样多个任务轮流执行,保证公平性。但如果任务在时间片内主动阻塞,比如调用延时函数或等待信号量,就会提前让出CPU,实际运行时间就少于一个时间片。

还有一些因素会影响公平性。如果任务频繁被中断打断,实际执行时间会减少。如果任务的工作负载不同,有的任务计算密集,有的任务IO密集,运行时间也会不同。如果系统中有更高优先级的任务就绪,会抢占当前任务,导致当前任务的时间片被打断。

要保证公平性,可以合理设置时间片大小,太小会导致频繁切换开销大,太大会影响响应性。可以监控各任务的CPU占用率,如果发现不均衡就调整任务设计。对于关键任务,可以提高优先级保证及时响应,而不是依赖时间片轮转。还可以使用任务通知、信号量等机制,让任务在等待事件时主动让出CPU,提高系统效率。

5. 说说常见的通信协议UART、I2C、SPI的区别,各自的优缺点和应用场景

参考答案:这三种都是常用的串行通信协议,但特点不同。

UART是异步串行通信,只需要TX和RX两根线,加上GND,点对点通信。优点是简单,硬件资源少,传输距离远,可以达到几十米。缺点是速度相对较慢,常见的波特率是9600到115200,最高几Mbps。没有时钟线,需要双方约定波特率,容易出现波特率不匹配的问题。应用场景是调试输出、GPS模块、蓝牙模块等,适合简单的点对点通信。

I2C是同步串行通信,需要SCL时钟线和SDA数据线,支持多主多从,通过地址寻址。优点是只需两根线就能连接多个设备,节省IO口,支持热插拔。缺点是速度较慢,标准模式100Kbps,快速模式400Kbps,高速模式3.4Mbps。传输距离短,一般几十厘米,因为是开漏输出需要上拉电阻。应用场景是连接传感器、EEPROM、RTC等低速外设,适合板内通信。

SPI是同步串行通信,需要SCLK时钟、MOSI主出从入、MISO主入从出、CS片选四根线,主从模式。优点是速度快,可以达到几十Mbps甚至上百Mbps,全双工通信,硬件简单。缺点是需要的IO口多,每个从设备需要一根片选线,不支持多主。应用场景是连接Flash、SD卡、LCD、ADC等高速外设,适合需要高速传输的场合。

选择协议要根据需求,如果是简单的点对点通信用UART,如果要连接多个低速设备用I2C,如果需要高速传输用SPI。

6. I2C和SPI的从机能主动向主机发送数据吗?如果从机有数据要发送,应该如何设计?

参考答案:I2C和SPI都是主从模式,通信由主机发起,从机不能主动发送数据。但实际应用中经常需要从机主动通知主机,有几种设计方案。

对于I2C,从机不能主动发起通信,但可以通过额外的中断线通知主机。从机有数据时,拉低中断线,主机检测到中断后,通过I2C主动读取从机数据。这种方式需要额外的IO口,但很

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

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

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

全部评论

相关推荐

zbk1:学院本找嵌入式我觉得不太行,不要被培训班忽悠了,老老实实读个研吧。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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