嵌入式开发工程师笔试面试指南-ARM架构(Cortex-M)

一 嵌入式基础⭐⭐⭐⭐⭐

1 请说说你对嵌入式的理解

嵌入式系统是指以应用为中心,以计算机技术为基础,软件硬件可剪裁,适应应用系统对功能、成本、体积、功耗严格要求的专用计算机系统。

嵌入式系统主要由嵌入式微处理器外围硬件设备嵌入式操作系统以及用户应用软件等部分组成。

2 嵌入式流水线?

嵌入式流水线是一种处理器设计技术,旨在将处理器的工作分解成多个阶段,如指令获取、指令解码、执行、访存和写回等。每个阶段执行特定任务,使得不同指令可以并行处理,从而提高处理器的效率和性能。

  1. 取指阶段:在这个阶段,处理器从指令存储器中获取一条指令,并将其送入流水线。这个阶段的主要任务是读取指令、确定指令类型以及确定指令需要的操作数。
  2. 译码阶段:取得的指令会经过译码阶段,处理器会对指令进行译码,确定指令的操作类型、操作数和执行的具体方式。这个阶段还会检测指令中是否有数据相关,以便保证流水线的正确运行。
  3. 执行阶段:在执行阶段,指令对应的操作会被执行,可能会涉及到算术逻辑运算、存储器访问等操作。处理器会根据指令的类型和操作数执行相应的操作。
  4. 访存阶段:如果指令涉及到内存读写操作,那么在这个阶段会进行存储器的访问,包括从内存中读取数据或将数据写入内存。
  5. 写回阶段:最后一个阶段是写回阶段,处理器会将执行阶段得到的结果写回到寄存器文件或者内存中,以完成整个指令的执行过程。

流水线的好处:

  1. 提高吞吐量:流水线允许处理多条指令的不同阶段同时进行,从而提高了指令的吞吐量,加快了程序执行速度。
  2. 降低延迟:流水线可以减少单个指令的执行时间,因为不同指令的不同阶段可以并行执行,从而降低了整体处理时间。
  3. 高效利用资源:通过并行处理,流水线可以更充分地利用处理器资源,提高系统整体的效率和性能。

3 什么是乱序执行?

乱序执行是一种在处理器设计中用于提高指令执行效率的技术,以下是其相关介绍:

定义

乱序执行允许处理器在不影响程序最终结果的前提下,不按照指令在程序中的顺序来执行指令。处理器会分析指令之间的数据依赖关系,将可以并行执行的指令提前执行,以充分利用处理器的资源,提高整体性能。

工作原理

  • 指令分发与分析:处理器将指令从指令队列中取出后,会对指令进行分析,检查指令之间的数据依赖关系。例如,对于指令序列 “ADD R1, R2, R3; SUB R4, R1, R5”,处理器会发现第二条减法指令依赖于第一条加法指令的结果,而其他不相关的指令则可以提前执行。
  • 调度执行:处理器根据分析结果,将没有数据依赖的指令调度到相应的功能单元进行执行,而不是按照指令的原始顺序。比如,在有多个功能单元(如加法器、乘法器等)的处理器中,即使一条乘法指令在程序中位于一条加法指令之后,但如果加法指令依赖于前面尚未完成的指令结果,而乘法指令没有数据依赖,那么乘法指令就可以先于加法指令被执行。
  • 结果排序与提交:虽然指令是乱序执行的,但处理器会确保指令的结果按照程序的顺序进行提交和写回寄存器或内存,以保证程序的正确性。也就是说,处理器会在后台跟踪指令的执行情况,在所有依赖该指令结果的后续指令都执行完后,才将结果按顺序写回,使得从程序的角度看,指令似乎是按顺序执行的。

优势

  • 提高资源利用率:避免了处理器资源因等待某些指令的完成而闲置。例如,当一条指令因数据未准备好而等待时,其他不依赖该数据的指令可以继续执行,充分利用了处理器的运算单元、寄存器等资源,提高了处理器的整体利用率。
  • 提升指令执行效率:通过将可以并行的指令提前执行,减少了程序的执行时间。在复杂的程序中,存在大量的指令级并行性,乱序执行技术能够挖掘这些并行性,使处理器在单位时间内执行更多的指令,从而提高程序的运行速度。

4 什么是超流水线?

超流水线是一种进一步提高处理器性能的流水线技术,通过增加流水线的级数,使每个阶段的任务更加细化,从而在更高的时钟频率下运行,以下是其详细介绍:

原理

  • 增加流水线级数:传统流水线通常分为几级,如 5 级或 8 级,而超流水线将流水线级数进一步增加到 10 级以上,甚至几十级。例如,将原本在一个阶段完成的复杂操作,如指令译码,细分为多个子阶段,每个子阶段只完成一部分简单的操作。这样每个子阶段的处理时间更短,能够适应更高的时钟频率。
  • 提高时钟频率:由于每个阶段的任务变得更简单、处理时间更短,处理器可以在更高的时钟频率下工作。例如,一个普通流水线处理器的时钟频率为 1GHz,采用超流水线技术后,可能将时钟频率提高到 2GHz 甚至更高。在相同的时间内,更高的时钟频率意味着处理器可以执行更多的指令,从而提高性能。

