Embeded-Processors-Class-Notes

Lecture 1 Course Introduction and Refresher

分数占比:

  • 10%, 作业
  • 15%, Lab
  • 75%, 期末考试

计算机架构

计算机的基本组成:

  • Processor, 处理器
  • Memory, 内存
  • I/O, 输入和输出

如:

Bus 总线

总线(Bus)是计算机内部用于传输数据和控制信号的一组电子线路。其中的 Bus 总线是其中的一种类型,它通常是一组并行的电子线路,用于在计算机系统的各个组件之间传输数据和控制信号。

Bus 总线可以分为多种类型,包括地址总线、数据总线和控制总线。地址总线用于传输内存地址,数据总线用于传输数据,控制总线用于传输控制信号。Bus 总线还可以分为系统总线、扩展总线和外设总线,根据其连接的设备类型和数据传输速度不同。

在计算机系统中,Bus 总线通常是一种共享资源,多个设备可以通过它来传输数据和信号。因此,Bus 总线的带宽、速度和延迟等特性会影响整个系统的性能表现。

三种类型的总线:

  • Address Bus, 地址总线
  • Data Bus, 数据总线
  • Control Bus, 控制总线

如:

这三种类型共同组成 系统总线 (system bus)

串行通信和并行通信

串行通信是指将数据位按照一定的顺序一个接一个地发送,每次只传输一个数据位。串行通信使用单一的传输线路,可以减少电缆的使用量,但是传输速率较慢,通信时延较大。串行通信通常用于长距离通信、噪声较多的环境以及需要逐位传输的应用中,例如串口通信、USB接口等。

如:

并行通信是指在同一时刻同时传输多个数据位,使用多条传输线路,可以在短时间内传输大量数据,传输速度较快。但并行通信需要使用更多的电缆和硬件资源,成本较高。并行通信通常用于短距离高速数据传输、内部总线传输等场景中,例如内存总线、PCI总线等。

如:

总的来说:

  • 串行通信适用于传输速率较低、传输距离较远、噪声较多的场景
  • 并行通信适用于传输速率较高、传输距离较短、要求高带宽的场景。

同步传输是指发送端和接收端之间在传输数据时采用同步时钟信号进行协调。发送端在传输数据之前先发送同步时钟信号,接收端接收到同步时钟信号后根据时钟信号来解析数据。同步传输方式具有高可靠性、高速率、数据传输顺序确定等优点,但是需要传输同步时钟信号,传输距离受限,不利于长距离通信。同步传输通常用于短距离高速数据传输,例如内存总线、网络交换机等。

异步传输是指发送端和接收端之间在传输数据时没有采用同步时钟信号进行协调。发送端和接收端之间通过特定的控制字符进行协调和同步。异步传输方式具有数据传输距离长、使用灵活等优点,但是由于没有同步时钟信号,数据传输速率较慢,可靠性较低。异步传输通常用于串口通信、键盘鼠标接口等。

总的来说:

  • 同步传输适用于高速率、高可靠性的数据传输
  • 异步传输适用于数据传输距离较远、使用灵活的数据传输。

位操作 Bitwise operation

三种位操作:

  • AND
  • OR
  • NOT

MCU 和 MPU 的区别

MPU (Microprocessor), MCU (Microcontrollers)

For MPU, memory and I/O devices are connected externally (or on different chips)

For MCU, CPU, memory and I/O are present internally (or on a single chip)

也就是内存和 I/O 放置的位置不同.

Cost:

  • MPU: high
  • MCU: low
    Processing power, memory, and storage:
  • MPU: high
  • MCU: low

Lecture2 ARM

ARM Processor

Mbed NUCLEO L432KC

Lecture3 Programming and Interfacing

接口技术 Interfacing techniques

GPIOs

GPIO Lecture 5-是 General Purpose Input Output 的简称.

有八种工作模式:

PWM

PWM 是 Pulse Width Modulation 的简称.

模拟信号的值是随时间连续变化.

数字信号只有高平 (high) 和低平 (low).

而 PWM 就是用 digital source 来产生 analog signal.

几个量:

  • period, 也就是周期, 是两个高平间隔的时间
  • active time, 高平持续的时间
  • duty cycle, 高平占周期的比值
  • average voltage, 平均电压, 其值等于高电平乘以 duty cycle
  • resolution, 分辨率, 表示精度

如图:

Serial

UART

UART 是 Universal Asynchronoous Reception and Transmission 的简写.

其为异步传输的协议. 其没有时钟, 利用

  • start bit, 暗示数据传输的开始, 注意, 其并不为要传输数据的一部分
  • stop bit, 暗示数据传输的结束
  • Data length, 数据需要传输多少 bit
  • Transmission speed, 每秒传输的比特数

