终于 整明白了中断的工作原…
2013-12-19 20:30
1341 查看
原文地址:整明白了中断的工作原理!">终于 整明白了中断的工作原理!作者:小赵
ARM
C中中断程序和其他的c的中断程序一样,就是有中断向量表,入口地址,中断应用程序三部分组成
//中断向量表
// ISR
#define
pISR_RESET
(*(unsigned *)(_ISR_STARTADDRESS+0x0))
#define
pISR_UNDEF
(*(unsigned *)(_ISR_STARTADDRESS+0x4))
#define
pISR
(*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define
pISR_PABORT (*(unsigned
*)(_ISR_STARTADDRESS+0xc))
#define
pISR_DABORT (*(unsigned
*)(_ISR_STARTADDRESS+0x10))
#define
pISR_RESERVED (*(unsigned
*)(_ISR_STARTADDRESS+0x14))
#define
pISR_IRQ
(*(unsigned *)(_ISR_STARTADDRESS+0x18))
#define
pISR_FIQ
(*(unsigned *)(_ISR_STARTADDRESS+0x1c))
//中断初始话
void Isr_Init(void)
{
pISR_UNDEF=(unsigned)HaltUndef;/
pISR =(unsigned)Hal;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
rINTMOD=0x0;
// All=IRQ mode
rINTMSK=BIT_ALLMSK;
// All interrupt is masked.
//pISR_URXD0=(unsigned)Uart0_RxInt;
//rINTMSK=~(BIT_URXD0);
//enable UART0 RX Default value=0xffffffff
#if 1
pISR_USBD
=(unsigned)IsrUsbd;
pISR_DMA2
=(unsigned)IsrDma2;
#else
pISR_IRQ
=(unsigned)IsrUsbd;
//Why doesn't it receive the big file if use this. (???)
//It always stops when 327680 bytes are received.
#endif
ClearPending(BIT_DMA2);
ClearPending(BIT_USBD);
//rINTMSK&=~(BIT_USBD);
//pISR_FIQ,pISR_IRQ
must be initialized
}
//具体中断函数
void HaltUndef(void)
{
Uart_Printf("Undefined
instruction exception!!!\n");
while(1);
}
自己从一开始 接触arm,就听说了中断
,同时也见到了以上类似代码,准确来说可以追溯到去年暑假,至于在本科时也在教科书上好象见过就不说了,呵呵。一直没有搞明白到底是怎么回事,直到昨天晚上看到这个例子
,再加上前段时间看了 c epert programing
对c语言有了进一步的了解,终于搞明白了。呵呵 回首往事
,发现关键在于,以前不明白 同一个数
在左是址,在右是值,所以上面pISR_UNDEF=(unsigned)HaltUndef;是把HaltUndef地址值
存放到(*(unsigned *)(_ISR_STARTADDRESS+0x4))这个地址中 呵呵 现在
总算拨开云雾见天日,其他相关问题便迎任而解了
ARM
C中中断程序和其他的c的中断程序一样,就是有中断向量表,入口地址,中断应用程序三部分组成
//中断向量表
// ISR
#define
pISR_RESET
(*(unsigned *)(_ISR_STARTADDRESS+0x0))
#define
pISR_UNDEF
(*(unsigned *)(_ISR_STARTADDRESS+0x4))
#define
pISR
(*(unsigned *)(_ISR_STARTADDRESS+0x8))
#define
pISR_PABORT (*(unsigned
*)(_ISR_STARTADDRESS+0xc))
#define
pISR_DABORT (*(unsigned
*)(_ISR_STARTADDRESS+0x10))
#define
pISR_RESERVED (*(unsigned
*)(_ISR_STARTADDRESS+0x14))
#define
pISR_IRQ
(*(unsigned *)(_ISR_STARTADDRESS+0x18))
#define
pISR_FIQ
(*(unsigned *)(_ISR_STARTADDRESS+0x1c))
//中断初始话
void Isr_Init(void)
{
pISR_UNDEF=(unsigned)HaltUndef;/
pISR =(unsigned)Hal;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
rINTMOD=0x0;
// All=IRQ mode
rINTMSK=BIT_ALLMSK;
// All interrupt is masked.
//pISR_URXD0=(unsigned)Uart0_RxInt;
//rINTMSK=~(BIT_URXD0);
//enable UART0 RX Default value=0xffffffff
#if 1
pISR_USBD
=(unsigned)IsrUsbd;
pISR_DMA2
=(unsigned)IsrDma2;
#else
pISR_IRQ
=(unsigned)IsrUsbd;
//Why doesn't it receive the big file if use this. (???)
//It always stops when 327680 bytes are received.
#endif
ClearPending(BIT_DMA2);
ClearPending(BIT_USBD);
//rINTMSK&=~(BIT_USBD);
//pISR_FIQ,pISR_IRQ
must be initialized
}
//具体中断函数
void HaltUndef(void)
{
Uart_Printf("Undefined
instruction exception!!!\n");
while(1);
}
自己从一开始 接触arm,就听说了中断
,同时也见到了以上类似代码,准确来说可以追溯到去年暑假,至于在本科时也在教科书上好象见过就不说了,呵呵。一直没有搞明白到底是怎么回事,直到昨天晚上看到这个例子
,再加上前段时间看了 c epert programing
对c语言有了进一步的了解,终于搞明白了。呵呵 回首往事
,发现关键在于,以前不明白 同一个数
在左是址,在右是值,所以上面pISR_UNDEF=(unsigned)HaltUndef;是把HaltUndef地址值
存放到(*(unsigned *)(_ISR_STARTADDRESS+0x4))这个地址中 呵呵 现在
总算拨开云雾见天日,其他相关问题便迎任而解了
相关文章推荐
- 终于 整明白了中断的工作原…
- 终于 整明白了中断的工作原…
- 终于 整明白了中断的工作原…
- HDU:汉诺塔VII 终于做出来了!
- linux 默认语言选中文后中断出现乱…
- 51单片机的中断 笔记
- 6.2 PowerPC处理器如何处理MSI中断…
- 根据工作区更新内表失败 原因!?
- Linux 内核中断内幕(转)
- linux 工作队列(转载)
- 工作笔记之总结PCB 布局降低噪声的…
- 当桌游遇上VR 杀人终于能见血了!
- ARM9 2410移植之ARM中断原理,…
- WinCE--中断处理程序ISR 详…
- 6.3 x86处理器如何处理MSI-X中断请…
- java web工作中获得相应路径的方法
- ARM9 2410移植之ARM中断原理,…
- 1.4 PCI总线的中断机制
- 工作队列 work_struct &…
- 第9章 中断