2.DMA总线:直接内存总线,IO直接 跳过 CPU和内存联系,效率高。
3.寄存器:用于在指令执行过程中存放操作数和中间数的容器。
4.ARM处理器的八种寻址方式
1. 在异常发生后, ARM 内核会自动做以下工作:
保存执行状态:将CPSR复制到发生的异常模式下SPSR中;
模式切换:将CPSR模式位强制设置为与异常类型相对应的值,同时处理器进入到ARM执行模式,禁止所有IRQ中断,当进入FIQ快速中断模式时禁止FIQ中断;
保存返回地址:将下一条指令的地址(被打断程序)保存在LR(异常模式下LR_excep)中。
跳入异常向量表:强制设置PC的值为相应异常向量地址,跳转到异常处理程序中。
(1)保存执行状态
当前程序的执行状态是保存在CPSR里面的,异常发生时,要保存当前的CPSR里的执行状态到异常模式里的SPSR里,将来异常返回时,恢复回CPSR,恢复执行状态。
(2)模式切换
硬件自动根据当前的异常类型,将异常码写入CPSR里的M[4:0]模式位,这样CPU就进入了对应异常模式下。不管是在ARM状态下还是在THUMB状态下发生异常,都会自动切换到ARM状态下进行异常的处理,这是由硬件自动完成的,将CPSR[5] 设置为 0。同时,CPU会关闭中断IRQ(设置CPSR 寄存器I位),防止中断进入,如果当前是快速中断FIQ异常,关闭快速中断(设置CPSR寄存器F位)。
(3)保存返回地址
当前程序被异常打断,切换到异常处理程序里,异常处理完之后,返回当前被打断模式继续执行,因此必须要保存当前执行指令的下一条指令的地址到LR_excep(异常模式下LR,并不存在LR_excep寄存器,为方便读者理解加上_excep,以下道理相同),由于异常模式不同以及ARM内核采用流水线技术,异常处理程序里要根据异常模式计算返回地址。
(4)跳入异常向量表
该操作是CPU硬件自动完成的,当异常发生时,CPU强制将PC的值修改为一个固定内存地址,这个固定地址叫做异常向量
2.看门狗定时器
相信大家都看过中国移动前些时间做的一个广告,从城市到山村,到青藏高原,在哪儿都有中国移动的网络,到哪儿都能打电话,由此可以联想到中国移动在全国有无数个信号基站,很多基站建设在环境比较恶劣的地方,我们来思考一个问题?假如,有一天某个基站出了问题不能正常工作了,毫无疑问,移动的工作人员会带各种检测设备去进行修理,如果是出现非硬件故障(如用户电话服务突然巨增,造成繁忙死机或电磁干扰造成CPU运行出错等),导致基站服务器出现异常死机,工作人员只需要进行一个操作,重启一下即可。如果该基站安装在青藏高原上,这样一次上去,成本是很大的。退一步讲,这种情况虽然成本很高,但是还是可以修复的,如果这种情况出现在月球探测器身上,问题就更严重了。因此针对这种特殊情况的设备,我们期待有一种设备能够在机器出现非正常情况下进行自动重启来恢复工作状态,使用看门狗定时器就可以完美解决这个问题了。
看门狗WatchDog的名字形象的描述了它的工作原理,看门狗每隔一段时间(比如:3个小时)它就会饥饿,每次饥饿时都叫,如果不想让它叫,只要我们保证在3个小时内喂狗一次就行。因此我们要及时的对看门狗控制器执行喂狗操作。
看门狗定时器内部有一个递减计数器,当该计数器递减为0的时候,就会自动重启控制器(如下图所示),如果我们写有这样的程序,该程序在定时器计数器递减为0之前,将其递减计数器重新设置一下(喂狗),那么就不会产生重启操作。假如机器设备出现异常情况下如死机,CPU执行出错,程序跑飞等情况,CPU就会陷入非正常的执行流程,就不会去执行重置计数器的程序,当计数器递减为0时,会产生复位控制器信号,机器就会重新启动,恢复正常执行流程。这样的设计原理就解决了很多环境恶劣的情况下,对服务器进行重启的任务。上面的重置倒计数的操作通常叫做“喂狗”。
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列等。
1.ARM汇编循环亮灭LED2:
.text
.global _start
_start:
ldr r0,=0x11000C40 @GPX2CON
ldr r1,[r0]
bic r1,#0xF0000000
orr r1,#0x10000000
str r1,[r0]
loop:
ldr r0,=0x11000C44 @GPX2DAT
ldr r1,[r0]
orr r1,#0x80
str r1,[r0]
bl delay
ldr r0,=0x11000C44
ldr r1,[r0]
bic r1,#0x80
str r1,[r0]
bl delay
b loop @跳回去循环量灭
delay: @这下面都是延时函数
ldr r0,=0x10000000
mov r1,#0
start:
add r1,#1
cmp r1,r0
bne start
mov pc,lr @如果相等跳到函数调用处(bl下一条指令处)
.end
2. #define GPX2CON (*(volatile unsigned int *)0x11000C40)
3.C语言实现LED2的循环量灭:
#define GPX2CON *((volatile unsigned int *)0x11000C40)
#define GPX2DATA *((volatile unsigned int *)0x11000C44)
#define GPX1CON *((volatile unsigned int *)0x11000C20)
#define GPX1DATA *((volatile unsigned int *)0x11000C24)
#define GPF3CON *((volatile unsigned int *)0x114001E0)
void delay()
{
int i,j;
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
{}
}
}
int main()
{
GPX2CON=((GPX2CON)&0x0FFFFFFF)|0x10000000;
GPX1CON=((GPX1CON)&0xFFFFFFF0)|0x1;
while(1)
{
GPX2DATA=(GPX2DATA)|0X80;
delay();
GPX2DATA =(GPX2DATA)&0XFFFFF7F;
delay();
GPX1DATA=GPX1DATA|0x01;
delay();
GPX1DATA=GPX1DATA&0xFFFFFFFE;
delay();
}
return 0;
}
I2C:同步(同步就需要一根线是时钟线),半双工,2根线。
4.IRQ和FIQ有什么区别