本文主要是介绍嵌入式八股-面试30题(20240821),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 硬件基础与微控制器架构
1.1 CPU内部结构
回答:
CPU内部主要由运算单元(ALU)、控制单元、寄存器组、缓存(Cache)和总线接口等部分组成。ALU负责执行算术和逻辑运算,控制单元负责指令的解码和执行,寄存器组用于快速存储数据和指令,缓存用于存储频繁访问的数据以提高处理速度。
1.2 ARM结构处理器简析
回答:
ARM架构是一种RISC(精简指令集计算机)架构,具有低功耗、高性能和高效率的特点,广泛应用于嵌入式系统中。ARM处理器具有多个模式和级别的中断处理能力,支持多种总线协议,如AMBA,并且通常集成了丰富的外设接口。
1.3 ARM和DSP的区别
回答:
ARM和DSP的主要区别在于设计目标和指令集:
- ARM:通用型处理器,支持广泛的应用场景,指令集简洁,高效的流水线设计,适用于多任务操作和一般计算任务。
- DSP:专为数字信号处理设计,指令集优化用于高效执行滤波、傅里叶变换等数学运算,具有并行处理能力,适用于音频、视频和通信信号处理。
1.4 ROM和RAM的概念
回答:
- ROM(只读存储器):用于存储固件和不可变的数据,断电后数据不会丢失,典型应用如BIOS。
- RAM(随机存取存储器):用于存储临时数据,读写速度快,但断电后数据丢失,常用于系统的工作内存。
1.5 CPU、内存、虚拟内存、磁盘/硬盘的关系
回答:
CPU直接与内存(RAM)交互以获取指令和数据。虚拟内存是操作系统用来扩展物理内存的一种技术,它将部分磁盘/硬盘空间用作虚拟内存,以支持更大的地址空间。磁盘/硬盘是永久存储设备,主要用于存储操作系统、应用程序和数据文件。
1.6 处理器在读内存的过程中,CPU核、cache、MMU如何协同工作
回答:
当CPU需要读取内存数据时,首先查找缓存(Cache)。如果数据在缓存中,则直接使用,否则通过MMU(内存管理单元)进行地址转换,然后从物理内存中读取数据并加载到缓存中,最后传递给CPU核。
2. IO接口与总线协议
2.1 IO口工作方式:上拉输入、下拉输入、推挽输出、开漏输出
回答:
- 上拉输入:通过内部或外部上拉电阻将输入引脚默认拉高。
- 下拉输入:通过内部或外部下拉电阻将输入引脚默认拉低。
- 推挽输出:引脚可以驱动输出高电平或低电平,适合高速、强驱动的应用。
- 开漏输出:引脚只能下拉至低电平,需要外部上拉电阻拉高,适用于多设备共用一条信号线(如I2C)。
2.2 IO口的模式及推挽输出和开漏输出的区别
回答:
推挽输出和开漏输出主要区别在于推挽输出可以主动驱动高低电平,而开漏输出只能驱动低电平,高电平需要外部上拉。推挽适合高速信号,开漏适合总线通信。
2.3 总线接口USART、I2C、USB的异同点
回答:
- USART:全双工通信,使用两个数据线(TX和RX),不需要时钟线,适合点对点通信。
- I2C:半双工通信,使用两根线(SDA和SCL),支持多主从架构,适合短距离多设备通信。
- USB:复杂的总线协议,支持高数据速率、多设备连接、热插拔和电源管理,广泛用于外设连接。
2.4 异步串口和同步串口的区别
回答:
- 异步串口:数据传输时不需要时钟信号,接收方通过数据线的开始/停止位确定数据帧的边界,适合低速通信。
- 同步串口:数据传输时需要时钟信号,发送方和接收方的时钟同步,适合高速通信。
2.5 波特率是什么,为什么双方波特率要相同
回答:
波特率是指每秒传输的比特数。通信双方的波特率必须一致,以确保正确地解码数据位,否则可能导致通信失败或数据错误。
2.6 IIC协议的读时序
回答:
IIC(I2C)读操作通常包括以下步骤:
- 主设备发送设备地址和读命令。
- 从设备应答并发送数据。
- 主设备接收数据并发送应答或非应答。
- 主设备发送停止条件结束通信。
3. 嵌入式操作系统(FreeRTOS)
3.1 FreeRTOS中任务调度的机制
回答:
FreeRTOS使用基于优先级的抢占式调度器。调度器根据任务的优先级分配CPU时间,高优先级任务会抢占低优先级任务的执行。内核也支持时间片轮转调度,即在同优先级任务之间公平分配CPU时间。
3.2 FreeRTOS中任务调度发生的时机
回答:
任务调度在以下情况发生:
- 系统调用(如
taskYIELD()
、vTaskDelay()
)导致任务阻塞或进入就绪状态时。 - 中断服务例程(ISR)调用任务间切换函数时。
- 定时器中断或其他硬件中断触发调度时。
3.3 FreeRTOS中非抢占非礼让模式下的任务执行情况
回答:
在非抢占模式下,当前正在运行的任务不会因为其他任务就绪而被中断,除非它主动放弃CPU或进入阻塞状态。非礼让模式下,同优先级任务的执行顺序由它们被调度的顺序决定。
3.4 FreeRTOS同优先级的任务创建的执行顺序
回答:
在FreeRTOS中,同优先级任务的执行顺序由任务创建和调度的先后顺序决定,具体执行顺序会因任务的创建顺序、时间片轮转等因素影响。
4. 中断与裸机开发
4.1 中断怎么发生,中断处理流程
回答:
中断由外部或内部事件触发,如硬件信号、电平变化、计时器溢出等。处理流程:
- CPU保存当前执行上下文。
- 跳转到中断向量表对应的中断服务程序(ISR)。
- ISR处理完毕后,恢复上下文,继续执行被中断的任务。
4.2 裸机开发实现软件定时器的方法
回答:
在裸机环境中,可以通过配置硬件定时器产生周期性中断,在中断服务例程中递增计数器,从而实现软件定时器。也可以使用轮询方式检查系统时间或计时器寄存器。
5. 数据结构与算法
5.1 冒泡排序的思路及时间复杂度的计算
回答:
冒泡排序通过相邻元素比较交换的方式,将较大(或较小)元素逐步移动到序列末端。时间复杂度为O(n^2),适合小规模数据的排序。
5.2 DFS与BFS算法的解释
回答:
- DFS(深度优先搜索):沿着一条路径不断深入直到不能再继续,然后回溯到最近的分支点继续探索。
- BFS(广度优先搜索):从初始节点开始,逐层扩展搜索范围,先访问所有邻居节点,然后再访问下一级邻居。
5.3 链表是否有二分查
找,什么情况下使用二分查找
回答:
链表通常不使用二分查找,因为二分查找依赖于随机访问特性,而链表只支持顺序访问。二分查找通常用于数组或动态数组等支持随机访问的数据结构上。
6. 操作系统与多线程
6.1 操作系统的基本功能与结构
回答:
操作系统提供了资源管理、进程管理、内存管理、文件系统和设备管理等基本功能。其结构包括内核层、系统调用接口、用户空间等部分。
6.2 进程与线程的区别
回答:
- 进程:操作系统中的独立运行单元,拥有独立的地址空间和资源。
- 线程:进程中的轻量级执行单元,多个线程共享同一进程的地址空间和资源,线程切换开销较低。
6.3 死锁的产生条件及解决方法
回答:
死锁的产生条件包括互斥、占有且等待、不可抢占和循环等待。解决方法包括资源预分配、银行家算法、死锁检测与恢复等。
6.4 FreeRTOS中非抢占非礼让模式下的任务执行情况
回答:
参见3.3。
7. 数据库与网络协议
7.1 数据库为什么要建立索引,以及索引的缺点
回答:
建立索引可以加速数据查询,减少查询时间。但索引会增加写操作的开销,消耗额外的存储空间,并且可能导致索引维护成本高。
7.2 数据库的ACID特性
回答:
ACID是指数据库事务的四个特性:
- Atomicity(原子性):事务的所有操作要么全部执行,要么全部不执行。
- Consistency(一致性):事务执行前后数据库状态必须一致。
- Isolation(隔离性):并发事务互不干扰。
- Durability(持久性):事务完成后数据永久保存在数据库中。
7.3 网络协议层次模型及其功能
回答:
网络协议分层模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都有其特定的功能,如数据传输、路由选择、数据格式转换和应用服务支持等。
7.4 计算机网络中的TCP与UDP的区别
回答:
- TCP(传输控制协议):面向连接,提供可靠的数据传输,具有流量控制和拥塞控制机制。
- UDP(用户数据报协议):无连接,提供不可靠的数据传输,低延迟,适用于实时应用。
8. Linux操作系统与常用命令
8.1 Linux操作系统挂起、休眠、关机相关命令
回答:
- 挂起:
systemctl suspend
- 休眠:
systemctl hibernate
- 关机:
shutdown -h now
或poweroff
这篇关于嵌入式八股-面试30题(20240821)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!