【秋招】嵌入式面试八股文 - ARM 02篇
本文为 第二章 ARM 部分,具体整篇目录可以看前言!
第一部分(纯八股)
2. ARM
2.1 硬件基础
2.1.9 异常和中断
在处理器执行到因编译 错误而导致的错误指令时,或者在执行期间出现特殊错误,必须靠内核处理的时候,处理器就会产生一个异常。
2.1.10 中断和DMA的区别
DMA:是一种无须CPU的参与,就可以让外设与系统内存之间进行双向数据传输的硬件机制,使用 DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。
中断:是指CPU在执行程序的过程中,出现了某些突发事件时,CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回源程序被中断的位置并继续执行。
所以中断和DMA的区别就是:DMA不需CPU参与,而中断是需要CPU参与的。
2.1.11 H中断能不能睡眠,为什么?下半部能不能睡眠?
2.1.12 中断响应执行流程
中断的响应流程:cpu接受中断->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文。
2.1.13 中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?
中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。
凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求cpu的设备,或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是一般设备,并且该设备请求 cpu的频率比较低,则用中断效率要高一些。主要是看请求频率。
2.1.14 当一个异常出现以后,ARM微处理器会执行哪几步操作?
1. 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,则LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+ 8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令 MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。
2. 将CPSR复制到相应的SPSR中。
3. 根据异常类型,强制设置CPSR的运行模式位。
4. 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处
注意:
CPSR: 程序状态寄存器(当前程序状态寄存器),在任何处理器模式下被访问
SPSR:程序状态保存寄存器(saved programstatus register),每一种处理器模式下都有一个状态寄存器SPSR,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态
2.1.15 ARM内核架构
1. ICode总线:ICode 中的 I 表示 Instruction,即指令。我们写好的程序编译之后都是一条条指令,存放在 FLASH 中,内核要读取这些指令来执行程序就必须通过 ICode 总线,它几乎每时每刻 都需要被使用,它是专门用来取指的。
2、DCode总线:DCode 中的 D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有常量和变量两种,常量就是固定不变的,用 C 语言中的 const 关键字修饰,是放到内部的 FLASH 当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的 SRAM。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。
3、系统总线:系统总线主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通 过这根系统总线来完成的
(1)FSMC的英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器, 是 STM32F10xx 中一个很有特色的外设,通过 FSMC,我们可以扩展内存,如外部的 SRAM,NANDFLASH 和 NORFLASH。
(2)内部的闪存存储器即 FLASH,我们编写好的程序就放在这个地方。内核通过 ICode 总 线来取里面的指令。
(3)DMA总线(Direct Memory Access)即直接存储器访问。主要用来传输数据,这个数据可以是某个外设的数据寄存存器,可以在SRAM,可以在内部的FLASH。
(4)AHB到APB的桥。AHB(Advanced High performance Bus)系统总线高级高性能总线
APB(Advance Peripheral BUS)外围总线。
(5)看门狗模块(watchdog timer):定期查看芯片内部的情况,一旦发生错误向芯片发出重启信号。看门狗命令在程序的中断中拥有最高的优先级。
2.1.16 STM32是大端还是小端?
STM32是小端模式
2.1.17 Linux系统启动流程?
2.1.17.1 执行ROM代码
它是处理器上电以后首先执行的程序,ROM代码的主要工作就是读取 STM32MP1的BOOT引脚电平,然后根据电平判断当前启动设备,最后从选定的启动设备里面读取FSBL代码,并将FSBL代码放到对应的RAM空间。(first stage boot loader 第一阶段加载程序)
2.1.17.2 FSBL
FSBL 代码初始化时钟树、初始化外部RAM控制器,也就是DDR。最终FSBL将SSBL加载到DDR里面并运行SSBL代码。
DDR的全称其实是DDR SDRAM。所以在介绍DDR之前,得先了解什么是SDRAM。
SDRAM(同步动态随机存取内)可以看作一种特殊的DRAM(动态随机存取内存),我们平时说的计算机内存条就是一种DRAM。
SDRAM除了异步接口,还多了一个同步接口。同步接口需要数据发送方和接收方有一个统一的时钟信号,技术相对复杂,相应的传输速率和并发度都更高。
2.1.17.3 SSBL
由于SSBL代码运行在DDR里面,无需担心空间不够,因此SSBL代码的功能就可以做的 很全面,比如使能USB、网络、显示等等。这样我们就可以在SSBL中灵活的加载linux内核, 比如从Flash设备上读取,或者通过网络下载下载等,用户使用起来也非常的友好。SSBL一般是Uboot,用来启动Linux内核。
2.1.17.4 Linux内核
SSBL 部分的Uboot就一个使命,启动Linux内核,Uboot会将Linux内核加载到DDR上 并运行。Linux内核启动过程中会初始化板子上的各种外设。
2.1.17.5 Linux用户空间
系统启动的时候会通过init 进程切换到用户空间,在这个过程中会初始化根文件系统里面 的各种框架以及服务。
#嵌入式##秋招##校招##嵌入式笔面经分享##24届软开秋招面试经验大赏#我打算把自己整理的八股文笔记、面试经验、项目经验、简历修改经验等等,分享给大家。之前准备找工作那会,很多付费的东西,质量参差不齐,我打算在牛客创建一个免费的专栏,分享整理的这些内容,今天这个是第一篇文章,对于找工作的人提供一份帮助就行。