嵌入式系统中基本汇编语法详解
初等应用
if语句
if (a<b){x=5;y=c+d;}
else{x=c-d;}
ADR r4 ,a;
LDR r0 ,[r4];
ADR r4 ,b;
LDR r1 ,[R4];
CMP r0 ,r1;
BLT fblock;
ADR r4 ,c;
//若干执行语句(else)
B after
fblock ADR ;
//若干执行语句(if a<b)
after
for循环
for (i=0;i<20;i++){
for (j=0;j<10;j++){
z[i][j]=a[i][j]*b[i];
}
}
MOV r0 ,#0 ;ro-i
ADR r2 ,z;
ADR r3 ,a;
ADR r4 ,b;
MOV r8 ,#0;
MOV r9 ,#0;
LOOP mov r1,#0; r1=0;
LOOP1 LDR r5 ,[r3,r8];a[i][j]
LDR r6 ,[r3,r9];b[i]
MUL r7 ,r5,r6;
STR r7 ,[r4,r8];
ADD r1,r1,#1;
ADD r8,r8,#4;
CMP r1,#10;
BLT loop 1
ADD r9,r9,#4
ADD r0,r0,#1;
CMP r0,#20
BLT loop
loopend
for (i=0;i<20;i++){
for (j=0;j<10;j++){
z[i][j]=a[i][j]*b[j];
}
}
MOV r0 ,#0 ;ro-i
ADR r2 ,z;
ADR r3 ,a;
ADR r4 ,b;
MOV r8 ,#0;
MOV r9 ,#0;
LOOP mov r1,#0; r1=0;
MOV r9 ,#0;
LOOP1 LDR r5 ,[r3,r8];a[i][j]
LDR r6 ,[r3,r9];b[i]
MUL r7 ,r5,r6;
STR r7 ,[r4,r8];
ADD r1,r1,#1;
ADD r8,r8,#4;
ADD r9,r9,#4
CMP r1,#10;
BLT loop 1
; ADD r9,r9,#4
ADD r0,r0,#1;
CMP r0,#20
BLT loop
loopend
状态机的应用
Thumb指令集
Thumb指令集使用16bit指令的再编码子集,比ARM具有更好的代码密度 增加ARM使用16位总线时的系统性能。
相似处
Thumb指令都是16位,都有相对应的ARM指令,因此继承了ARM指令集的许多特d点
- L-S结构
- 支持8位字节,16位半字,32位字数据
差异处
为了实现16位指令
-
多数thumb指令无条件执行
条件执行:
条件域占据32位指令域的高4位,条件域共有16个值,每个值都根据CPSR中的标志位决定指令是否执行还是跳转。
-
多数数据处理指令采用2地址格式
-
没有ARM指令格式规则
B和BL
- 没有太大的区别,只不过B主要用于非返回的跳转,BL一般用于子程序。
- BL 会将下一条指令的地址存入r14
- 回转时只需要 MOV r15,r14;
计算平台
基本计算平台
平台硬件组件
平台软件组件
硬件和软件不可分割,需要二者配合实现功能。嵌入式系统的许多软件来自外部资源,一些软件组件来自于第三方。层次图常用来描述系统中不同软件组件间的关系,硬件抽象层(HAL)提供硬件的基本层次抽象,设备驱动通常采用HAL来简化它们的结构,同时,电池管理模块必须在低层次上对硬件进行访问。操作系统和文件系统提供复杂应用所需要的基本抽象。
CPU总线
总线是CPU与存储器和设备通信的机制。总线,首先是一束电线,还定义了CPU,存储器和设备之间的通信。总线的主要作用是提供到存储器的接口。CPU作为总线主控器,启动所有的传输。大部分总线协议采取四周期握手,握手协议保证当两个设备试图通信时,一个准备发送,一个准备好接受。
- 设备1将查询信号置为高电平,以告诉设备2应准备监听数据
- 设备2准备好接受数据,将应答信号置为高电平,设备1和设备2已经准备好发送和接受。
- 设备2将应答信号置为低电平表示为接受了数据。
- 应答信号变低后,设备1将查询信号置为低电平。
存储设备和系统
随机存取存储器可以被读和写。
组合逻辑电路中的竞争与险象
竞争
同一个信号或同时变化的某些信号,经过不同路径到达某一个点有时差,我们将之称之为竞争,但并不是所有竞争都会产生错误的输出。对于有错误输出我们将之称为临界竞争。
险象
静态险象
当输出为1-0-1,该险象称之为静态1险象;当输出为0-1-0,该险象称之为静态0险象。
静态险象又分为功能险象和逻辑险象。
功能险象
- K个输入信号同时发生变化
- 输入变量变化前后的稳态输出不变
功能险象是由于各输入信号变化的快慢不一致导致了竞争,是逻辑函数功能所固有的,无法通过改变设计的方法消除,它只能通过控制输入信号的变化次序来避免
逻辑险象
- 仅有一个输入信号发生变化
- 输入变量变化前后的稳态输出相同
动态险象
若输入变化前后的稳态值不同,且在输出稳定前出现 1-0-1-0 0-1-0-1,我们称之为动态险象。
CPU
存储系统机制
高速缓存被广泛用于提高内存系统性能。可以显著减少内存平均访问时间,
强制性未命中
单元第一次被访问时
容量未命中
工作集过大
冲突未命中
两个地址映射到高速缓存的同一个单元
实现高速缓存的方法
直接映射高速缓存
高速缓存由高速缓存块组成
用于指示这一块代表哪个内存单元的标记
用于保存内存相应内容的数据域
表示该高速缓存块内容是否有效的有效标记
索引用于选择高速缓存中的哪一块被检测。
标记用来与被索引选中块的标记值进行比较
如果数据域的长度大于最小的寻址单元,那地址的最低几位用作偏移量,从数据域中选择所需的值。
写操作
通写
每次写操作将都同时改变高速缓存和相应的主存单元,这种模式保证了高速缓存和主存的一致性,但会产生额外的主存通信。
回写
只在将某一单元从高速缓存中移出时才进行写,我们因此可以减少在该单元移出高速缓存之前对它的多次写操作。
组相联
组相联高速缓存由存储体个数或路来描述,相应称为n路组相联高速缓存。
CPU技术
流水线技术
ARM7的三段流水线
1.取指 :将指令从内存中取出来
2.译码: 译码得到操作码和操作数来决定执行什么功能。
3.执行: 执行已译码的指令。
流水线化的RISC机器更是具有特备规则的时序特征;大部分没有流水线冒险的指令都表现出相同的延时。
不理想的状态
数据阻滞
多装入指令就是在执行阶段需要多个周期才能完成的例子。
控制阻滞
这就是我们所说的分支损失,是否执行条件BNE要等指令的第三个时钟周期才能确定。
引入延迟分支 在这种形式的分支指令中,有一些直接跟在分支指令后面的指令往往会执行,无论分支指令执行与否它们都会执行。
存储器
随机存取存储器(RAM)可以被读和写。随机存取是因为它们可以按照任意顺序访问。
一般是动态随机存储器(DRAM),DRAM密度很大,但是数据需要周期性刷新。
由于某部分存储单元正在被刷新,在刷新结束前它是不能被访问的。
只读存储器
内存是ROM的主要类型,它使用标准电压擦写和编程,允许芯片在标准系统内部再编程。