特点

  • 高指令吞吐量:超流水线技术通过提高时钟频率和增加指令并行度,能够在单位时间内处理更多的指令,从而提高指令的吞吐量。这对于处理大量数据和复杂任务的应用程序非常有利,如多媒体处理、科学计算等。
  • 硬件复杂度相对较低:与其他提高性能的技术(如超标量技术)相比,超流水线技术主要是通过增加流水线级数和提高时钟频率来实现性能提升,不需要大量增加硬件功能单元。因此,在实现相同性能提升的情况下,超流水线处理器的硬件复杂度相对较低,芯片面积和功耗增加相对较小。
  • 对指令级并行性要求高:为了充分发挥超流水线技术的优势,需要程序具有较高的指令级并行性。因为只有当有足够多的指令可以同时在不同的流水线阶段并行执行时,才能体现出超流水线技术的高性能。如果程序中的指令存在较多的数据依赖和控制依赖,导致指令无法并行执行,那么超流水线技术的效果就会受到限制。

5 什么是交叉编译?为何要有交叉编译

交叉编译是指在一个操作系统平台上编译生成另一个不同平台的可执行程序或库文件的过程。一般情况下,交叉编译是在一台计算机上进行,但生成的目标文件将在另一种不同的处理器架构或操作系统上运行。

为什么要进行交叉编译呢?主要有以下几个原因:

  1. 跨平台开发:有些应用程序或驱动程序需要在不同的硬件平台上运行,例如在嵌入式系统中或移动设备上。通过交叉编译,在一个平台上可以开发和测试代码,然后将生成的目标文件移植到目标平台上运行,提高了开发效率。
  2. 资源限制:某些目标平台的资源(如处理器、内存、存储等)可能受限制,而在开发环境中有更强大的资源。通过交叉编译,可以利用开发环境的资源进行编译,生成在目标平台上运行所需的较小且高效的可执行文件。
  3. 代码保护:有时候,开发者希望保护他们的代码不被轻易读取和修改。通过交叉编译,可以对代码进行编译和加密,生成的目标文件具有更高的安全性。
  4. 平台特定优化:不同的处理器架构或操作系统有不同的特性和优化方式。通过交叉编译,可以针对特定的目标平台进行优化,生成更高效、更精简的代码。

6 什么是ARM架构?有什么特点?

ARM架构是一种低功耗、高性能以及成本效益高的处理器架构,由ARM Holdings开发并广泛应用于移动设备、嵌入式系统和其他领域。它具有以下特点:

  1. 低功耗:ARM架构专注于低功耗设计,可延长电池寿命并减少能源消耗。它在使用功耗管理技术和优化设计方面表现出色。
  2. 强大的性能:尽管低功耗设计,ARM架构仍能提供强大的性能,多核处理器的设计使其适应多线程应用。
  3. 灵活性:ARM架构是可定制的,可以根据不同的需求进行配置,并且适用于各种应用,从移动设备到网络设备和汽车。
  4. 易于集成:ARM架构的处理器芯片可以与其他硬件和软件组件轻松集成,使其成为系统设计的理想选择。
  5. 跨平台兼容性:ARM架构具有广泛的兼容性,可以在不同的操作系统和平台上运行,例如Android、iOS、Windows等。

大部分嵌入式芯片使用的都是arm架构,下边是几种常见架构的对比:

芯片架构

特点与优势

应用领域

ARM

- 低功耗、高性能

- 灵活可定制

- 广泛兼容性

移动设备、嵌入式系统、物联网设备等

x86

- 高性能

- 生态系统成熟

- 处理复杂计算任务

PC、服务器等

MIPS

- 高性能和低功耗

- 嵌入式系统领域应用广泛

嵌入式系统、网络设备等

Power

- 强大的计算性能

- 可靠性高

高性能计算、服务器、超级计算机等

RISC-V

- 开放、可定制

- 逐渐获得关注

低功耗嵌入式、物联网设备等

7 ARM处理器的几种模式?各自都是什么类型?

ARM 处理器有 7 种运行模式,这些模式可分为特权模式和非特权模式,下面为你详细介绍:

非特权模式

  • 用户模式(User,USR)类型:这是正常的程序执行模式,大部分应用程序都在该模式下运行。特点:该模式下,处理器只能访问部分指令和寄存器,没有对系统资源的完全控制权,这样可以保护系统免受应用程序的非法操作影响,保证系统的稳定性和安全性。

特权模式

特权模式又可细分为系统模式和异常模式。

系统模式(System,SYS)

  • 类型:属于特权模式,但和异常模式不同,它可以使用所有的系统资源,并且可以直接切换到其他模式。
  • 特点:系统模式主要用于运行操作系统的特权任务,比如管理系统资源、进行任务调度等。和用户模式使用相同的寄存器组,但拥有更高的权限。

异常模式