这些参数来校验. (TX 和 RX 需调整好)

两个缩写:

  • TX, 指 Transmitter
  • RX, 指 Receiver

还有一个概念:

  • idel state, 指一直保持高电平或低电平的状态

传输过程如:

这里的 start bit 是第一个低电平. 而 stop bit 是持续的高电平

I2C

I2C 是 Inter-Integrated Circuit 的简称.

其为同步传输的协议.

主机/从机 结构

  • 只有一个主机
  • 可以有多个从机

其速率一般有两种:

  • 标准数据传输速率: 100kbits/s
  • 高速数据传输速率: 400kbits/s

其结构如:

其中:

  • SDA (Serial Data Line), 用于传输数据, 地址和控制信号
  • SCL (Serial Clock Line), 用于同步
  • VDD (来自于德语词语”Versorgungsspannung”,意为”供应电压”), 通常指电源电压

I2C 的工作方式:

几个概念:

  • start bits, 由 master 发起开始的信号, 即由持续的高平转为低平, 且此时 SCL 位于高平.
  • address Byte, 即选择要传输给哪一个从机, 从机的编号为 8-bit 的格式, upper 7 bits 用于表明地址, the 8th bit 表明 READ/WRITE, 0 表示写入, 1 表示读取
  • ACK/NACK (Acknowledge and Not Acknowledge Bits), 这两种 bits 用于表示数据是否成功传输, ACK 由 reciver 产生, 其 holding the SDA line low during a high SCL period
  • Data Bits, 其为 8-bit byte format, 跟在 address byte 之后, 其后面跟 ACK/NACK, reciver 只在 SCL 处于高电平时读取
  • stop bits, 由 master 主动发出断开信号, 即由低平转为持续的高平

SPI

SPI 为 Serial Peripheral Interface 的简称.

其为 同步通信 的一个协议.

满足 master/slave 架构. 可以: one master, one/multiple slaves

几个概念:

  • SCLK (Serial Clock), Master 来设置
  • MOSI (Master output, Slave Input)
  • MISO (Master Input, Slave Output)
  • SS/CS (Slave Select/Chip Select)

连接图如下:

工作方式

  1. 主机产生时钟信号

  1. 主机将 SS/CS 信号拉低, 来选择从机 (唤醒从机)

  1. 主机传输数据

  1. 若有从机回传数据, 则

注意几个概念:

  • CPOL (clock polarity, 时钟极性), 用于设置时钟信号的 idel state, 如:

  • CPHA (clock phase), 设置什么时候开始读取数据, 如:

即, CPOL = 0 时, 时钟一个周期后, 开始读取数据.

即, CPOL = 1 时, 时钟第一个高平时读取数据.

Lecture 4 Polling and Interrrupt

当 CPU 处于 busy 状态时, 可以用:

  • Polling 轮询
  • Interrrupt 中断

两种方式来运行这个程序.

Polling 轮询

什么是 Polling

轮询(Polling)是一种计算机程序设计技术,通常用于检查某些数据是否已经准备好或某个事件是否已经发生。它通过在固定时间间隔内不断地查询特定的资源或状态来实现。

在轮询中,程序会反复查询某个特定的资源,例如网络连接、数据库、文件等,以确定它们是否可用或已更新。如果资源处于可用或更新状态,程序会执行相应的操作;否则,它将继续等待并重复查询该资源,直到它变为可用或更新为止。

尽管轮询是一种简单有效的方法,但它有一些缺点。其中最主要的缺点是效率低下,因为它会不断地查询资源而不管它们是否真正有用。此外,在高负载情况下,轮询还可能会占用大量的系统资源,从而降低系统的整体性能。因此,在一些场景下,轮询可能不是最佳的解决方案,而需要采用其他更高效的技术,例如异步事件通知或回调函数。

如:

Interrrupt 中断

中断(Interrupt)是一种计算机处理器的机制,用于在计算机运行时,暂停当前正在执行的程序,处理一个特定的事件或请求,并在完成后恢复原先的程序执行。

中断可以是来自硬件设备,例如键盘、鼠标、磁盘驱动器等设备的请求,也可以是来自操作系统或应用程序的请求。中断可以分为外部中断和内部中断。外部中断通常来自外部设备,需要由处理器响应;而内部中断则是由程序中的代码执行所引起的,例如程序出现错误或执行了一个系统调用。

当一个中断事件发生时,处理器会暂停当前正在执行的程序,并跳转到中断处理程序,执行特定的中断处理程序,处理完毕后再返回原先被中断的程序继续执行。中断机制使得计算机可以处理多个任务,响应外部设备的请求,提高计算机的效率和可靠性。

如:

Comparisons 轮询和中断的比较

