02_ARM体系与架构

文章目录

1 硬件基础

1.1 CPU的内部结构?

CPU的内部结构大致可以分为: 控制单元(指令寄存器、指令译码器、操作控制器)、 运算单元(算术逻辑单元)、存储单元(专用寄存器和通用寄存器)、时钟。

1.2 大小端相关知识点(定义,优缺点,转化,判断)

定义
小端:一个数据的低位字节数据存储在低地址;大端:一个数据的高位字节数据存储在低地址。
例如:int a=0x12345678; //a首地址为0x200。大端存储格式如下:
02_ARM体系与架构
优缺点
大端优点:符号位在低地址的第一个字节中,便于快速判数据的正负和大小。
小端优点:CPU做数值运算的时候是依次从内存的低位到高位取数据进行运算,这样运行效率更高。强制转换数据不需要调整字节内容,因为1、2、4字节数据的存储方式一样。
大小端转化
对一个输入的整型数进行大小端存储模式转化。

#include <stdio.h>
#include <string.h>
int endian_convert(int input)  
{
    int result = 0;  
    int size = sizeof(input);//4
    while(size--)
    {
        result |= ((input & 0xff) << (size * 8));
        input >>= 8;
    }
    return result;
}
int main(void)
{
    int num = 0x12345678;
    printf("before:%x\n", num);
    printf("endian_convert:%x\n", endian_convert(num));
    return 0;
} 

判断
方法一:int *强制类型转换为char *,用[]*解引用

  void checkCpuMode(void)  
  {  
      int c = 0x12345678;  
      char *p = (char *)&c;  
      if(p[0] == 0x12)  
          printf("Big endian.\n");  
      else if(p[0] == 0x78)  
          printf("Little endian.\n");  
      else  
          printf("Uncertain.\n");  
  } 

方法二:包含short跟char的共用体

  void checkCpuMode(void)  
  {  
      union Data  
      {  
          short a;  
          char b[sizeof(short)];  
      }data;  
      data.a = 0x1234;  
    
      if(data.b[0] == 0x12)  
          printf("Big endian.\n");  
      else if(data.b[0] == 0x34)  
          printf("Little endian.\n");  
      else  
          printf("uncertain.\n");  
  }  

大小端例题
《程序员面试宝典(第五版)》 P179

typedef struct bitstruct{
    int b1:5;
    int b2:2;
    int b3:2;
}bitstruct;
void main()
{
    bitstruct b;
    memcpy(&b,"EMC AS",sizeof(b));
    printf("%d,%d",b.b1,b.b2);
}

‘E’:0X45 = 0X01000101 ;
‘M’:0X4D = 0X01001101 ;
复制9位后,b的前7位:1000101 ;
b1占5位:00101,b2占2位:10 ;
b1=5,b2=-2。

  • 原码转换为补码:符号位不变,数值位按位取反,末位再加1
  • 补码转换为原码:符号位不变,数值位按位取反,末位再加1。即补码的补码等于原码。
    02_ARM体系与架构
    注意-128就行

1.3 如何发送浮点型数据?

可将浮点型数据分解成单字节逐个发送,接收后组合还原。

  • 使用共用体来分解
union  
{  
    float f;  
    unsigned long l;  
}data_TX;  
data_TX.f = 123.456; 
  • 发送时发送4字节(小端模式,低位先发)
TX = (unsigned char)data_TX.l;       // 低8位  
TX = (unsigned char)(data_TX.l >> 8);  
TX = (unsigned char)(data_TX.l >> 16);  
TX = (unsigned char)(data_TX.l >> 24);  // 高8位  
  • 接收端也定义同样的结构体,并接收4字节数据
union  
{  
    float f;  
    unsigned long l;  
}data_RX;  
data_RX.l = RX;      // 低8位  
data_RX.l |= RX << 8;  
data_RX.l |= RX << 16;  
data_RX.l |= RX << 24; // 高8位  
  • 最后 data_RX.f == data_TX.f

1.4 GPIO的输入输出模式

输入模式:浮空输入、带上拉输入、带下拉输入、模拟输入;
输出模式:开漏输出、推挽输出、开漏复用输出、推挽复用输出。
02_ARM体系与架构

1.5 ADC转换过程