异常模式是在特定异常发生时进入的模式,共有 5 种。

  • 快速中断模式(Fast Interrupt Request,FIQ)类型:用于处理高速中断,以快速响应外部设备的高速数据传输等紧急事件。特点:拥有独立的寄存器组,在响应中断时可以减少寄存器的保存和恢复操作,从而提高中断处理的速度。例如,在处理高速的图像数据采集等场景时能发挥优势。
  • 外部中断模式(Interrupt Request,IRQ)类型:用于处理普通的外部中断请求,这是比较常见的一种中断处理模式。特点:当外部设备(如键盘、鼠标等)发出中断请求时,处理器会进入该模式进行相应的处理。相比于 FIQ,它的响应速度相对较慢,但能处理更多类型的外部中断。
  • 管理模式(Supervisor,SVC)类型:主要用于处理系统调用,是操作系统内核的工作模式。特点:当用户程序需要调用操作系统的服务(如创建进程、读写文件等)时,会触发软中断进入管理模式。操作系统在该模式下完成相应的系统服务操作,保证系统资源的安全管理和合理分配。
  • 中止模式(Abort,ABT)类型:分为指令预取中止和数据中止两种情况。指令预取中止是指在取指令时发生错误,数据中止是指在访问数据时发生错误。特点:当出现内存访问错误、页面错误等情况时,处理器会进入中止模式,进行错误处理和恢复操作,以保证程序的正常运行。
  • 未定义指令模式(Undefined Instruction,UND)类型:当处理器遇到不能识别的指令时,会进入该模式。特点:在该模式下,系统可以通过软件模拟未定义的指令,或者进行错误处理,给出相应的错误提示信息。

模式

意义

类型

说明

用户模式(usr)

ARM处理器正常的程序执行状态

非特权模式

用于普通的应用程序执行

快速中断模式(FIQ)

处理高速数据传输或通道处理

特权模式

异常模式

外部中断模式(IRQ)

处理通用的中断请求

特权模式

异常模式

管理模式(svc)

操作系统使用的保护模式

特权模式

异常模式

数据访问中止模式(abt)

处理数据或指令预取中止的情况,用于虚拟存储及存储保护

特权模式

异常模式

系统模式(sys)

运行具有特权的操作系统任务

特权模式

普通模式

未定义指令中止模式(und)

处理未定义指令的情况,支持硬件协处理器的软件仿真

特权模式

异常模式

8 ARM处理器的模式怎么切换?

  • 执行软中断(SWI)指令可以使处理器从用户模式切换到管理(Supervisor)模式。这通常由操作系统使用,用于执行特权级别的任务和系统功能。
  • 外部中断发生时,处理器会根据中断类型自动切换到IRQ(Interrupt Request)模式或FIQ(Fast Interrupt Request)模式,以处理相应的外部事件。
  • 在处理器执行过程中产生异常时,例如由于MMU保护引起的内存访问异常,处理器会切换到数据访问中止(Abort)模式。对于无效指令,处理器将会进入未定义指令中止(Undefined)模式,这些异常情况需要被处理和解决。
  • 最后,System模式是一种无法自动进入的模式,程序员需要编写指令来进入该模式。在一般情况下,操作系统在通过SWI指令进入Supervisor模式后,可能会进行特权级别的操作后,需要进入System模式执行某些特定的系统级任务。

9 ARM架构下有多少个寄存器?各自的作用类型?

在 ARM 架构下,不同的处理器模式下可用的寄存器数量和种类有所不同,但总体上可分为通用寄存器、程序状态寄存器等,下面为你详细介绍:

通用寄存器

ARM 架构有 16 个通用寄存器(R0 - R15),但在不同模式下部分寄存器是备份寄存器,即不同模式下使用的可能是不同的物理寄存器。通用寄存器又可进一步分为未分组寄存器、分组寄存器。

未分组寄存器(R0 - R7)

  • 数量:8 个。
  • 特点:在所有处理器模式下,这些寄存器都是同一个物理寄存器,不被特定模式独占。它们可用于数据的暂存、传递参数、存储计算结果等,是最常用的寄存器。例如在函数调用时,R0 - R3 通常用于传递函数的前几个参数,R0 还常用来存储函数的返回值。

分组寄存器(R8 - R14)

  • 数量:7 个,但在不同模式下有不同的备份寄存器,实际物理寄存器数量多于 7 个。R8 - R12:在 FIQ 模式下有独立的备份寄存器(R8_fiq - R12_fiq),而在其他模式下共用一组寄存器。这使得 FIQ 模式在处理高速中断时可以快速保存和恢复数据,提高中断处理效率。R13(堆栈指针,SP):每个异常模式都有自己独立的 R13 寄存器,分别记为 R13_<mode>(如 R13_svc、R13_irq 等)。它主要用于指向当前模式下的堆栈栈顶,在进行函数调用、中断处理等操作时,用于保存和恢复现场数据。R14(链接寄存器,LR):同样每个异常模式都有自己独立的 R14 寄存器,记为 R14_<mode>。在发生子程序调用或异常时,R14 用于保存返回地址,使得程序在执行完子程序或异常处理后能正确返回到原来的位置继续执行。

R15(程序计数器,PC)

  • 数量:1 个。
  • 特点:用于存储当前正在执行的指令地址或下一条即将执行的指令地址。在 ARM 架构中,PC 的值决定了程序的执行流程,通过修改 PC 的值可以实现程序的跳转、分支等操作。

