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 优先级最低。
arm中断学习变量长 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)