您好、欢迎来到现金彩票网!
当前位置:双彩网 > 向量中断 >

ARM 向量中断和非向量中断

发布时间:2019-05-25 20:30 来源:未知 编辑:admin

  根据44b0的DATASEET,0x18处放置的指令为b HandlerIRQ; 当程序跳转到这里执行时, 芯片在这个地址取到的代码已经被后面程序中的branch instructions取代了,举个例子,如果芯片EINT3发生中断,芯片会跳转到0x18处执行,先在0x18处取指,这时取到的指令已经不是b HandlerIRQ,b HandlerIRQ已经被芯片自动替换成了ldr pc,=HandlerEINT3,然后芯片再执行此条指令。

  当发生中断时, 芯片自动跳转到0x18处执行, 0x18处指令为b IsrIRQ,IsrIRQ程序的作用是检查I_ISPR的各位,判断是何种中断发生,然后根据中断的种类跳转到相应的中断服务程序去执行,各种中断服务程序的地址定义如下:

  值得一提的是在44binit代码中,向量中断跳转到HandlerEINT0处而非向量中断跳转到HandleEINT0,程序利用一个宏将这两个标号等同起来,无论采取向量中断还是非向量中断,无论是跳到HandleEINT0还是HandlerEINT0,得到的效果是一样的,都是跳到了中断服务程序的地址去执行。

  另外顺便说一下飞利浦的LPC系列ARM芯片的中断的方法,当LPC芯片得到中断信号后,在中断初始化时,程序将中断服务程序的入口地址放到中断向量地址寄存器中,每个中断源有一个中断向量地址寄存器和他相对应,另外还有一个叫做VICVectAddr(0xffff0030)的寄存器,当发生中断时,硬件自动判断该执行哪一个中断,然后将该中断源对应的中断向量地址寄存器中的地址放到寄存器VICVectAddr中。程序中断向量表里的代码为跳转到VICVectAddr中的地址执行。一旦发生中断,自动跳转到VICVectAddr中的地址去执行,因为此时VICVectAddr已经被替换成中断源的中断服务程序地址了.

  这四个字节的存储空间中存的是中断服务程序的地址. 在C语言编写的main程序中,如何将中断服务程序的入口地址放入到这个存储空间中呢?细心的读者可以发现这段数据区的起始地址是_ISR_STARTADDRESS, 在MAIN函数中只要让

  MyIsr是中断服务程序的名称, 但是_ISR_STARTADDRESS是一个非定值,这个值只有在连接器连接的时候才赋值,在编译阶段他是个不定值,所以编译的时候会报错。#define _ISR_STARTADDRESS 成一个在SDRAM中的地址值。在本例中是0xc7fff00。

  (或者其他偏移量)))赋值. 在中断服务程序结尾要对I_ISPC写数清除INTPND。

http://bluecaleel.com/xiangliangzhongduan/21.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有