原创 关于Arm的中断

2008-4-1 21:34 2151 13 13 分类: MCU/ 嵌入式

VIC:

ARM
19个中断源,为其分配了0 - 18VIC通道。

向量控制寄存器
VICVectCntl0-15记录了各个通道号及其使能位。

当中断发生时,
VICVectAddr0-15中的一个值会被copyVICVectAddr.


如果是非向量中断则
VICdefaultAddrcopyVICVectAddr.


程序跳转到
VICVectorAddr指向的地址。

中断返回时,写
0x00VICVectAddr.


非向量中断是指那些虽然已经打开(允许),但是没有在相应的VICVectorCntl0~15VICVectorAddr0~15中设置的中断。


关于中断设置:


1
、首先,硬复位后所有的Special
Function Registor
都有默认值。不必考虑设置的顺序问题。可以先设置好中断,再开通模块功能。

2、软中断(SWI)与非向量中断不同,它的入口是0x0000,0008。进入软中断后,系统变为管理模式。而非向量中断入口是0x0000,0018。它引导系统进入fiq/irq模式。

3VIC设置实例

    VICIntSelect = 0x00000000;    //
所有中断都是IRQ

    VICVectCntl0 = 0x20 | 15;    //EINT1
为向量中断,使用Slot0

    VICVectAddr0 = (uint32)EINT1_Exception;   
//EINT1
中断地址

   
VICDefVectAddr
= (uint32)Default_Entry;    //
非向量中断地址

   
VICIntEnable
= 0x00018000;    //
使能EINT1EINT2

   
由于在管理向量中断的VICVectCntl0~15VICVectAddr0~15中只设置了EINT1,故EINT2中断发生时,要进入非向量中断处理程序Default_Entry


关于优先级:

在调试
C语言的多中断程序时,在中断中设断点,调了几个循环就全乱了。开始时怀疑编译器有问题,后来发现是Debugger不够好。

测试如下:

1、修改C
Compiler
的优化级别为最低。重新编译。

2、令Timer0定时0.25秒中断,在中断中将Test++

   令
EINT3(外部RTC)1秒中断,在中断中用LCD显示Test的值并将一个LED取反。然后再用软件延时,占据CPU0.9秒或0.5秒后才退出中断。

3、令Timer0的优先级小于EINT3LED1秒断续,LCD显示的Test值一秒加一。

4、令Timer0的优先级大于EINT3LED1秒断续,LCD显示的Test值一秒加一或加二或加四。

结论:
Timer0Test加一/加二/加四是在EINT3退出后的间隙中完成的。所以,IRQ中可能没有传说中的优先级机制。


关于Spurious
Interrupts:

http://www.arm.com/support/faqip/3677.html的介绍。其中Solution1、2、3皆可行。当然,最好的办法是不要老是关中断。

G18App的主循环中不断关闭/开启UART的中断以读取其缓冲区的长度及数据,出现以下现象:程序经常走进VICDefaultAddress!

解释:当UART中断产生时,Core
latches the IRQ status,
此时,UART的中断被关闭。然后,Core
loads IRQ Address from VIC. the VIC will not be able to clearly identify the
interrupt that generated the interrupt request, and as a result the VIC will
return the default interrupt VICDefVectAddr.




PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /3 下一条