ARM 体系结构与接口技术

为什么要学习这部分课程?该课程对成为一名嵌入式软件工程师有什么帮助?课程主要包括哪几部分?

  • 学习该课程主要是让我们对计算机系统级工作原理有更加清晰的认识和理解。通过加深对中断、寄存器、汇编和接口的理解,以后工作中可以处理更加底层的问题。
  • 体系结构:存储模式、工作模式、寄存器、异常机制、流水线和指令集
  • 接口技术:GPIO、PWM、UART、ADC、RTC、IIC


# 体系结构

计算机体系结构有两种类型:RISC和CISC。

精简指令集(RISC):每条机器指令的长度相同,复杂机器指令由多条简单指令构成。具有简单的寻址模式和简单指令格式。

复杂指令集(CISC):

uniform instruction lengths and different methods for loading and storing data.

  • 因指令长度不同,每条指令执行的时间也不同,使得计算机整体性能降低。
  • 随着指令增多,芯片设计越来越复杂。
  • 很多指令不经常被使用,常被使用的指令集通常只占20%。

## 计算机基础知识

计算机是一个二进制世界,无论是信号传输还是数据存储都是用二进制来表示。高电平为 1,低电平为 0 ,即平时所说的*数字信号*。数据表示可以采用原码、反码、补码,高级语言中所使用的整数采用补码表示。计算机中,浮点数都是近似值,其表示方法由3部分组成:符号位、尾数和指数。引入二进制概念后,还要解决不同进制间的转换问题……

计算机构成有两种模型:冯诺依曼模型和哈弗模型

  • 输入、输出、运算器、存储器、控制器是冯诺依曼模型中计算机五大构成部件
    • 输入包括:键盘、鼠标、摄像头。输出包括:显示器、音响。这些外部设备与计算机连接时会涉及到不同接口,有本书《微机接口》专门介绍这部分内容。
    • 存储器主要用来存储二进制数据,分为内存、外存、cache。数据在存储时,存在磁盘上(外存)的数据可以通过柱号的方式进行索引,而内存为了扩大空间采用了虚拟存储技术,逻辑地址通过页表转换为物理地址。
    • 运算器实现算术和逻辑运算,使用 ALU 来完成。位运算不需要进行其他的逻辑操作,直接左移、右移,运算速度更快。
    • 控制器不同部件在总线上传输的数据。when、what、how
  • 数据和指令分开存储是哈弗模型的最大特点
    • 冯诺依曼结构中,数据和指令是通过时钟信号进行区分。

嵌入式操作系统中,总线有多种类型,其主要功能是用来传输数据和指令

  • 按照传输数据可分为:数据总线、地址总线和控制总线
  • DMA总线是连接外部设备(打印机)和存储器的桥梁,不需要经过CPU直接进行数据传输

## 多级存储结构

CPU运算速度快,内存读写速度慢。多级存储器的引入正是为了解决该问题。通过价格和容量性价比的考量,一般都采用三级存储结构:cache、内存(RAM)、磁盘。

内存容量由地址总线决定。程序执行时并不会全部加载,页表机制使得内存中只包含运行程序当前需要的代码和数据。虚拟地址机制可以扩大内存的逻辑容量。

## CPU工作原理

CPU由运算器和控制器组成,其工作流程包括:取址、译码、执行。

控制器通过总线获取内存中指定地址存储的数据,译码器将其翻译成机器码,最后交给运算器执行。若需要存储,还可以通过总线将运算结果写入指定内存(寄存器->内存)。

## ARM处理器概述

  • ARM(Advanced RISC Machines Ltd.)是全球著名的专门从事基于RISC技术设计开发芯片的公司,它作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可,最终由半导体公司(台积电)将这些设计方案生产为各具特色的芯片。
  • ARM这个缩写包含几个意思:一是指ARM公司;二是指ARM公司设计的低功耗CPU架构;还可以认为是对一类微处理器的通称。

SoC(System on Chip):片上系统,即把系统需要的各个功能部件集成在一块芯片上。

## ARM指令集

ARM处理器有两种指令集:ARM和Thumb。在CPSR寄存器中,Bit[5]为0表示ARM状态,1表示Thumb状态。同一高级语言编写的语句,经不同编译器编译产生不同的指令,汇编后机器码也不同。由指令构成的集合称为指令集。