输入端输入的模拟电压,经采样、保持、量化和编码四个过程的处理,转换成对应的二进制数码输出。
①采样就是利用模拟开关将连续交化的模拟量变成高散的数字量。
②由于经采样后形成的数字量宽度较窄,经过保持电路可将窄脉冲变宽,形成梯形。
③量化就是将阶梯形模拟信号中各个电压值转化为某个最小单位的整数倍,便于用数字量来表示。
④编码就是将量化的结果(即整数倍值)用二进制数码来表示。

2 ARM处理器

2.1 ARM处理器有哪些工作状态?ARM指令和Thumb指令有什么区别?

注意是工作状态
(1) ARM处理器共有ARM、Thumb两种工作状态。
(2) ARM指令是32位的,较全面;Thumb指令是16位的,较精简。
(3) 用Bx Rn指令来进行两种状态的切换。

ARM的M系列主要用Thumb指令,ARM9和A系列主要用ARM指令。

2.2 Arm处理器有哪些工作模式?

02_ARM体系与架构

CPU的模式可以简单的理解为当前CPU的工作状态,比如:当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网卡上有数据到达,产生中断信号,CPU自动切换到一般中断模式下处理网卡数据(普通应用程序没有权限直接访问硬件),处理完网卡数据,返回到用户模式下继续执行用户程序。

特权模式
除用户模式外,其它模式均为特权模式(Privileged Modes)。ARM内部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以*的切换处理器模式,而用户模式不能直接切换到别的模式。
异常模式
特权模式中除系统(system)模式之外的其他5种模式又统称为异常模式。它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。

7种工作模式介绍

  • 用户模式(USR)
    用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。
  • 系统模式(SYS)
    系统模式是特权模式,可以访问所有系统资源,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
  • 快中断模式(FIQ)
    快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。
  • 中断模式(IRQ)
    普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以*访问系统硬件资源。
  • 管理模式(SVC)
    管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。
  • 中止模式(ABT)
    中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。
  • 未定义模式(UND)
    未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。

2.3 哈佛结构和冯诺依曼结构?

定义
冯诺依曼结构釆用数据和代码放在一起,一起寻址。
哈佛结构釆用指令和数据分开放置,独立寻址。
示例
在 S5PV210 中运行的 Linux 系统上,运行应用程序时,所有的应用程序代码和数据都放在 DRAM 中,这就是冯诺依曼结构;在单片机中,我们把程序烧写到 Flash(Nor Flash)中,然后程序在 Flash 中原地运行,程序中所涉及到的数据(全局变量、局部变量)不能放在 Flash 中,必须放在 RAM(SRAM)中,这就是哈佛结构。
利弊
冯诺依曼结构主要用于通用计算机领域,需要对存储器中的代码和数据频繁的进行修改,统一编址有利于节约资源。
哈佛结构主要用于嵌入式计算机,程序固化在硬件中,有较高的可靠性、运算速度和较大的吞吐。

2.4 ARM流水线技术?

流水线技术通过多个功能部件并行工作来缩短程序执行时间,提高处理器核的效率和吞吐率。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构,ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑,进一步提高了处理器的性能。

PC代表程序计数器,流水线使用三个阶段,因此指令分为三个阶段执行:取指(从存储器装载一条指令)、译码(识别将要被执行的指令、执行(处理指令并将结果写回寄存器)。ARM正在执行第1条指令的同时,对第2条指令进行译码,并将第3条指令从存储器中取出。PC记录的是取指令的指令地址,即:PC值=当前程序执行位置+8

3 中断与异常

3.1 下面中断程序有什么问题?(引入不可重入概念)

题目
下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),这段代码有什么问题?

__interrupt double compute_area (double radius)   
{   
    double area = PI * radius * radius;   
    printf(" Area = %f", area);   
    return area;   
}   

答案
(1)对于裸机来说,ISR不能传递参数,不能有返回值。
(2)在许多的处理器/编译器中,浮点运算一般都是不可重入的。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
(3)printf()也是不可重入函数。
分析

  • 重入一般可以理解为一个函数在同时多次调用。
  • 满足下面任意一个条件即为不可重入函数:使用了静态数据结构;调用了malloc或free;调用了标准I/O函数,标准IO库很多实现都以不可重入的方式使用全局数据结构;进行了浮点运算。许多的处理器/编译器中,浮点一般都是不可重入的(浮点运算大多使用协处理器或者软件模拟来实现)。
  • 不可重入函数指的是该函数在被调用还没有结束以前,再次被调用可能会产生错误。例如printf,malloc,free等都是不可重入函数。因为中断可能在任何时候发生,例如在printf执行过程中,因此不能在中断处理函数里调用printf,否则printf将会被重入。