程序状态寄存器

  • 当前程序状态寄存器(CPSR)数量:1 个。特点:所有处理器模式下都可以访问该寄存器。它包含了条件码标志位、中断禁止位、当前处理器模式标志位等重要信息。条件码标志位(如 N、Z、C、V)用于反映算术和逻辑运算的结果状态,中断禁止位(I、F)用于控制是否允许 IRQ 和 FIQ 中断,模式标志位用于指示当前处理器所处的模式。
  • 备份程序状态寄存器(SPSR)数量:除用户模式和系统模式外,每个异常模式都有一个对应的 SPSR(SPSR_<mode>)。特点:当发生异常时,处理器会将 CPSR 的值保存到对应的 SPSR 中,在异常处理结束后,再将 SPSR 的值恢复到 CPSR 中,以恢复之前的程序状态。

综上所述,ARM 架构下的寄存器共同协作,完成数据的存储、运算、程序流程控制以及状态信息的记录等功能,为处理器的正常运行提供了基础支持。

寄存器名称

具体作用

R13 (SP)

用作堆栈指针,存储当前堆栈顶部的地址。在函数调用时用于存储局部变量和参数。

R14 (LR)

存储调用子程序时的返回地址,用于在子程序执行完毕后返回到调用函数的下一条指令。

R15 (PC)

存储下一条要执行的指令的地址,指示当前执行的指令位置。

CPSR

存储当前处理器的状态信息,如当前模式、条件标志位、中断使能位等。用于程序状态的管理和控制。

SPSR

保存上一个模式下的程序状态寄存器的值,用于在异常处理或者中断处理时保存先前的程序状态寄存器信息。

控制寄存器

用于处理器的控制和配置,包括处理器模式切换、中断控制等。

中断相关寄存器

用于管理和控制中断,包括中断屏蔽寄存器、中断优先级寄存器等。

浮点寄存器

用于浮点运算的特殊寄存器,存储浮点运算所需的数据和控制信息。

VBAR

向量表基址寄存器,存储中断向量表的地址,用于指示中断处理程序的入口地址。

10 ARM指令集可以分为哪几种类型?

ARM指令集可以分为以下几种类型:

  1. 数据处理指令(Data Processing Instructions):数据处理指令用于对寄存器中的数据进行算术运算、逻辑运算、移位操作等。这些指令可以对寄存器中的数据进行加减乘除等数学运算,也可以执行位与、位或、位异或等逻辑运算。
  2. 加载/存储指令(Load/Store Instructions):加载/存储指令用于从内存中加载数据到寄存器或将寄存器中的数据存储到内存中。这些指令包括加载字(Word)、半字(Halfword)、字节(Byte)等不同大小的数据。
  3. 分支和跳转指令(Branch and Jump Instructions):分支和跳转指令用于改变程序的执行流程。这些指令可以根据条件进行分支跳转,或者无条件地改变程序计数器(PC)的值以实现跳转到指定的地址。
  4. 控制指令(Control Instructions):控制指令用于控制处理器的操作模式、中断使能、异常处理和处理器状态等。这些指令可以切换处理器的模式,使其进入中断模式、用户模式、特权模式等,也可以启用和禁用中断、异常等。
  5. 协处理器指令(Coprocessor Instructions):协处理器指令用于与附加协处理器进行交互,执行特定的协处理器操作。这些指令主要用于执行浮点运算、加速加密算法等特定的计算和处理任务。

11 ARM架构中的Cache是什么?

在ARM架构中,Cache(缓存)是一种用于提高处理器性能的高速存储器,用于存储最常用的数据和指令。Cache位于处理器和主内存之间,通过减少对主内存的访问次数来加快数据的读取和写入速度。

Cache的主要思想是利用局部性原理,即程序在某个时刻访问的数据很可能在近期或将来的某个时刻再次被访问。Cache中将存储那些频繁被访问的数据块(通常是以缓存行为单位),以作为对主内存中数据的一种缓存。

工作原理如下:

  1. 当处理器需要读取数据时,首先会检查Cache中是否存在该数据。如果存在,就直接从Cache中获取数据,避免了对主内存的访问。
  2. 如果Cache中不存在所需数据或需要写入数据,就触发一次缓存访问。处理器会按照一定的缓存替换策略(如最近最少使用)将新的数据加载到Cache中,并将旧的数据替换出去。
  3. 当数据从Cache写回主内存时,处理器会保证将相应的缓存行中的数据写回到主内存中。

Cache的引入可以显著提高数据的访问速度,尤其是对于频繁访问的数据。Cache的大小和配置通常由具体的处理器设计决定,不同的处理器可能具有不同级别和层次的Cache结构(如L1 Cache、L2 Cache等),以便更好地适应各种应用场景和性能需求。

二 Cortex-M处理器⭐⭐⭐⭐⭐

1 Cortex-M处理器简介