## ARM存储模型

汇编语言中有三种数据类型:Byte(8bit)、Harfword(16bit)、Word(32bit)。ARM在字节对齐时,采用小端存储:低地址存放高位,高低址存放低位。程序计数器PC,用于存放指令地址。ARM状态,指令执行后,PC自增 4;Thumb状态,自增 2 。

C语言是一种偏向于底层的语言,变量在声明时,可以指定其在内存中存放的位置。存储模式分为以下4种:

  1. auto:存放在堆栈,每次声明都会将其重置。
  2. register:在CPU中的寄存器中,不可以寻址,局部变量。
  3. static:和全局变量的存放位置相同,已初始化的存放在.data段,未初始化的存放在.bss段。
  4. extern:可以使用其他文件中的变量,相当于汇编中的.global。

## ARM工作模式

ARM有8种工作模式,CPSR中,Bit[4:0]为状态位,用于表示当前处于何种状态。不同状态具有不同权限,上层应用开发时,处理器状态为 User 模式,权限较低,无法对内核直接进行操作,只能够使用内核提供的接口进行开发。异常产生时,通过程序中断进入异常模式:FIQ、IRQ、SVC、Abort、Undef。此时,可以修改操作系统内核层面的一些代码执行流程,用于处理异常。

## ARM寄存器组织

寄存器是CPU中的存储部件,可直接参与算术逻辑运算。`register int number = 8;` 数据直接存储在寄存器中,不可以进行取地址操作。ARM中,寄存器分为:通用寄存器、专用寄存器、控制寄存器。

专用寄存器:

  1. 程序计数器PC:R15,用于存放程序指令地址。
  2. 链接寄存器LR:R14,执行跳转或中断后,保存下一条语句地址。
  3. 栈指针SP:R13,保存当前状态下,栈顶地址。

控制寄存器:CPSR

  1. Bit[4:0] 处理器模式控制
  2. Bit[31:28] 判断算数运算过程中是否产生符号位进位借位、数值进位借位、0、负数
  3. Bit[7:5] 控制FIQ、IRQ和处理器状态

## ARM异常处理

异常处理过程:[关中断、保存断点、寻找中断源]、[保存现场和屏蔽字、开中断、执行中断处理程序、关中断、恢复现场和屏蔽字、中断返回和恢复断点]

当异常发生时,处理器工作模式由 USER 变为 SVC,通过 SWI 指令查询中断向量表,执行中断处理程序。通过屏蔽字控制当前程序是否可以被其它中断打断。

异常是计算机实现交互的方法,中断是异常的一种,由外部设备产生(如:鼠标单击,键盘输入)。陷入也是异常,由程序内部产生(如:除零、溢出)。

中断控制器用于管理不同设备所产生的中断如何与CPU进行交互:

  • 产生中断号,根据中断号指定的中断向量表中具体的某项,进而执行中断处理程序。
  • 生成中断优先级,高优先级中断先执行。
  • CPU可以根据中断控制器,查找具体哪个设备产生的中断。
  • ……

中断控制器编程:

主要包括两个层次,

外设,通过对应的引脚,使外设产生的中断能够发送给中断控制器处理;

中断控制器,管理外设产生的中断信号,并分配给相应的CPU处理。


# 接口技术

## GPIO

通用输入、输出接口。要用 GPIO 点亮 LED 灯,需要执行以下步骤:

  • 查找与LED相连的引脚
  • 确定该引脚所对应的寄存器地址
  • 通过芯片手册,设置寄存器中的数据以实现不同功能


## UART

串口是一种全双工通信方式,传送的数据帧格式如下:起始位、数据位、校验位、终止位。

波特率(bps):单位时间内传输符号的个数。

输出重定向:PC上字符输出通常是屏幕,而在嵌入式设备上,输出为串口(Serial)。


## WDT

看门狗定时器(Watch Dog Timer),其实现原理是一个计数器。用于在设备故障时重启系统。


## PWM

在蜂鸣器实验中,通过调节高低电平的周期和占空比,获取所需要的波形,从而控制蜂鸣器的输出。


## ADC

模拟信号转数字信号


## RTC

实时时钟,它是一个可以为系统提供精确时间基准的元器件。


## IIC

IIC全称(Inter-Integrated Circuit)是一种在嵌入式设备中常用的半双工,串行通信总线。