3.2 简述处理器中断处理的过程?

简述
处理器中断处理的过程一般分为下面几个步骤: 中断请求 -> 中断响应 -> 保护现场 -> 中断服务 -> 恢复现场 -> 中断返回。
详细

  • 中断请求
    当某一中断源需要CPU为其进行中断服务时,就输出中断请求信号,使中断控制系统的中断请求触发器置位,向CPU请求中断。系统要求中断请求信号一直保持到CPU对其进行中断响应为止。
  • 中断响应
    CPU对系统内部中断源提出的中断请求必须响应,而且自动取得中断服务子程序的入口地址,执行中断服务子程序。对于外部中断,CPU在执行当前指令的最后一个时钟周期去查询INTR引脚,若查询到中断请求信号有效,同时在系统开中断(即IF=1)的情况下,CPU向发出中断请求的外设回送一个低电平有效的中断应答信号,作为对中断请求INTR的应答,系统自动进入中断响应周期。
  • 保护现场
    主程序和中断服务子程序都要使用CPU内部寄存器等资源,为使中断处理程序不破坏主程序中寄存器的内容,应先将断点处各寄存器的内容压入堆栈保护起来,再进入的中断处理。现场保护是由用户使用PUSH指令来实现的。
  • 中断服务
    中断服务是执行中断的主体部分,不同的中断请求,有各自不同的中断服务内容,需要根据中断源所要完成的功能,事先编写相应的中断服务子程序存入内存,等待中断请求响应后调用执行。
  • 恢复现场
    当中断处理完毕后,用户通过POP指令将保存在堆栈中的各个寄存器的内容弹出,即恢复主程序断点处寄存器的原值。
  • 中断返回
    在中断服务子程序的最后要安排一条中断返回指令IRET,执行该指令,系统自动将堆栈内保存的 IP/EIP和CS值弹出,从而恢复主程序断点处的地址值,同时还自动恢复标志寄存器FR或EFR的内容,使CPU转到被中断的程序中继续执行。

3.3 复位中断与其他中断有什么不同?

(1)当中断产生后,复位中断立即中止当前指令的执行,其余情况都是当处理器完成当前指令后,再去响应中断。
(2)如果是复位中断,系统自动从0x00000000开始重新执行程序,无需中断返回。

3.4 什么是中断向量?什么是中断嵌套?

中断向量
中断服务子程序的入口地址。
中断嵌套
中断系统正在执行一个中断服务程序时,有另一个优先级更高的中断源提出请求,这时会暂停当前正在执行的级别较低的中断源的服务程序,处理级别更高的中断源。处理完毕后再返回到被中断了的中断服务程序。

3.5 中断和轮询的区别?优缺点?使用方法?(补充NAPI)

中断和轮询区别与优缺点

  • 中断是指CPU在正常运行程序的过程中,由于预选安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为相应的服务程序去处理,处理完再继续回来运行中断的程序。
    优点: 中断使处理器的利用率显著提高;
    缺点: 中断处理过程需要保护现场、恢复现场,整个过程需要一定的时间和空间开销。如果中断的频率太高,将耗去大量的CPU处理时间,会降低系统的性能。
  • 轮询是让CPU以一定的周期按次序查询每一个外设,看它是否有数据输入或输出的要求,若有,则进行相应的输入/输出服务;若无或I/O处理完毕,CPU就接着查询下一个外设。
    优点: 在一些应用中可以增强了程序的实时性;
    缺点:能处理的输入输出设备的数量也是有一定限度的;程序轮询占用CPU的处理时间,效率较低。
    使用方法
  • 如果发生的事件确实是随机且不可预测的,则需要使用中断。如果事件发生的时间固定、可以预测,则需要使用轮询。
  • NAPI是linux新的网卡数据处理API。NAPI是中断和轮询的结合,数据量低时采用中断,数据量高时采用轮询。平时是中断方式,当有数据到达时,会触发中断处理函数执行,中断处理函数关闭中断开始处理。如果此时有数据到达,则没必要再触发中断了,因为中断处理函数中会轮询处理数据,直到没有新数据时才打开中断。