Cortex-M处理器是由英国ARM(Advanced RISC Machines)公司开发的一系列32位嵌入式处理器,旨在提供出色的性能、低功耗和成本效益,适用于广泛的应用市场。它们采用了精简指令集(Reduced Instruction Set Computing,RISC)的架构,具有低功耗、高速度、低时延和紧凑的代码特点,因此非常适于实现计算资源受限的嵌入式应用

Cortex-M系列包括多个型号,主要区别在于处理速度和外设数量。具体来说,Cortex-M0和Cortex-M0+针对成本敏感和功耗受限的应用,性能较低,但具有较低的电力消耗和小体积;Cortex-M3和Cortex-M4处理器适合中型嵌入式系统,具有硬件浮点支持,可提高处理器性能;Cortex-M7则是该系列中速度最快的型号,处理器性能非常强劲。

Cortex-M处理器具有以下几个显著的特点:

  1. 精简指令集(RISC):指令集简单、直观,执行速度快且高效。
  2. 统一的体系结构:Cortex-M0/0+/3/4/7处理器采用了相同的指令集和体系结构,这使得软件开发具有一定的可移植性。
  3. 低功耗:Cortex-M处理器在设计时被优化为低功耗,节能性能强。
  4. 优秀的内存保护和调试:Cortex-M处理器支持内存保护和硬件调试,可大大提高系统的可靠性和安全性。
  5. 丰富的外设:-Cortex-M系列拥有丰富的外设,包括模数转换器(ADC),时钟生成器(CLK),通信接口(SPI,I²C),万能异步收发器(UART)等等。

综上所述,Cortex-M系列处理器适用于广泛的应用市场,特别是那些需要高性能和低功耗特性的嵌入式应用程序。它们被广泛应用于智能手机、智能家居、工业控制、汽车电子和医疗设备等嵌入式系统。

2 Cortex-M处理器优势

Cortex-M处理器具有以下几个优点:

  1. 高性能:Cortex-M系列处理器可以操作复杂的算法和处理大型数据集,具有高效的执行速度和处理能力。
  2. 低功耗:Cortex-M系列处理器被设计为低功耗,对于那些需要长时间运行的移动设备和嵌入式系统来说,它们是非常理想的选择。
  3. 统一的体系结构:Cortex-M系列处理器采用了相同的指令集和体系结构,这意味着代码和算法可以轻松地移植到不同的芯片上。
  4. 易于开发:使用Cortex-M系列处理器的嵌入式系统可以使用广泛的开发工具和编程语言进行编程,例如Keil、IAR和GCC等。
  5. 丰富的外设:Cortex-M系列处理器可以集成多种外设,包括模数转换器、时钟生成器、通信接口和万能异步收发器等,这大大简化了系统设计和集成。
  6. 内存保护和调试:Cortex-M系列处理器具有内存保护和硬件调试功能,可以帮助开发人员更有效地进行软件调试和开发,增加系统的可靠性和安全性。

综上所述,Cortex-M处理器的高性能、低功耗和丰富的外设等优点,加上其易于开发和移植的特性,使它成为嵌入式系统设计中常用的处理器之一。

三 嵌入式软件开发 ⭐⭐⭐⭐⭐

1 ARM微控制器构成

ARM微控制器通常由以下几个组成部分构成:

  1. ARM Core:即ARM内核,它是微控制器的主要计算资源。ARM Core是借助SoC(System-on-a-Chip)技术集成到微控制器中的,可运行各种操作系统和应用程序。
  2. 外设:包括UART、SPI、I2C等通信接口、GPIO(General Purpose Input/Output)PIN、基本的定时器/计数器等,这些外设可以与其他器件进行通信,控制和监测。
  3. 存储器:特别是闪存和SRAM,其中闪存用于存储程序、数据和EEPROM,SRAM用于存储临时数据和寄存器。
  4. ADC(模数转换器)和DAC(数模转换器):ADC用于将模拟信号转换为数字信号,而DAC用于将数字信号转换为模拟信号。
  5. 时钟和定时器:微控制器通常带有内部或外部时钟源,并带有定时器和计数器,用于各种时间测量和控制。
  6. 电源管理:在微控制器系统中,最小化电源使用对于设计至关重要。这些器件带有睡眠和低功耗模式,以在不使用时降低电源。

综上所述,上述部分构成了ARM微控制器的主要构成部分。每个微控制器芯片可以按照应用程序的不同要求编程并控制各种机器。这种通用性和可编程性使它们成为广泛应用的技术,用于控制和调节各种应用和硬件系统,包括机器人、人工智能和自动控制系统等。

2 软件开发流程

软件开发流程是一部分软件开发方法中的一环,以确保软件按照质量要求和客户需求进行开发。软件开发流程通常包括以下几个阶段:

  1. 需求分析和定义:在这个阶段,开发人员和客户共同确定软件的功能和特性。需求分析和定义是软件开发流程中最重要的一个步骤,因为一旦确定了软件的需求,开发人员将按照这些需求进行开发。
  2. 设计:在这个阶段,开发人员制定软件的架构和设计,包括文件、分布式系统和设计模式等方面。设计是软件开发流程中一个充满挑战和争议的部分,因为它在一定程度上影响了软件的维护性和可扩展性。
  3. 开发:在这个阶段,开发人员将开始编写软件代码。在此期间,一些测试工作也会展开,以确保代码的功能、正确性和可扩展性。
  4. 测试和集成:在开发结束后,开发人员和测试人员一起进行测试和集成,确保软件在各种环境下均能稳定运行。
  5. 发布和部署:在测试和集成通过后,开发人员会发布软件并准备部署。
  6. 维护:一旦软件发布,维护人员们就会开始维护和更新软件,包括修复缺陷、添加新功能和更新现有功能等。