对于 CPU 来说:

  • Polling: The CPU is on hold and checks if any device needs a service. This unnecessarily wastes time.
  • Interruption: The CPU is disturbed only if needed.

Interrrupt Handlers Design 中断处理器设计

要求

Main Process: 输入 10 个[0,100] 的随机数

Interrrupt Process: 输入 $\{11^2, 12^2, 13^2,…,20^2\}$

Trigger Condition: 当 input number 超出范围时

Lecture 5 Interfacing GPIO-without quiz answer

GPIO 为 General Purpose Input Output 的缩写.

用于 passing data into and out of the board. (也就是双向的)

其结构为:

其有 8 种工作模式:

  • 4 Input modes
    • Floating Input
    • Pull-up
    • Pull-down
    • Analog mode
  • 4 Output modes
    • General purpose output Open-drain
    • Alternate function output Open-drain
    • General purpose output push-pull
    • Alternate function output push-pull

上拉电阻和下拉电阻的作用

上拉电阻通常是连接到信号线和高电平之间的电阻,用于确保信号在没有外部输入的情况下保持在高电平状态。当信号线没有连接到其他电路时,上拉电阻将信号线上拉到高电平,避免信号线漂浮,从而保持系统的稳定性。

下拉电阻则是连接到信号线和低电平之间的电阻,用于确保信号在没有外部输入的情况下保持在低电平状态。与上拉电阻类似,下拉电阻可以避免信号线漂浮,从而保持系统的稳定性。

在数字电路中,上拉电阻和下拉电阻通常用于输入端口或输出端口。在输入端口,上拉电阻或下拉电阻用于将未连接的输入端口维持在特定电平上,从而避免输入信号的漂移。在输出端口,上拉电阻或下拉电阻可以用于确保输出信号在断开连接时保持在特定电平上,从而避免输出信号的漂移。

在模拟电路中,上拉电阻和下拉电阻通常用于电压分压器或比较器电路中。在电压分压器中,上拉电阻或下拉电阻用于连接到被测量的电路电压上,从而将电路电压分压到一个可测量的范围内。在比较器电路中,上拉电阻或下拉电阻用于连接到比较器输入端口,从而限制输入电压范围并避免过大的电流流过比较器。

在使用 GPIOs 引脚时, 需要设置三个参数:

  • 引脚号
  • 工作模式
  • 传输速度

Lecture 6 PWM and UART 的应用

PWM 的应用

PWM 可以控制 LED 亮度, 可以让 buzzer 发出不同音调.

在 LED 亮度控制中,PWM 技术可以通过控制 LED 通电时间的比例来改变 LED 的亮度。

当我们将 PWM 置于高电平时,LED 会接收到一个恒定的电压,并发出最大的亮度。当 PWM 降至低电平时,LED 接收到的电压会降低,此时 LED 发出的亮度会减弱。通过以一定的频率周期性地改变 PWM 的高低电平状态,我们可以控制 LED 通电的时间占整个周期的比例,从而实现对 LED 亮度的精确控制。

需要注意的是,LED 的亮度与其通电时间的平均值成正比,这意味着 PWM 调制频率越高,LED 的亮度控制就越精细,因为 LED 的通电时间会被分成更小的时间段。因此,在选择 PWM 调制频率时,需要平衡精度和资源消耗之间的关系。

UART 的应用

通信.

Lecture 7 Hardware_Software Interfacing Part 3_SPI_I2C

SPI 使用的 3 个信号:

  • SDI, Serial Data In
  • SDO, Serial Data Out
  • SCK, Slave Select SS or Chip Select

全双工通信 (Full duplex communication)

示意图:

mbed 上 SPI 的常用方法:

ADXL345 的部分信息. 其作为 SPI 的主机.

其数据寄存器中存储的内容信息为:

0x31 地址处的寄存器是 8 位寄存器. 第 6 位用于控制:

  • 为 0, three-wire SPI mode
  • 为 1, four-wire SPI mode

$\overline{CS}$ 需要在开始传输时设置为 0, 传输结束时设置为 1.

在没有传输时, SCLK 需要设置为 high.

ADXL345 的全 register map:

一个 ADXL345 的初始化示例:

解释如下:

  • 8-bit data, Mode 3 中, 8-bit data 指每个 SPI 传输字节都是 8 位二进制数据, Mode 3 是指 SPI 时钟极性为高电平(CPOL=1),时钟相位为下降沿(CPHA=1),这意味着数据在时钟的下降沿上进行传输
  • ADXL345.write(0x31); // point to data format register
    ADXL345.write(0x03); // format +/-16g, 0.004g/LSB
    

在 SPI 通信中,写入数据需要分两步进行:

第一步是写入要操作的寄存器地址。这个寄存器地址就像一个指针,指向要写入数据的寄存器。在这段代码中,第一次调用 ADXL345.write(0x31) 是为了将指针指向 ADXL345 的数据格式寄存器,以便后续写入数据时能够正确配置数据格式。

第二步是向指定的寄存器中写入数据。在这段代码中,第二次调用 ADXL345.write(0x03) 是将数据格式寄存器的值设置为 0x03,以配置数据输出格式。这个值的具体含义取决于 ADXL345 数据手册中定义的格式。

需要注意的是,对于某些设备,写入数据时不需要先写入寄存器地址,而是直接将地址和数据打包在一起一次性传输。但对于 ADXL345 这样的设备,需要先发送要操作的寄存器地址,然后才能写入数据。

00001011
7 – 0 6 – 0 5 – 0 4 – 0 3 – 0 2 – 0 1和0 – 11
00000011

X-Axis Data 0 和 X-Axis Data 1 的含义是什么

X-Axis Data 0 和 X-Axis Data 1 是 ADXL345 加速度传感器输出的两个寄存器,用于存储 X 轴方向的加速度数据。其中,X-Axis Data 1 包含了 X 轴加速度数据的高 8 位,而 X-Axis Data 0 包含了低 8 位。通过读取这两个寄存器的值,并将它们拼接起来,就可以得到完整的 X 轴方向的加速度数据。

具体地,X-Axis Data 1 寄存器的位 0 到位 7 存储了 X 轴方向加速度数据的高 8 位,而 X-Axis Data 0 寄存器的位 0 到位 7 存储了 X 轴方向加速度数据的低 8 位。这两个寄存器都是只读的,可以通过 ADXL345 的 SPI 接口读取它们的值,然后通过位运算将它们拼接成一个完整的 16 位数,从而得到 X 轴方向的加速度数据。

需要注意的是,在读取这两个寄存器的值时,为了保证数据的正确性,应该在读取 X-Axis Data 1 寄存器之前先读取 X-Axis Data 0 寄存器,这样才能保证读取的数据是连续的,并且按照正确的顺序组合成完整的 X 轴方向的加速度数据。

x = 0.004*data[0];0.004 的含义

在这段代码中,0.004 是 ADXL345 加速度传感器的精度,即它可以测量的最小加速度值的分辨率,也称为最小可测量加速度值。根据 ADXL345 的数据手册,当将测量范围设置为 ±16g 时,分辨率为 0.004 g/LSB,即每个最小可测量加速度值代表的物理量大小为 0.004 g。

因此,在读取 ADXL345 的 X 轴方向加速度数据后,将其乘以 0.004,就可以得到 X 轴方向的加速度值(以 g 为单位)。这个值可以用于进一步的数据处理和分析,例如用于检测运动状态、计算速度和位移等。

Lecture 8 ADC (Analogue-to-Digital Converter)

需要 ADC 的原因

  • The world is analogue and most sensors of temperature, acceleration, sound etc have analogue outputs.
  • Analogue is not compatible with computers (microcontrollers and others) and our digital era.
  • Analogue-to-Digital is vital to interface analogue devices to digital ones
  • Once digitised, then this signal may be stored, copied and transmitted without error (or, more realistically, with error correction)

ADC 应用的例子

  • They are used in Audio/Video devices.
  • They are used in Cell Phones.
  • They are used in Digital Multimeters.
  • They are used in digital oscilloscopes.
  • They are widely used in various types of sensors.
  • They are used in Medical Instrumentation and medical imaging.

ADC 的作用

其 digital output 的长度取决于 analogue input 的大小.

( 可能光照越强或光照时间越长, 产生的二进制输出就更长 )

ADC 的示意图

对其中的信号的解释为:

  • $V_{ref}$, 参考电压信号, 决定 ADC input 的范围
  • Clock, 时钟信号
  • $V_{in}$, ADC 输入信号
  • $SC$, Start Conversion, 开始信号
  • Digital Out $D_0$ to $D_n^*$, ADC 转换的输出
  • $EOC$, End of Conversion, 结束信号

ADC 的工作原理

一个典型的 ADC 满足:

$$
\displaylines
{
\begin{aligned}
D = \frac{V_i}{V_r} 2^n
\end{aligned}
}
$$

这个公式, 其中:

  • $D$, Digital output value
  • $V_i$, Analogue input value
  • $V_r$, Reference voltage
  • $n$, 位数

什么是 ADC resolution

ADC resolution(模数转换器分辨率)是指模数转换器(ADC)可以测量和表示的最小电压变化(或称为最小电平变化),通常以比特(bit)为单位进行表示。分辨率越高,ADC可以测量的电压范围就越精细,也就是说它可以将更小的信号变化转换为数字信号。