4 通信协议

4.1 什么是异步传输和同步传输?

异步传输
数据以字节或字符的形式发送。数据按每次一个字节进行传输,相邻两个字节间的间隔是任意长。该传输是半双工型传输。在传输中,在数据的起始位和停止位都添加了奇偶校验位
同步传输
在同步传输中,数据以块或帧的形式发送。此传输是全双工类型。在发送者和接收者之间强制性同步。在同步传输中,数据之间没有间隙。与异步传输相比,传输大量数据更加有效和可靠。
举例
异步通信(UART)和同步通信(SPI、IIC、USB等)。

4.2 串行通信和并行通信?

基本概念
同样的一个字节数据(8位),串行通信要分8次由低位到高位按顺序一位位地传送,而并行通信由于有8根线路,所以只要一次就可以传送过去。
特点
串行速度慢但占用资源少、线间干扰小;并行速度快但占用资源多、线间干扰相对大。

4.3 IIC总线?

IIC协议是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据,是一个多主机的半双工通信方式。
特点
同步半双工;高位在前、低位在后,即大端模式。
连接方式
双线连接,同名端总线连接。连接设备数量受总线最大电容的限制,每个挂接在总线上的器件都有个唯一的地址。
总线仲裁机制
总线被启动后多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测到电平与自己发送的电平相同,就会继续占用总线。否则放弃对总线的控制权。
操作时序
02_ARM体系与架构

  • 写数据步骤
    ①主机发起一个启动信号(START)。
    ②主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。
    ③从机产生应答信号(ACK)。
    ④主机发送8bit从机寄存器地址。
    ⑤从机产生应答信号(ACK)。
    ⑥主机发送一个字节数据。
    ⑦从机产生应答信号(ACK)。
    ⑧主机发送一个停止信号(STOP)。

  • 读数据步骤
    ①主机发送一个启动信号(START)。
    ②主机发送7bit从机地址+1bit读写选择位,1表示读、0表示写。
    ③从机产生一个应答信号(ACK)。
    ④主机发送8bit从机寄存器地址。
    ⑤从机产生一个应答信号(ACK)。
    ⑥主机再次发送一个启动信号(START)。
    ⑦主机再次发送7bit从机地址+1bit读写选择位,1表示读、0表示写。
    ⑧从机产生一个应答信号(ACK)。
    ⑨主机读取一个字节数据。
    ⑩主机产生一个非应答信号(NACK)。之后产生一个停止信号(STOP)。

4.4 SPI的四种操作时序?

SPI的时钟极性CPOL和时钟相位CPHA可以分别为0或1,由此构成了四种组合:
02_ARM体系与架构

4.5 总线接口UART、USB、SPI、IIC的异同点?

02_ARM体系与架构

4.6 UART、TTL、RS-232、RS-485的关系?

UART是一种具有协议特征的收发器/接口/总线,也就是说它是一个按照特定协议来收发数据的硬件,它规定了数据按照什么格式和时序来传输
TTL、RS-232、RS-485是三种不同的电气协议,是对电气特性的规定,作用于数据传输通路,但它并不包含对数据的处理方式。UART可以使用TTL电平,也可以使用RS-232、RS-485电平。
02_ARM体系与架构

4.7 RS-232与RS-485的区别和联系?

区别
①抗干扰性:RS-485接口的抗干扰性比RS-232接口强,因为RS-485采用差分传输。
②传输距离:RS-485接口(1200m)的传输距离比RS-232接口(50m)远。
③通信能力:RS485接口在总线上允许连接多达128个收发器,而RS-232接口只允许一对一通信。
④传输速率:RS-485接口的最高传输速率为10Mbps,而RS-232接口为20Kbps。
⑤信号线:RS-485接口组成半双工网络需要两根信号线,组成全双工网络需要四根信号线;RS-232接口一般使用RXD、TXD、GND三根线组成全双工网络。
⑥电气电平值:RS-485接口规定A线电平比B线电平高200mV以上时为逻辑“1”,A线电平比B线电平低200mV以上时为逻辑“0”。RS-232接口规定-5V ~ -15V等于逻辑“1”,+5V ~ + 15V为逻辑“0”,噪声容限为2V。
联系
都是串行通信。