综上所述,软件开发流程是一个长期的过程,它需要跨不同阶段的合作和交互。通过合理分配人力资源和合理分配时间,团队能够更加高效地开发出高质量的软件。

3 编译应用程序

编译应用程序是将源代码转换为计算机可执行的代码的过程。以下是编译应用程序的基本步骤:

  1. 预处理:在这个步骤中,编译器将源代码中的宏替换、头文件包含等预处理指令进行处理,生成一个中间代码文件。
  2. 编译:在编译阶段中,编译器将预处理生成的中间代码文件转换成汇编代码。
  3. 汇编:在汇编阶段中,汇编器将汇编代码转换为可重定位的二进制代码。
  4. 链接:在链接阶段中,链接器将多个不同的可重定位二进制代码文件组合成一个完整的可执行二进制代码。它还将解析和修正符号引用,并在运行时启动程序所需的动态链接库等。

这些步骤中的输出文件通常是中间文件和可执行文件。中间文件用于下一步处理,而可执行文件是由操作系统用于执行应用程序的文件。

值得注意的是,这些步骤的实现可能因操作系统和编译器不同而有所不同。因此,了解特定操作系统和编译器的编译过程是很重要的。

4 软件流程

1 轮询

轮询(Polling)是一种常见的计算机通信方法,用于检查外部设备的状态或者获取数据。它的工作方式是不断地检查某个设备或者数据源是否有数据或者需要处理,如果有,就进行相应的处理,否则继续等待下一次轮询。轮询是一种简单的实现方式,通常用于低频率、低带宽的通信场景,比如串口通信、键盘输入等

轮询通常包括以下几个步骤:

  1. 启动轮询,设置轮询周期和检查条件。
  2. 不断检查设备或者数据源是否有数据或者需要处理。
  3. 如果有数据或者需要处理,执行相应的操作。
  4. 继续等待下一次轮询,重复步骤2和步骤3。

轮询的优点在于简单易实现,可以适应各种不同的通信方式。但是,轮询会在设备或者数据源没有数据时浪费处理时间,造成资源浪费。同时,如果轮询周期设置不当,可能会导致响应延迟较长,影响实时性能。

2 中断驱动

中断是一种计算机体系结构中的通信方式,在外部事件(如输入/输出操作、定时器事件、硬件异常等)发生时向处理器发出信号,使得处理器暂停当前任务并执行一个预定的中断处理程序。中断可以将设备的输入/输出操作与CPU的处理分离开来,从而提高系统的并行度和响应速度,使得处理器可以及时响应外部事件,并进行相应的处理

中断驱动是一种基于中断的编程模型,它将程序的控制权从原本的顺序执行转变为响应外部事件的中断处理程序,当处理器收到一个中断信号时,它将暂停当前任务的执行,跳转到中断处理程序中去执行相应的操作。

中断驱动编程的优点在于会使得CPU能够更好地利用外部资源,减少CPU等待时间,提高系统的并发性和实时性能。同时,中断驱动可以消除轮询操作的额外处理时间,降低系统的负载,节省可以用于其他任务的处理时间。不过,中断驱动编程需要更多的软硬件支持,同时需要合理的中断处理程序设计,以充分发挥中断的效果。

总而言之,中断驱动是一种高效、低延迟、实时性强的编程模型,适用于诸如通信、控制、嵌入式系统等场景中。

3 多任务系统

多任务系统,也被称为多任务操作系统,是一种可以同时运行多个任务(或进程)的操作系统。在多任务系统中,每个任务都可以独立地运行,并且相互之间不会产生影响。多任务系统一般有两种运行方式:

1.分时多任务系统:分时多任务系统通常在同一时间只有一个任务能够执行,每个任务运行一定的时间后,系统进行上下文切换,将处理器的控制权交给下一个要执行的任务。在分时多任务系统中,系统会给每个任务分配固定的时间片,以保证每个任务都能够得到合理的执行机会。

2.抢占式多任务系统:抢占式多任务系统则允许每个任务在需要时抢占处理器,也就是允许任务在运行过程中进行任务切换。在抢占式多任务系统下,系统会允许优先级高的任务抢占当前执行的任务进行执行,以保证高优先级任务的实时性和及时性。

多任务系统可以极大地提高系统的效率和实时性能,同时也可以实现更丰富的功能。与单任务系统相比,多任务系统不仅可以大大减少系统响应速度慢的情况,而且还允许实现一些复杂的功能,如多线程编程,网络通信等。多任务系统广泛应用于嵌入式系统、桌面系统、服务器系统等各个领域中,是现代计算机系统不可或缺的组成部分之一。

5 数据类型