例如,一个12位分辨率的ADC可以将输入电压范围划分成2的12次方(即4096)个离散的电平,每个电平之间的电压差为输入电压的最小变化,也称为最小可分辨电压(LSB)。因此,该ADC的分辨率为12位,或者说每个转换结果由12个二进制位组成。

其计算为:

$$
\displaylines
{
\begin{aligned}
resolution = \frac{V_r}{2^n}
\end{aligned}
}
$$


$D$ 的范围为 $0 \sim 2^n -1$

超出范围的都以 minimum 或 maximum 的值来算, 比如 $-1$ 就当作 0.

关于 LSB

LSB指的是 “Least Significant Bit”,即最低有效位。在数字信号处理中,LSB通常用于描述ADC(模数转换器)的分辨率,或DAC(数模转换器)的输出分辨率。它表示ADC或DAC可以测量或输出的最小电压变化或数字变化,通常用比特(bit)或电压单位(如毫伏)来表示。因此,LSB是一个重要的概念,用于衡量数字信号处理系统的精度和灵敏度。

LSB 越小, error 就越小.

关于Quantization error(量化误差)

Quantization error(量化误差)是指在数字信号处理中,将连续的模拟信号采样和量化为离散的数字信号时,由于量化步长有限,导致数字信号与原始模拟信号之间的误差。这种误差是由于将连续的模拟信号量化为离散的数字信号时,必然存在一些信号值不能被准确表示,因此最接近的离散值将被用来代表原始信号值,从而产生误差。

Quantization error的大小取决于量化器的分辨率。分辨率越高,量化器可以表示的信号值就越多,误差就越小。相反,分辨率越低,量化器可以表示的信号值就越少,误差就越大。

Successive Approximation ADC

Successive Approximation 指一个寄存器, 该类 ADC 的工作流程为:

编程

可用函数:

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "mbed.h"

Serial MyPC(USBTX, USBRX);
AnalogIn Ain(D3);

int main(void) {
double Volt_V;
MyPC.printf("\n\r=========DIGITAL VOLTMETER++++++++\n\r");

while (1) {
Volt_V = 3.3 * Ain.read();
MyPC.printf("Voltage = ");
MyPC.printf("%.2f V\n\r", Volt_V);;
wait(1);
}
}

Lecture 9 DAC (Digital-to-Analogue Converter)

为什么需要 DAC

  • The world is analogue.
  • Digital is not compatible with traditional analogue devices.
  • Digital-to-Analogue is vital to interface digital devices to analogue ones.

DAC 的应用

  • They are used in Digital Signal Processing.
  • They are used in Cell Phones.
  • They are used in digital power supplies for Microcontroller.
  • They are used in audio amplifiers.
  • They are widely used in data acquisition systems.
  • They are used in software defined radios (SDRs).

DAC 的作用

将数字信号转换为连续的模拟信号:

DAC 的基本结构

几个信号的解释:

  • $V_r$, voltage reference, 决定 DAC 输出的范围
  • Digital In $D_0$ to $D_n^*$, DAC 输入, 这里的 ‘n’ 表明输入的位数
  • V_o, DAC 输出
  • Control Lines, 包含 Clock

一种典型的 DAC 满足的公式:

$$
\displaylines
{
\begin{aligned}
V_o = \frac{D}{2^n} V_r
\end{aligned}
}
$$

几个参数的含义:

  • $V_o$, 输出
  • $V_r$, voltage reference
  • $D$, 数字输入
  • $n$, 位数

resolution 的计算

$$
\displaylines
{
\begin{aligned}
resolution = \frac{V_r}{2^n}
\end{aligned}
}
$$

DAC 的优点

  • High resolution and accuracy can be achieved.
  • Simple to implement.

DAC 的缺点

  • Voltage levels must be exactly the same for all inputs in Weighted Resistors DAC.
  • Binary weighted Resistor circuit that require Op- Amps are expensive.
  • In R-2R Ladder converters, delay is caused as the circuit needs switching based on the inputs.

编程

可用 function 为;

示例:

1
2
3
4
5
6
7
8
9
#include "mbed.h"
AnalogOut Aout(A4);
AnalogIn Ain(D3);

int main(void) {
while (1) {
Aout = Ain;
}
}

Lecture 10 Assembly and Machine Language

高级语言运行的流程:

什么是汇编语言

Assembly Language is a low-level (human-readable) programming language that directly communicates with computer hardware.

汇编语言是一种面向计算机硬件的低级语言,用于编写计算机程序。它使用助记符(mnemonic)和符号(symbol)来代替二进制指令码,使程序员能够更容易地理解和编写底层的计算机指令。

