自己正在ARM的学习中,曾经只学过51,没学过ARM和体系,现在开端学习ARM。
运用的的是PHILIPS 的ARM操控器LPC2000系列
1.I/O装备
LPC2000有管脚功用装备寄存器,一个管脚可以经过PINSEL0~2的装备,可以有1~4个功用(有的只需一个),但不是说恣意一个管脚可以装备为恣意功用,只能经过器材手册的规则挑选规则功用中的一个。
2.中止
LPC2000的中止专门有一套寄存器来办理,这套寄存器称为VIC(向量中止操控器)。
向量中止操控器(VIC)具有32 个中止恳求输入,可将其编程分为3 类:FIQ、向量IRQ 和非向量IRQ。可编程分配机制意味着不同外设的中止优先级可以动态分配并调整。
所谓FIQ,便是快速中止,要求具有最高优先级。假如分配给FIQ 的恳求多于1 个,VIC将中止恳求“相或”后向ARM 处理器发生FIQ 信号。当只需一个中止被分配为FIQ 时可完成最短的FIQ 等待时间,由于FIQ 服务程序只需简略地发动器材的处理就可以了。但假如分配给FIQ 级的中止多于1 个,FIQ 服务程序从VIC 中读出一个字来辨认发生中止恳求的FIQ 中止源是哪一个。
向量IRQ,具有中优先级,便是IRQ下还可以分为16个优先级,依据VICVectAddr0~15 来摆放模块的优先级,0为最高级别,15为最低优先级
非向量IRQ,具有最低优先级,多个中止共用一个中止服务子程序(ISR)进口,进口地址放到VICDefVectAddr中,并经过读取中止的状况来判别是哪个中止被呼应。
FIQ和IRQ的挑选由寄存器VICIntEnable、VICIntSelect来装备,向量IRQ和非向量IRQ由VICVectCntl0~15的第5位来挑选,VICVectAddr0~15 所决议的中止进口地址对应的中止是由VICVectCntl0~15的低4位所代表的中止号(通道,详见芯片的数据手册)决议。
尽管可以挑选多个中止源(经过VICIntSelect)来发生FIQ 恳求,可是只需一个专门的中止服务程序来服务呼应一切可用/呈现的FIQ 恳求。因而,假如分配为FIQ 的中止多于一个,FIQ 中止服务程序就必须读取VICFIQStatus 的内容来决议怎么处理中止恳求。不过仍是主张只将一个中止分配为FIQ。多个FIQ 中止源会添加中止推迟。
一旦发生中止号为N的向量IRQ恳求,VICVectAddr 和分配给中止号为N的ISR地址相同,即VICVectAddr=VICVectAddr X,而VICVectCnt X=0X0000 002N,VICVectAddr X=ISR地址。一般,取得ISR地址,可以经过将ISR的函数强制由void转换为usigned long完成,比方VICVectAddr0=(unsigned long)time_int();
一旦发生非向量IRQ恳求,那么VICVectAddr 的内容与VICDefVectAddr 相同。
在中止服务程序履行结束后,对外设中止标志的清零将会对VIC 寄存器(VICRawlntr,VICFIQStatus 和VICIRQStatus)傍边的对应位发生影响。别的,为了可以服务下次中止,必须在中止回来之前对ICVectAddr 寄存器履行写操作。该写操作将清零内部中止优先级硬件傍边对应的中止标志。
假如看门狗只在溢出或无效喂狗时发生中止,那么无法铲除中止。仅有的办法是经过VICIntEnClr 制止VIC 中止来完成中止回来。
VICIRQStatus IRQ 状况寄存器。该寄存器读出界说为IRQ 并使能的中止的状况。
VICFIQStatus FIQ 状况恳求。该寄存器读出界说为FIQ 并使能的中止的状况。
VICRawIntr 一切中止的状况寄存器。该寄存器读出32 个中止恳求/软件中止的状况,不论中止是否使能或分类
VICIntSelect 中止挑选寄存器。该寄存器将32 个中止恳求的每个都分配为FIQ 或IRQ
VICIntEnable 中止使能寄存器。该寄存器操控将32 个中止恳求和软件中止中的哪些使能为FIQ 或IRQ
VICIntEnClr 中止使能清零寄存器。该寄存器答应软件将中止使能寄存器中的一个或多个位清零
VICSoftInt 软件中止寄存器。该寄存器的内容与32 个不同外设的中止恳求“相或”。
VICSoftIntClear 软件中止清零寄存器。该寄存器答应软件将软件中止寄存器中的一个或多个位清零。
VICProtection 维护使能寄存器。该寄存器答应特权方式下运转的软件对VIC 寄存器进行有限的拜访,运转在用户方式下的软件运用该1 位寄存器来操控对VIC 寄存器的拜访。
VICVectAddr 向量地址寄存器。当发生一个IRQ 中止时,IRQ 服务程序可读出该寄存器并跳转到读出的地址。
VICDefVectAddr 默许向量地址寄存器。该寄存器保存了非向量IRQ的中止服务程序(ISR)地址。
VICVectAddr0~15 向量地址0~15 寄存器。向量地址寄存器0-15 保存了16个向量IRQ slot 的中止服务程序地址。
VICVectCntl0~15 向量操控0~15 寄存器。向量操控寄存器0-15 别离操控16 个向量IRQ slot 中的一个。Slot0 优先级最高,而Slot15 优先级最低。在VICVectCntl 寄存器中制止一个向量IRQ slot 不会制止中止本身,中止仅仅变为非向量的方式。
bit 5 1:向量IRQ 使能,当分配的中止恳求或软件中止使能,被分配为IRQ 并声明时,可发生一个仅有的ISR 地址对应位的中止恳求使能并分配为FIQ而且声明。
bit 4:0 分配给此向量IRQ slot 的中止恳求或软件中止的编号。作为一个杰出的编程习气,不要将把相同的中止编号分配给多于一个使能的向量IRQ slot。但假如这样做了,傍边止恳求或软件中止使能,被分配为IRQ 并声明时,会运用最低编号的slot。
VIC 将一切向量和非向量IRQ“相或”向ARM 处理器发生IRQ 信号。IRQ 服务程序可经过读取VIC 的一个寄存器当即发动并跳转到相应地址。假如有恣意一个向量IRQ 宣布恳求,VIC 则供给最高优先级恳求IRQ 服务程序的地址,不然供给所默许程序的地址。该默许程序由一切非向量IRQ 共用。默许程序可读取另一个VIC 寄存器以确认哪个IRQ被激活。
笔者正在学习uCOS-II,移植到ARM时考虑到数据类型的界说,但关于Keil MDK编译器的数据类型界说仍是很含糊,首要便是区别不了short int、int、long 和long int占用多少字节。为了得到一个威望的答案,改用编译器本身得出。
一、先界说几个变量,用于寄存各数据类型的字节数。
//#include
#include
unsigned char a,b,c,d,e,f,g;
main()
{
a=sizeof(char);
b=sizeof(short int);
c=sizeof(int);
d=sizeof(long);
e=sizeof(long int);
f=sizeof(float);
g=sizeof(double);
while(1);
}
二、检查各变量的寄存地址。View—Symbols Window。
三、检查各地址寄存的值。View—memory Window。
由上图可知得出:
char占用1个字节
short int占用2字节
int占用4字节
long占用4字节
long int占用4字节
float占用4字节
double占用8字节
咱们即可这样界说宏:
typedef unsigned char uint8; // 无符号8位整型变量
typedef signed char int8; // 有符号8位整型变量
typedef unsigned short uint16; // 无符号16位整型变量
typedef signed short int16; // 有符号16位整型变量
typedef unsigned int uint32; // 无符号32位整型变量
typedef signed int int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度)
typedef double fp64; // 双精度浮点数(64位长度)