在计算机程序设计中,数据类型是指数据的值和操作方式的集合。它用于规定数据的内部存储类型,以及数据在程序中的使用方式和操作方式。

计算机程序设计中常见的数据类型包括:

  1. 整型(integer):用于表示整数,包括有符号和无符号两种类型。
  2. 浮点型(float):用于表示实数,包括单精度浮点数和双精度浮点数两种类型。
  3. 布尔型(boolean):用于表示真和假两种状态。
  4. 字符型(char):用于表示一个字符,包括 ASCII 码和 Unicode 码两种字符集。
  5. 字符串型(string):用于表示一串字符组成的字符串。
  6. 数组(array):用于表示一组数据元素的集合,可以是一维或多维的。
  7. 结构体(struct):用于表示多个不同类型的数据元素组成的结构体。
  8. 指针(pointer):用于表示一个内存地址,可以用来访问和修改该地址的数据内容。
  9. 空类型(void):用于表示没有任何值的类型。

不同的编程语言和开发环境支持的数据类型可能有所不同,但基本的数据类型大致是相同的。在程序设计中,了解和正确使用数据类型是非常重要的。

6 Cortex-M处理器框架

四 硬件基础 ⭐⭐⭐⭐⭐

1 NAND FLASH和NOR FLASH异同

NAND Flash和NOR Flash是两种不同类型的闪存存储器,它们之间有以下的异同点:

存储单元组织方式:

NAND Flash将存储单元组织成了一个大的数据块,可以高效地进行批量读写操作,而NOR Flash则将存储单元组织成了一个个的字节,每个字节独立访问,可以进行随机读写操作

存储密度:

NAND Flash可以实现更高的存储密度,因为它将存储单元组织成了大块数据,可以在一个芯片上容纳更多的存储单元。而NOR Flash的存储密度相对较低。

读写速度

NOR Flash的读写速度相对较快,因为它支持随机读写操作。而NAND Flash的连续读写速度更快,但随机读写速度较慢

价格:

NAND Flash的价格相对较低,因为它可以实现更高的存储密度,而NOR Flash的价格相对较高。

用途:

NAND Flash主要用于存储大量数据,如手机存储、MP3播放器、摄像机等。而NOR Flash主要用于存储小量数据,如BIOS芯片、嵌入式系统的代码存储等。

2 CPU,MPU,MCU,SOC,SOPC联系和区别?

CPU、MPU、MCU、SOC、SOPC都是数字电子技术中的术语,以下是它们的联系和区别:

CPU(Central Processing Unit)中央处理器:是计算机系统中最主要的处理器,负责执行指令并控制计算机的运行。CPU通常由控制器、算术逻辑单元(ALU)和一组寄存器组成。

MPU(Microprocessor Unit)微处理器:是一种集成电路芯片,包含了一个或多个CPU内部的功能模块,如存储器管理、输入输出控制、时钟和定时器等。MPU通常被用于嵌入式系统中。

MCU(Microcontroller Unit)微控制器:是一种集成电路芯片,包含了一个或多个CPU、存储器、输入输出接口、时钟和其他外设。MCU通常被用于嵌入式系统中,具有高度的集成度和低功耗特性。

SOC(System-on-a-Chip)片上系统:是一种集成电路芯片,包含了多个处理器核心、存储器、外设和其他系统组件。SOC是一种高度集成的解决方案,通常被用于移动设备、消费类电子产品等领域。

SOPC(System-on-a-Programmable-Chip)可编程片上系统:是一种基于FPGA(Field Programmable Gate Array)等可编程器件的SOC解决方案,可以根据需求进行重新配置和定制。SOPC通常被用于嵌入式系统中。

3 什么是交叉编译?

交叉编译是指在一台计算机上为另一种不同的计算机体系结构编译程序的过程。在交叉编译的过程中,编译器和相关的工具链会生成适用于目标计算机体系结构的可执行文件或库文件

交叉编译通常用于开发嵌入式系统和移动设备应用程序,因为这些设备通常基于不同的处理器体系结构,并且资源有限,无法进行本地编译。在这种情况下,开发人员可以使用一台高性能计算机进行交叉编译,然后将编译后的程序或库文件移植到目标设备中。

交叉编译需要使用专门的工具链,包括交叉编译器、交叉汇编器、交叉链接器等,这些工具链会根据目标计算机体系结构的不同进行相应的调整和优化。开发人员需要在交叉编译的过程中指定目标平台的体系结构、操作系统和其他相关的配置信息。

交叉编译的优点是可以在不同的平台之间方便地移植和部署应用程序,同时可以提高开发效率和代码可重用性。不过,交叉编译也存在一些挑战,例如需要针对不同的平台进行不同的优化和调试,需要对目标平台有一定的了解和掌握。

4 为什么需要交叉编译?

需要交叉编译的主要原因是在不同的计算机体系结构之间移植和部署应用程序。以下是一些常见的情况:

嵌入式系统开发:嵌入式系统通常使用特定的处理器和操作系统,如ARM、MIPS、PowerPC等。在开发嵌入式系统时,需要使用交叉编译器将应用程序编译为可以在目标平台上运行的二进制文件