4.8 CAN总线接口相对于RS-232接口、RS-485接口的优点?

(1)CAN总线接口相对于RS-232接口的优点是抗干扰能力强、传输距离远。它采用差分传输,内置CRC校验,传输可靠性强。
(2)CAN总线接口相对于RS-485接口的优点是能构成多主系统,同一时刻可以有两个或两个以上的设备处于发送状态,适用于实时性要求高的工控领域。

5 寄存器和存储器

5.1 CPU跟内存、虚拟内存、硬盘的关系?

(1)CPU要调用的程序和数据来自硬盘,但是CPU又不能直接读写硬盘上的系统、程序和数据,必须先将硬盘的内容存储在内存中,才能被CPU读写。因此内存是一个中转站,对计算机的运行速度有较大影响。
(2)当系统需要的内存空间大于实际的物理内存空间时,就需要用到虚拟内存了。虚拟内存可以将部分硬盘空间模拟成内存空间,将暂时不运行的程序和不使用的数据存储在硬盘上,需要时再将其存储到内存。

5.2 程序计数器、程序链接寄存器、堆栈指针寄存器

程序计数器PC为R15、程序链接寄存器LR为R14、堆栈指针寄存器SP为R13

5.3 寄存器掉电会丢失数据吗?

寄存器是由触发器构成的,因此掉电会丢失数据。

5.4 NOR Flash与NAND Flash的区别?

02_ARM体系与架构

5.5 RAM与ROM

RAM是随机存储器,速度很快,可随机读写,但断电则丢失数据,一般用作内存。RAM的种类有很多,常见的有SRAM、DRAM、SDRAM。
ROM是只读存储器,速度较慢,不能直接与CPU进行交互,断电后数据不丢失,一般用来保存断电不丢失的程序。常见的ROM有PROM、EPROM、EEPROM。

5.6 SRAM、DRAM和SDRAM

SRAM
SRAM是静态随机存储器,存储原理是触发器的方式,加电情况下,不需要刷新,数据不会丢失。CPU的缓存就是SRAM。
DRAM
DRAM是动态随机存储器,存储原理是电容存储电荷的方式,加电情况下,需要不断刷新,才能保存数据。最为常见的系统内存。
SDRAM
SDRAM是同步动态随机存储器,即数据的读取需要时钟来同步,也可用作内存。

5.7 CPU对cache操作前,需要进行哪些操作?

分析
在进行DMA 操作时,如果没有对Cache 进行适当的操作,将可能产生以下两种错误:

  • DMA 从外设读取数据给处理器使用。DMA 将外部数据直接传到内存中,但cache 中仍然保留的是旧数据,这样处理器在访问数据时直接访问缓存将得到错误的数据。
  • DMA 向外设写入由处理器提供的数据。处理器在处理数据时数据会先存放到cache 中,此时cache 中的数据有可能还没来得及写回到内存中的数据。如果这时DMA 直接从内存中取出数据传送到外设,外设将可能得到错误的数据。

答案
为了正确进行DMA传输,必须进行必要的缓存操作,缓存操作主要分为invalidate(作废)和weiteback(写回)。

  • DMA从外设读取数据供CPU使用时,可先进行invalidate(作废)操作。这样一来,处理器在读取缓存中的数据前,会先从内存中读取数据到缓存,保存缓存和内存中数据的一致性。
  • DMA初始设置由处理器提供数据时,可先进行writeback(写回)操作。这样一来,可以在DMA传输之前,将缓存的数据写回到内存中,保证内存和缓存中数据的一致性。

5.8 缓冲技术的作用?

(1)改善CPU与I/O设备间速度不匹配的矛盾。
(2)提高CPU和I/O设备之间的并行性,提高系统的吞吐量和设备的利用率。
(3)减少对CPU中断的频率,放宽对中断响应时间的限制。

5.9 ARM在不同工作模式时使用的寄存器有所不同,但共用的是?

(1)R0~R7为公用的通用寄存器。
(2)CPSR为公用的当前程序状态寄存器。
(3)R15为公用的程序计数器PC。

上一篇:ARM平台如何玩转GDB远程调试?


下一篇:2021-09-27