【秋招】嵌入式面试八股文 - ARM -硬件基础/内部架构
本文为 第二章 ARM 部分,具体整篇目录可以看前言!
第一部分(纯八股)
2. ARM 第一部分
2.1 NAND FLASH 和NOR FLASH异同?
- 存储设备我们都统称为“FLASH”,Flash又分为NAND flash和NOR flash二种。
不同点:(图片点开更清晰)
- 注意:NAND flash 和 NOR flash 的 0 地址是不冲突的,Nor flash 占用 BANK 地址,而 NAND flash不占用 BANK 地址,它的 0 地址是内部的。
相同点:
2.2 CPU、MPU、MCU、SOC、SOPC 联系与差别?
(1)CPU(Central Processing Unit),是一台计算机的运算核心和控制核心。
- CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶 段:提取(Fetch)、解码(Decode)、执行(Execute)和写回(Writeback)。 CPU从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令译码,并执行指令。所谓的计算机的可编程性主要是指对CPU的编程。
(2)MPU (Micro Processor Unit),叫微处理器(不是微控制器)
- 通常代表一个功能强大的CPU(暂且 理解为增强版的CPU吧),但不是为任何已有的特定计算目的而设计的芯片。这种芯片往往是个人计算机和高端工作站的核心CPU。最常见的微处理器是Motorola的68K系列和Intel的X86系列。
(3)MCU(Micro Control Unit),叫微控制器
- 指随着大规模集成电路的出现及其发展,将计算机的 CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上,形成芯片级的芯片,比如51,avr这些芯片,内部除了CPU外还有RAM,ROM,可以直接加简单的外围器件(电阻,电容)就可以运行代码 了,而MPU如x86,arm这些就不能直接放代码了,它只不过是增强版的CPU,所以得添加RAM,ROM。 MCU MPU 最主要的区别就是能否直接运行代码。MCU有内部的RAM ROM,而MPU是增强版的CPU,需要添加外部RAM ROM才可以运行代码。
(4)SOC(System on Chip),指的是片上系统
- MCU只是芯片级的芯片,而SOC是系统级的芯片,它既像MCU(51,avr)那样有内置RAM,ROM,同时又像MPU(arm)那样强大的,不单单是放简单的代码,可以放系统级的代码,也就是说可以运行操作系统(将就认为是MCU集成化与MPU强处理力各优点二合一)。
(5)SOPC(System On a Programmable Chip)可编程片上系统(FPGA就是其中一种)
- 上面4点的硬件配置是固化的,就是说51单片机就是51单片机,不能变为avr,而avr就是avr不是51单片机,他们的硬件是一次性掩膜成型的,能改的就是软件配置,说白点就是改代码,本来是跑流水灯的,改下代码,变成数码管,而SOPC则是硬件配置,软件配置都可以修改,软件配置跟上面一样,没什么好说的,至于硬件,是可以自己构建的也就是说这个芯片是自己构造出来的,这颗芯片我们叫“白片”,什么芯片都不是,把硬件配置信息下载进去了,他就是相应的芯片了,可以让他变成51,也可以是avr,甚至arm,同时SOPC是在SOC基础上来的,所以他也是系统级的芯片,所以记得当把他变成arm时还得加外围ROM,RAM之类的,不然就是MPU了。
2.3 什么是交叉编译?
- 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。
- 这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(OperatingSystem)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
2.4 为什么需要交叉编译?
- 有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
2.5 ROM和RAM的区别及类型
- 页(Page)< 扇区(Sector) < 块(Block)< 芯片(Chip)
- 一般1页是1k
ROM为只读存储器,RAM为读写存储器,分类如图:
- 存储器按其存储介质特性主要分为“易失性存储器”和“非易失性存储器”两大类。
- 其中的“易失/非易失”是指存储器断电后,它存储的数据内容是否会丢失的特性。由于一般易失性存储器存取速度快,而非易失性存储器可长期保存数据,它们都在计算机中占据着重要角色。
- 在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘。
2.6 关于RAM中,DRAM和SRAM对比
- DRAM中代表1的电容会放电,因此需要定时刷新,刷新操作会对电容电量进行检查。而DRAM本身分为同步和异步两种通讯方式,其中同步通讯方式速度更快,应用广泛,同步通讯的方式叫做SDRAM。
- SRAM利用锁存器去存储数据,不需要定时刷新充电。所以被称为静态RAM,(static RAM)。而SRAM本身也分为同步和异步通讯,相对而言,异步SRAM用的比较广泛。
- 对比 DRAM 与 SRAM 的结构,可知 DRAM 的结构简单得多,所以生产相同容量的存储器,DRAM的成本要更低,且集成度更高。而 DRAM 中的电容结构则决定了它的存取速度不如 SRAM,特性对比见表 DRAM 与 SRAM 对比。
- 所以在实际应用场合中,SRAM 一般只用于 CPU 内部的高速缓存 (Cache),而外部扩展的内存一般使用 DRAM。在 STM32 系统的控制器中,只有STM32F429 型号或更高级的芯片才支持扩展SDRAM,其它型号如STM32F1、STM32F2 及 STM32F407 等型号只能扩展 SRAM。
关于ROM中:
- ROM中应用最广泛的是EEPROM。它可重复擦写,擦除和写入都是直接用外部设备来擦写,而且可以按字节为单位修改数据。
关于FLASH:
- FLASH 存储器又称 为闪存,它也是可重复擦写的储器,部分书籍会把FLASH 存储器称为 FLASH ROM,但它的容量一般比 EEPROM 大得多,且在擦除时,一般以多个字节为单位。如有的 FLASH 存储器以 4096 个字节为扇区,最小的擦除单位为一个扇区。
- NOR 与 NAND 的共性是在数据写入前都需要有擦除操作,而擦除操作一般是以“扇区/块”为单位的。
- 而 NOR 与 NAND 特性的差别,主要是由于其内部“地址/数据线”是否分开导致的。
- 由于 NOR 的地址线和数据线分开,它可以按“字节”读写数据;而由于 NAND 的数据和地址线共用,只能按“块”来读写数据。
- 由于两种 FLASH 存储器特性的差异,NOR FLASH 一般应用在代码存储的场合,如嵌入式控制器内部的程序存储空间。而 NAND FLASH 一般应用在大数据量存储的场合,包括 SD 卡、U盘以及固态硬盘等,都是 NAND FLASH 类型的。
2.7 Cortex-M3寄存器组
图片点开观看更清晰!
2.8 保存、恢复现场的详细操作(难理解)
- 向量表从FLASH的0地址开始放置,以4个字节为一个单位,地址0存放的是栈顶地址,0X04存放的是复位程序的地址,以此类推。从代码上看,向量表中存放的都是中断服务函数的函数名,可我们知道C语言中的函数名就是一个地址
- 首先是中断或异常产生,CPU去FLASH里面找对应的异常向量表,异常向量表找到对应的中断函数,执行中断函数前,要进行保护现场的操作,中断函数结束后,恢复现场。
- 寄存器R13在ARM指令中常用作堆栈指针SP, 但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针, 而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针.
- 由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的 R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
- R14称为子程序链接寄存器LR(Link Register), 当执行子程序调用指令(BL)时, R14可得到R15(程序计数器PC)的备份。
- 保护现场:首先,将SP的值保存在IP寄存器中(此时IP中存的sp是未进行压栈的sp),然后让fp ip lr pc按照从右向左顺序入栈,入栈的过程中,让sp随着入栈而不断增长。入栈过程中,sp不断增加,从左图高地址处sp一直移动到fp处,然后将ip-4,将sp存入fp中(相当于fp中存的是pc当前地址)。此时,fp里面存入了栈顶sp。
- 恢复现场:先将fp-12,此时fp内存的地址即为当前sp所在位置,然后将fp赋值给fp,sp赋值给ip,lr赋值给pc。其中lr为函数返回地址,而pc存储的是程序要执行的下一条指令。
2.9 单片机启动流程
(1)单片机基础
- 从图中看出,代码一般存储在ROM区,然后一些局部变量等利用SRAM来进行存储。
(2)启动流程
单片机上电后一直到准备好C语言运行环境并跳转到main函数执行总共经历了5个步骤:
- 内核初始化;
- 强制PC指针指向中断向量表的复位中断向量执行复位中断函数;
- 在复位中断函数中调用 SystemInit 函数,初始化时钟,配置中断向量表等
- 调用 __main 函数完成全局/静态变量/常量的初始化和重定位工作,初始化堆栈和库函数
- 跳转到main函数中执行
注意:
- 未初始化和初始值为零的全局变量,静态变量一般在RAM中,初始值不为零的全局变量/静态变量 一般在FLASH中。
- 因为Flash不能随机写(只能写0,不能写1),所以一般会在程序运行之前将初始值不为零的全局变量重定位到RAM中。
- 全局变量和常量的地址在编译时都已经被分配好了(所以能够在 .map 文件中看到),而局部变量则是程序运行时在栈中创建的,栈空间大小可以在IDE中设置。
- 单片机启动时,不需要用将代码从ROM搬移到RAM ,而 ARM 则需要。单片机程序执行的过程分三个步骤:取执行->分析指令->执行指令。取指令的任务是:根据 PC的值从程序存储器读出指令,送到指令寄存器。然后分析执行执行。这样单片机就从内部程序存储器去代码指令,从 RAM 存取相关数据。要知道RAM取数的速度是远高于ROM的,但是单片机因为本身运行频率不高,所以从ROM取指令慢并不影响。而ARM不同,CPU运行的频率高,远大于从 ROM读写的速度,所以一般有大型的操作系统时,都需要将代码部分拷贝到RAM中再执行。
(3) 重定位
- PC指针:pc指针是指寄存器pc,里边的值总是指向当前程序运行点的地址。
- SP指针:SP指针指堆栈指针,也是通用寄存器,用于入栈和出栈操作。
#校招过来人的经验分享##校招##秋招##嵌入式##嵌入式笔面经分享#【秋招】嵌入式八股文最全总结 文章被收录于专栏
双非本,211硕。本硕均为机械工程,自学嵌入式,在校招过程中拿到小米、格力、美的、比亚迪、海信、海康、大华、江波龙等offer。八股文本质是需要大家理解,因此里面的内容一定要详细、深刻!这个专栏是我个人的学习笔记总结,是对很多面试问题进行的知识点分析,专栏保证高质量,让大家可以高效率理解与吸收里面的知识点!掌握这里面的知识,面试绝对无障碍!