arm中断学习及变量长度

来源:本站
导读:目前正在解读《arm中断学习及变量长度》的相关信息,《arm中断学习及变量长度》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《arm中断学习及变量长度》的详细说明。
简介:笔者正在学习uCOS-II,移植到ARM时考虑到数据类型的定义,但对于Keil MDK编译器的数据类型定义还是很模糊,主要就是区分不了short int、int、long 和long int占用多少字节。为了得到一个权威的答案,改用编译器自身得出。

本人正在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位长度)

提醒:《arm中断学习及变量长度》最后刷新时间 2024-03-14 01:12:50,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《arm中断学习及变量长度》该内容的真实性请自行鉴别。