【秋招】嵌入式面试八股文 - ARM 01篇

本文为 第二章 ARM 部分,具体整篇目录可以看前言!

【秋招】嵌入式面试八股文分享

【秋招】嵌入式面试八股文-C语言01篇

【秋招】嵌入式面试八股文-C语言/C++02篇

第一部分(纯八股)

​2. ARM

2.1 硬件基础

2.1.1 NAND FLASH 和NOR FLASH异同?

        我们使用的智能手机除了有一个可用的空间(如苹果8G、16G等),还有一个RAM容量,很多人都不是很清楚,为什么需要2个这样的芯片做存储呢,这就是我们下面要讲到的。这2种存储设备我们都统称为“FLASH”,FLASH是一种存储芯片,全名叫Flash EEPROM emory,通地过程序可以修改数据,即平时所说的“闪存”。Flash又分为NAND flash和NOR flash二种。

        许多业内人士也搞不清楚NAND闪存技术相对于NOR技术的优越之处,因为大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。NOR Flash 的读取和我们常见的 SDRAM 的读取是一样,用户可以直接运行装载在 NOR Flash里面的代码,这样可以减少 SRAM 的容量从而节约了成本。 NAND Flash 没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的, 通常是一次读取 512 个字节,采用这种技术的 Flash 比较廉价。用户不能直接运行NAND Flash 上的代码,因此好多使用 NAND Flash 的开发板除了使用NAND Flash以外,还用了 一块小的 NOR Flash 来运行启动代码。

        NOR flash是intel公司1988年开发出了NOR flash技术。NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能。

不同点:

注意:nandflash 和 norflash 的 0 地址是不冲突的,norflash 占用 BANK 地址,而 nandflash不占用 BANK 地址,它的 0 地址是内部的。

相同点:

2.1.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.1.3 什么是交叉编译?

       在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。

      这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(OperatingSystem)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

2.1.4  为什么需要交叉编译?

       有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

2.1.5 ROM和RAM的区别及类型

页(Page)< 扇区(Sector) < 块(Block)< 芯片(Chip)

一般1页是1k

ROM为只读存储器,RAM为读写存储器。

存储器按其存储介质特性主要分为“易失性存储器”和“非易失性存储器”两大类。

其中的“易失/非易失”是指存储器断电后,它存储的数据内容是否会丢失的特性。由于一般易失性存储器存取速度快,而非易失性存储器可长期保存数据,它们都在计算机中占据着重要角色。

在计算机中易失性存储器最典型的代表是内存,非易失性存储器的代表则是硬盘。

关于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.1.6 Cortex-M3寄存器组

2.1.7 保存、恢复现场的详细操作

向量表FLASH0地址开始放置,以4个字节为一个单位,地址0存放的是栈顶地址,0X04存放的是复位程序的地址,以此类推。从代码上看,向量表中存放的都是中断服务函数的函数名,可我们知道C语言中的函数名就是一个地址

首先是中断或异常产生,CPUFLASH里面找对应的异常向量表,异常向量表找到对应的中断函数,执行中断函数前,要进行保护现场的操作,中断函数结束后,恢复现场。

寄存器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.1.8 单片机启动流程

2.1.8.1 单片机基础

从图中看出,代码一般存储在ROM区,然后一些局部变量等利用SRAM来进行存储。

2.1.8.2 启动流程

单片机上电后一直到准备好C语言运行环境并跳转到main函数执行总共经历了5个步骤:

1.内核初始化;

2.强制PC指针指向中断向量表的复位中断向量执行复位中断函数;

3.在复位中断函数中调用 SystemInit 函数,初始化时钟,配置中断向量表等

4.调用 __main 函数完成全局/静态变量/常量的初始化和重定位工作,初始化堆栈和库函数

5.跳转到main函数中执行

注意:

 2.1.8.3 重定位

PC指针:pc指针是指寄存器pc,里边的值总是指向当前程序运行点的地址。

SP指针:SP指针指堆栈指针,也是通用寄存器,用于入栈和出栈操作。

我打算把自己整理的八股文笔记、面试经验、项目经验、简历修改经验等等,分享给大家。之前准备找工作那会,很多付费的东西,质量参差不齐,我打算在牛客创建一个免费的专栏,分享整理的这些内容,今天这个是第一篇文章,对于找工作的人提供一份帮助就行。

全部评论
膜拜大佬
点赞 回复 分享
发布于 2024-09-12 15:36 黑龙江
😂
点赞 回复 分享
发布于 2024-10-14 13:48 山西

相关推荐

Dream_coding:你是不是只投大厂了
点赞 评论 收藏
分享
评论
7
45
分享

创作者周榜

更多
牛客网
牛客企业服务