汇编语言与计算机硬件密切相关,因为它直接操作计算机的寄存器、内存和其他硬件资源。每条汇编语句都对应着一条底层的机器指令,这些指令由CPU直接执行。由于汇编语言直接操作硬件,因此它通常比高级语言更快、更有效率。

汇编语言虽然比高级语言更接近于底层硬件,但是相对来说更难以编写和理解。因此,它通常被用于需要对底层硬件进行控制和优化的场合,如操作系统、驱动程序、嵌入式系统等。

其特点为:

  • machine dependent
  • low level programming language specific to a certain computer system

其相比与机器语言的特点为:

  • Mnemonic Operation Codes
  • Symbolic operands
  • Data declarations

什么是机器语言

Machine Language is the lowest and most elementary level of programming language. The ONLY thing that the computer can work with (computer-readable) . All programs and programming languages eventually generate or run programs in machine language.

机器语言是计算机能够理解和执行的最底层的语言,也称为二进制代码。它是由0和1组成的二进制数字序列,直接由计算机硬件执行的指令。

在机器语言中,每个指令都是一条二进制代码,用于执行特定的操作,如加法、乘法、比较、跳转等等。这些指令通常由CPU直接执行,以完成特定的操作。由于机器语言是直接由计算机硬件执行的,因此它非常快,但是编写和理解机器语言程序非常困难。

为了简化编程和提高可读性,汇编语言被发明出来,它是机器语言的一种更高级的表示形式。汇编语言使用助记符和符号来代替二进制代码,使程序员更容易理解和编写底层的计算机指令。然后,汇编语言编写的程序需要经过汇编器的处理,才能转换为机器语言,以便由计算机硬件执行。


汇编语言主要有四个组成:

如:

1
hello: ADD r4,c ; a comment

注意 , “word” 一般指代 4 bytes 的数据.

内存中的字节顺序

“endianness” 指字节顺序.

有两种顺序记法:

  • little endian (ARM 处理器的默认记法)
  • big endian

其区别为:

两者对数据传输也有区别:

ISA (Instruction Set Architecture)

Instruction Set Architecture(ISA,指令集架构)是计算机体系结构中的一个关键概念,它定义了计算机硬件和操作系统之间的接口,规定了计算机如何执行指令和处理数据。常见的ISA包括:

  • x86:x86是一种广泛使用的32位和64位微处理器架构,它是英特尔和AMD处理器的基础,常用于个人电脑和服务器。

  • ARM:ARM是一种流行的嵌入式处理器架构,常用于移动设备、嵌入式系统和智能家居设备等。

  • MIPS:MIPS是一种精简指令集(RISC)架构,常用于嵌入式系统和嵌入式处理器。

  • PowerPC:PowerPC是一种RISC架构,常用于苹果电脑和嵌入式系统。

  • SPARC:SPARC是一种RISC架构,常用于Oracle服务器和嵌入式系统。

  • RISC-V:RISC-V是一种新兴的RISC架构,它是开源的,可扩展的,被广泛应用于嵌入式系统和高性能计算领域。

ARM 是一种 Reduced Instruction Set computer (RISC).

Processor 存取数据的位置:

  • Registers
  • Memory
  • Input/Output devices

Processor 处理数据的方法

  • 汇编指令
  • 处理器硬件行为

Load 和 Store 的示意图:

Datapath 和 Control Unit

其中 Register File 为:

C 和 汇编

有 C 代码得到的 Assembly 代码如:

Load 和 Store 指令的示例:

也有:

1
2
MOV R2, #0
LDR R3, [R2, #8]

Arithmetic Operations

ADD, “add”:

1
2
3
ADD R0, R1, R2         ; R0 <- R1 + R2
ADD R0, R1, #234 ; R0 <- R1 + 234
ADD R0, R2, R3, LSL #1 ; R0 <- R2 + (R3 << 1)

“LSL” 是 “Logical Shift Left” 的缩写,它是一种指令,用于将一个二进制数向左移动一定的位数,并在右侧填充零。在ARM体系结构中,LSL指令用于进行逻辑左移操作,可以将一个寄存器中的值左移一定的位数,然后将结果存储回同一寄存器或不同的寄存器。

ADC, “addition with carry”:

1
2
3
ADC R0, R1, R2          ; R0 <- R1 + R2  + C
ADC R0, R1, #234 ; R0 <- R1 + 234 + C
ADC R0, R2, R3, LSL #1 ; R0 <- R2 + (R3 << 1) + C

( 这里加上的, 是上一次操作的进位情况 )

SUB, “subtract”:

1
2
3
SUB R0, R1, R2         ; R0 <- R1 - R2
SUB R0, R1, 234 ; R0 <- R1 - 234
SUB R0, R2, R3, LSL #1 ; R0 <- R2 - (R3 << 1)

SBC, “subtraction with carry”:

1
2
3
SBC R0, R1, R2          ; R0 <- R1 - R2  - NOT C
SBC R0, R1, #234 ; R0 <- R1 - 234 - NOT C
SBC R0, R2, R3, LSL #1 ; R0 <- R2 - (R3 << 1) - NOT C

( 这里的 carry 表示 borrow )

AND, “and” 运算:

1
AND R3, R1, R2

ORR, “or” 运算:

1
ORR R4, R1, R2

EOR, “xor” 运算:

1
EOR R5, R1, R2

BIC, “Bit Clear = $A \& \sim B$”:

1
BIC R6, R1, R2

MVN, “MoVe and NOT”, 先赋值, 然后做 NOT 运算:

1
MVN R7, R2

LSL, “Logic Shift Left”, 左移:

1
LSL R0, R5, #7

LSR, “Logic Shift Right”:

1
LSR R1, R5, #17

MUL, “Multiply”, 乘法:

1
MUL R2, R1, R0

CMP, “Compare”, 比较:

1
CMP R5, R6

本质是进行 $R5 - R6$ 的运算, 不会保存运算结果.

其会设置一些 flags, 如:

  • 0, $Z = 1$ (Zero)
  • 负数, $N = 1$ (Nagetive)
  • carry out, $C = 1$ (Carry)
  • signed overflow, $V = 1$ (oVerflow)

在普通指令之后加上 S (“Set”) 也会设置 flags, 如:

1
ADDS R1, R2, R3

在普通指令之后加上 NE (“Not Equal”), 来利用状态 flags, 其利用 $Z = 0$ 作为条件:

1
2
CMP   R1, R2
SUBNE R3, R5, R8

在普通指令之后加上 EQ (“Equal”), 来利用 $Z = 1$ 作为条件:

1
2
CMP   R5, R9
SUBEQ R1, R2, R3

在普通指令之后加上 MI (“Minus”), 判断结果是否为负数, 来利用 $N = 1$ 作为条件:

1
2
CMP   R5, R9
ORRMI R4, R0, R9

B (Branch) 指令是一种无条件分支指令,用于实现程序跳转。

B 指令的作用是将程序计数器(PC)设置为指定的地址,从而实现无条件跳转。在 ARC 指令集中,B 指令的语法格式为:

1
B <target>

示例:

1
2
3
4
5
6
    MOV R2, #17      ; R2 = 17
B TARGET ; branch to target
ORR R1, R1, #0x4 ; not excuted

TARGET
SUB R1, R1, #78 ; R1 = R1 - 78

其中, 表示跳转目标地址(即跳转到哪个地址执行)。例如,”B 0x8000” 表示将程序计数器设置为地址 0x8000,从而跳转到该地址执行指令。

BL(Branch with Link)指令是 ARM 处理器指令集中的一种分支指令,用于实现子程序(函数)的调用。与 B 指令不同的是,BL 指令在跳转之前会将返回地址存储到链接寄存器(LR)中,从而实现函数调用后的返回操作。

BL 指令的语法格式为:

1
BL <target>

其中,<target> 表示跳转目标地址(即函数的入口地址)。执行 BL 指令时,处理器会将当前指令的下一条指令地址(即返回地址)存储到链接寄存器 LR 中,然后跳转到指定地址执行指令。

在函数执行完毕后,可以使用 BX LR 指令(或 MOV PC, LR 指令)将链接寄存器 LR 中的返回地址取出,从而实现函数调用后的返回操作。

需要注意的是,在使用 BL 指令时需要保证链接寄存器 LR 的值不被意外修改,否则可能导致函数调用后无法正确返回。因此,一般来说,在函数内部会先将 LR 的值保存到堆栈中,然后再执行其他操作,最后再从堆栈中将 LR 的值取出,从而实现正确的返回操作。

也可以设置条件, 加上 EQ 后缀等, 如:

1
2
3
4
5
6
7
8
    MOV R0, #4      ; R0 = 4
ADD R1, R0, R0 ; R1 = R0 + R0 = 8
CMP R0, R1 ; sets flags with R0 - R1
BEQ THERE ; branch not taken (Z = 0)
ORR R1, R1, #1 ; R1 = R1 OR R1 = 9

THERE
ADD R1, R1, 78 ; R1 = R1 - 78 = 87

BX:Branch and eXchange,表示分支并且交换指令。BX 指令用于实现分支和跳转操作,可以将程序计数器(PC)设置为指定地址并且切换到 ARM 或者 Thumb 模式。

LR:Link Register,表示链接寄存器。LR 寄存器是一个特殊的寄存器,用于保存函数调用后的返回地址。在 ARM 处理器中,函数调用时一般使用 BL 指令将返回地址保存到 LR 中,然后在函数返回时使用 BX LR 指令将 PC 设置为 LR 中保存的返回地址,从而实现函数的返回操作

C 到 汇编的示例:

汇编实现 if/else:

汇编实现 while:

汇编实现 for:

条件码

在 ARM 处理器的指令集中,条件码(Condition Code)后缀用于指定在什么情况下执行指令。除了 “EQ”(Equal,等于)之外,还有以下常见的条件码后缀:

  • NE (Not Equal,不等于)
  • LT (Less Than,小于)
  • GT (Greater Than,大于)
  • LE (Less or Equal,小于等于)
  • GE (Greater or Equal,大于等于)
  • MI (Minus,负数)
  • PL (Plus,非负数)
  • VS (Overflow Set,溢出)
  • VC (Overflow Clear,未溢出)
  • HI (Higher,大于无符号数)
  • LS (Lower or Same,小于等于无符号数)

这些条件码后缀可以与指令一起使用,从而指定只有在满足特定条件时才执行指令。例如,”ADDNE R0, R1, R2” 表示只有在上一次操作结果不等于零时才执行 ADD 操作。这种条件执行指令的机制可以提高程序的灵活性和效率,从而更好地满足不同应用场景的需求。

在 ARM 处理器的指令集中,大多数指令都可以加上条件码后缀,从而实现条件执行的机制。具体来说,可以加上条件码后缀的指令主要包括以下几种:

  • 数据处理指令(Data Processing Instructions):包括 ADD、SUB、AND、ORR、EOR、MOV、MVN 等指令。

  • 分支指令(Branch Instructions):包括 B、BL、BX 等指令。

  • 软件中断指令(Software Interrupt Instructions):包括 SWI 指令。

  • 加载/存储指令(Load/Store Instructions):包括 LDR、STR、LDM、STM 等指令。

  • 协处理器指令(Coprocessor Instructions):包括 MCR、MRC、CDP、LDC、STC 等指令。

需要注意的是,有些指令不支持条件码后缀,例如 BXJ、CLZ、MRS、MSR 等指令。此外,一些指令的条件码后缀可能有一些限制,例如在使用 LDR 指令时只能使用条件码 EQ、NE、CS、CC、MI、PL、HI、LS、AL 等,而不能使用 LT、GT、LE、GE、VS、VC 等条件码后缀。在使用指令时需要注意查看相关文档以了解条件码后缀的使用限制。

Lecture 11 Embedded System Software Design, Testing, and Debugging

Data Transfer Instructions

LDR (Load) 和 STR (Store) 指令.

ADR 指令是 ARM 处理器指令集中的一种指令,用于计算一个地址并将其存储到寄存器中。具体来说,ADR 指令的作用是将某个标签(Label)对应的地址计算出来,并将其存储到指定的寄存器中。

ADR 是 Address 的缩写,表示地址。因此,ADR 指令的名称可以解释为“计算并存储地址”的意思。

ADR 指令的语法格式为:

1
ADR Rd, label

其中,Rd 表示目标寄存器,label 表示要计算地址的标签(Label)。执行 ADR 指令时,处理器会将 label 对应的地址计算出来,并将其存储到指定的寄存器 Rd 中。

需要注意的是,ADR 指令只能用于计算当前代码段中的标签地址,不能用于计算其他代码段或者数据段的地址。此外,在使用 ADR 指令时需要确保目标寄存器的位数与地址位数匹配,否则可能会导致计算出的地址不正确。

使用 LDRSTR 指令的示例:

Components for Embedded Programs

三种常用的结构:

  • State Machines

  • Circular Buffers

  • Queues

Models of Programs

  • data flow graph

  • control/data flow graphs

Compilation Techniques

栈指针 SP (Stack Pointer) 指向当前 frame 的结尾.

帧指针 FP (Frame Pointer) 指向最后一个 frame 的结尾.

需要对 registers reuse.

Testing Techniques

White Box Testing (白盒测试), 也称 Structural Testing (结构性测试).

此时知道系统的内部结构以及代码.

Black Box Testing (黑盒测试), 也称 Functional Testing (功能性测试) 或 data-driven testing (数据驱动测试)

此时不清楚系统的内部结构和代码.

有三种类型的 Black Box Testing:

  • Fucntional Testing, 检测是否能正常工作
  • Non-Functional Testing, 检测如何工作
  • Regression Testing, 版本兼容

注意 Testing 和 Debugging 是两个不同的概念.

Lecture 12 Embedded System Software Design, Testing, and Debugging


Embeded-Processors-Class-Notes
http://example.com/2023/06/13/Embeded-Processors-Class-Notes/
作者
Jie
发布于
2023年6月13日
许可协议