移动设备应用程序开发:移动设备包括智能手机、平板电脑等,这些设备通常使用不同于传统PC的处理器体系结构,如ARM、x86等。在开发移动设备应用程序时,需要使用交叉编译器将应用程序编译为适用于移动设备的二进制文件。

跨平台开发:有些应用程序需要在多个平台上运行,如Windows、Linux、macOS等。在这种情况下,可以使用交叉编译器将应用程序编译为适用于不同操作系统和体系结构的二进制文件。

提高开发效率:使用交叉编译器可以在开发和测试阶段使用更快速和强大的开发机器进行编译,从而提高开发效率和代码可重用性。

5 嵌入式基于ROM和基于RAM的运行方式有什么区别?

在嵌入式系统中,程序可以在ROM(只读存储器)或RAM(随机存储器)中运行。基于ROM和基于RAM的运行方式有以下区别:

存储介质:基于ROM的系统的程序代码存储在只读存储器中,而基于RAM的系统的程序代码存储在随机存储器中。由于ROM是只读的,因此程序代码无法修改,而RAM可以读写,因此程序代码可以在运行时进行修改

启动时间:基于ROM的系统在启动时会将程序代码从ROM复制到RAM中,然后在RAM中运行程序。这个过程需要一定的启动时间,因此基于ROM的系统启动速度相对较慢。基于RAM的系统则不需要将程序代码从ROM复制到RAM中,因此启动时间更快

可靠性:由于ROM是只读的,因此基于ROM的系统相对更可靠,不容易受到病毒、恶意软件等攻击。而基于RAM的系统则需要进行内存保护和安全措施,以保证系统的可靠性和安全性

程序更新:由于ROM是只读的,因此在基于ROM的系统中,如果需要更新程序代码,需要将整个ROM芯片替换为新的ROM芯片。而基于RAM的系统则可以通过网络或其他渠道进行程序更新,不需要替换芯片

6 ROM RAM的概念浅析

特征

ROM(只读寄存器)

RAM (随机存取存储器)

可读写

只读

可读写

数据固化

数据易失性

数据保持性

断电时数据保持不变

断电时数据丢失

访问方式

顺序读取

随机读取

用途

存储固件、引导程序、常量数据等

存储操作系统、应用程序、临时数据等

访问速度

相对较慢

相对较快

存储容量

通常较小

通常较大

五 ARM处理器 ⭐⭐⭐⭐⭐

1 哈弗结构和冯诺依曼结构介绍和区别

哈弗结构(Harvard Architecture)是一种分离存储器的计算机体系结构。在哈弗结构中,指令和数据存储在不同的物理存储器中,分别由指令存储器(Instruction Memory)和数据存储器(Data Memory)来处理。这种结构在处理器内部有两条并行的总线,一条用于访问指令存储器,一条用于访问数据存储器。哈弗结构因为可以同时访问指令和数据,因此在某些应用中可以提高计算机的性能

冯诺依曼结构(Von Neumann Architecture)是一种存储程序的计算机体系结构。在冯诺依曼结构中,指令和数据存储在同一块物理存储器中,通过指令指针(Instruction Pointer)来区分指令和数据。由于指令和数据使用同一条总线传输,因此在执行程序时必须按照一定的顺序去执行

区别:

存储器结构不同:哈弗结构中指令和数据存储在不同的物理存储器中,而冯诺依曼结构中指令和数据存储在同一块物理存储器中。

总线使用不同:哈弗结构中有两条并行的总线分别用于访问指令存储器和数据存储器,而冯诺依曼结构中使用同一条总线传输指令和数据。

处理器工作方式不同:由于存储器结构和总线使用不同,哈弗结构的处理器可以同时访问指令和数据,而冯诺依曼结构的处理器必须按照一定的顺序去执行程序。

应用场景不同:哈弗结构适用于需要高速访问指令和数据的应用,如数字信号处理、嵌入式系统等;而冯诺依曼结构则适用于通用计算机,如个人电脑、服务器等。

2 请说说CPU的内核态与用户态

多数CPU都有两种模式,即与。通常,在中有一个二进制位控

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

嵌入式/C++面试八股文 文章被收录于专栏

#承诺提供免费技术答疑# 本专栏主要是介绍嵌入式开发岗位相关知识和学习攻略。“C/C++软件开发岗位”也可以参考。 该专栏覆盖了嵌入式求职过程中99%常见面试题,详细讲解了嵌入式软件开发岗位、学习攻略、项目经验分享、面试心得,从技术面,HR面,主管面,谈薪一站式服务。订阅即赠送简历模板、内推机会,需要的同学点击我头像私信即可!

全部评论
如果大家觉得可以帮助到自己,麻烦点赞、评论和订阅哦😀
1 回复 分享
发布于 03-03 14:06 江苏
如果文章中有错误之处,欢迎各位评论指出错误。
点赞 回复 分享
发布于 03-15 10:23 安徽
点赞 回复 分享
发布于 03-12 10:30 江苏
点赞 回复 分享
发布于 03-11 21:36 安徽

相关推荐

评论
5
22
分享

创作者周榜

更多
牛客网
牛客企业服务