中断向量控制器和中断处理的主要寄存器2
2017-12-23 17:45
239 查看
中断向量控制器和中断处理的主要寄存器
--参考朱有鹏ARM裸机
1、异常处理的2个阶段
可以将异常处理分为2个阶段来理解,第一阶段是异常向量表跳转
第二阶段就是进入了真正的异常处理程序irq_handler之后的部分。
2、中断处理的第一阶段处理
(1)第一个阶段之所以能够进行,主要依赖于CPU设计的提供的异常向量表机制
第一阶段的主要任务是从异常发生到响应异常并且保存、恢复现场,
跳转到真正的异常处理程序处。
(2)第二阶段的目的是识别多个中断源中究竟哪一个发生了中断,
然后调用相应的中断处理程序来处理这个中断。
3、S3C2440的第二阶段的处理过程
(1)第一个问题:怎么找到具体是哪个中断:S3C2440的中断控制器中有一个寄存器
寄存器的每一位对应一个中断源(那么一个寄存器应该对应于32个中断源)
但是S3C2440中中断源不止32个,所以2440里面又弄了一个子中断寄存器。
(2)怎么找到对应的ISR函数的问题?
首先给每个中断做了一个编号,进入ISR_handler之后先通过查询中断控制器和
相应 的子中断寄存器确定是什么中断源。
然后用这个编号去ISR数组(ISR数组是中断初始化事先设定好的)
就是把各个中断的ISR的函数名组成一个数组,用中断对应的编号作为索引来查询这个数组
4、S5PV210的第二阶段处理过程
(1)第一个问题,怎么找到具体是哪一个中断:S5PV210中支持的中断源很多,所以
直接设计了4个中断寄存器,每个32位,每位对应于一个中断源。
(理论上210最多支持128个中断源)
210没有子中断源,每个中断都是并列的,当中断发生时,轮询的查找是哪个中断源寄存器
,看哪一位被置1,则这个位对应的寄存器就发生了中断,即找到了中断编号。
(2)第二个问题:怎么找到对应的ISR问题
210支持的中断很多,如果还是使用2440的中断函数数组的话,查找起来非常的花
时间。于是210开拓了一种全新的寻找ISR的机制。
210提供了很多寄存器来解决每个中断源对应ISR寻找问题,
实现的效果就是,当发生了相应的中断,硬件会自动的将相应的ISR推入一定的寄存器中,
我们软件只要去这个寄存器中执行函数就可以了。
5、S5PV210的中断处理的主要寄存器
5.1、VICnINTENABLE和VICnINTENCLEAR
(1)VICnINTENABLE 这是中断的使能的寄存器,在你想要的中断源置位即可,
VICnINTENCLEAR这个寄存器置1的话,就代表该中断不使能。
5.2、VICnINTSELECT
(1)设置各个中断的模式为IRQ还是FIQ,一般都设置成IRQ
(2)IRQ和FIQ究竟有什么区别:210中支持2种中断,IRQ是普通中断,FIQ是快速中断。
(3)FIQ比IRQ快的地方是在:第一:FIQ有专用的r8-r12,因此在FIQ的ISR中可以直接使用r8-r12
而不用保存,这就能节省时间,
第二:异常向量表FIQ是在最后面,所以中断服务程序就可以直接写在FIQ中断服务入口处。
减少跳转的时间。
5.3、VICnIRQSTATUS和VICnFIQSTATUS
(1)中断状态寄存器,是只读的,当发生中断的时候,该位会置1,表示发生了中断。
当我们执行完中断服务函数的时候,就是靠这个处理中断的第二阶段的第一阶段,
就是靠查询这个寄存器来得到中断编号。
5.4、VICnVECTPRIORITY0~VICnVECTPRIORITY31
中断的优先级的寄存器,可以通过这个寄存器设置中断的优先级,实现中断嵌套。
5.5、VICnVECTADDR0~VICnVECTADDR31、VICnADDR
(1)这三个寄存器和210中断处理第二阶段的第二阶段有关。
(2)VICnVECTADDR0到31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,程序员在设置中断的时候,把这个中断的isr地址直接放入这个中断对应的VECTADDR寄存器即可。
(3)VICnADDR这个寄存器是只需要读的,它里面的内容是由硬件自动设置的。当发生了相应中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,然后将其读出复制到VICnADDR中,供我们使用。这样的设计避免了软件查找中断源和isr,节省了时间,提高了210的中断响应速度。
总结:
整个中断的流程分析:
第一部分:我们为中断响应而坐的预备工作:
1、初始化中断控制器
2、绑定写好的ISR到中断控制器
4000
3、相应中断的所有条件使能
第二部分:当硬件产生中断后如何自动执行ISR
1、经过异常向量表跳转到IRQ、FIQ的入口
2、做中断现场保护(start.s),然后跳入ISR_handler
3、在ISR_handler中确定是哪一个中断,然后直接去这个VIC的ADDR
寄存器中取ISR来执行即可。
4、ISR执行完,中断现场恢复,直接返回继续做常规任务。
--参考朱有鹏ARM裸机
1、异常处理的2个阶段
可以将异常处理分为2个阶段来理解,第一阶段是异常向量表跳转
第二阶段就是进入了真正的异常处理程序irq_handler之后的部分。
2、中断处理的第一阶段处理
(1)第一个阶段之所以能够进行,主要依赖于CPU设计的提供的异常向量表机制
第一阶段的主要任务是从异常发生到响应异常并且保存、恢复现场,
跳转到真正的异常处理程序处。
(2)第二阶段的目的是识别多个中断源中究竟哪一个发生了中断,
然后调用相应的中断处理程序来处理这个中断。
3、S3C2440的第二阶段的处理过程
(1)第一个问题:怎么找到具体是哪个中断:S3C2440的中断控制器中有一个寄存器
寄存器的每一位对应一个中断源(那么一个寄存器应该对应于32个中断源)
但是S3C2440中中断源不止32个,所以2440里面又弄了一个子中断寄存器。
(2)怎么找到对应的ISR函数的问题?
首先给每个中断做了一个编号,进入ISR_handler之后先通过查询中断控制器和
相应 的子中断寄存器确定是什么中断源。
然后用这个编号去ISR数组(ISR数组是中断初始化事先设定好的)
就是把各个中断的ISR的函数名组成一个数组,用中断对应的编号作为索引来查询这个数组
4、S5PV210的第二阶段处理过程
(1)第一个问题,怎么找到具体是哪一个中断:S5PV210中支持的中断源很多,所以
直接设计了4个中断寄存器,每个32位,每位对应于一个中断源。
(理论上210最多支持128个中断源)
210没有子中断源,每个中断都是并列的,当中断发生时,轮询的查找是哪个中断源寄存器
,看哪一位被置1,则这个位对应的寄存器就发生了中断,即找到了中断编号。
(2)第二个问题:怎么找到对应的ISR问题
210支持的中断很多,如果还是使用2440的中断函数数组的话,查找起来非常的花
时间。于是210开拓了一种全新的寻找ISR的机制。
210提供了很多寄存器来解决每个中断源对应ISR寻找问题,
实现的效果就是,当发生了相应的中断,硬件会自动的将相应的ISR推入一定的寄存器中,
我们软件只要去这个寄存器中执行函数就可以了。
5、S5PV210的中断处理的主要寄存器
5.1、VICnINTENABLE和VICnINTENCLEAR
(1)VICnINTENABLE 这是中断的使能的寄存器,在你想要的中断源置位即可,
VICnINTENCLEAR这个寄存器置1的话,就代表该中断不使能。
5.2、VICnINTSELECT
(1)设置各个中断的模式为IRQ还是FIQ,一般都设置成IRQ
(2)IRQ和FIQ究竟有什么区别:210中支持2种中断,IRQ是普通中断,FIQ是快速中断。
(3)FIQ比IRQ快的地方是在:第一:FIQ有专用的r8-r12,因此在FIQ的ISR中可以直接使用r8-r12
而不用保存,这就能节省时间,
第二:异常向量表FIQ是在最后面,所以中断服务程序就可以直接写在FIQ中断服务入口处。
减少跳转的时间。
5.3、VICnIRQSTATUS和VICnFIQSTATUS
(1)中断状态寄存器,是只读的,当发生中断的时候,该位会置1,表示发生了中断。
当我们执行完中断服务函数的时候,就是靠这个处理中断的第二阶段的第一阶段,
就是靠查询这个寄存器来得到中断编号。
5.4、VICnVECTPRIORITY0~VICnVECTPRIORITY31
中断的优先级的寄存器,可以通过这个寄存器设置中断的优先级,实现中断嵌套。
5.5、VICnVECTADDR0~VICnVECTADDR31、VICnADDR
(1)这三个寄存器和210中断处理第二阶段的第二阶段有关。
(2)VICnVECTADDR0到31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,程序员在设置中断的时候,把这个中断的isr地址直接放入这个中断对应的VECTADDR寄存器即可。
(3)VICnADDR这个寄存器是只需要读的,它里面的内容是由硬件自动设置的。当发生了相应中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,然后将其读出复制到VICnADDR中,供我们使用。这样的设计避免了软件查找中断源和isr,节省了时间,提高了210的中断响应速度。
总结:
整个中断的流程分析:
第一部分:我们为中断响应而坐的预备工作:
1、初始化中断控制器
2、绑定写好的ISR到中断控制器
4000
3、相应中断的所有条件使能
第二部分:当硬件产生中断后如何自动执行ISR
1、经过异常向量表跳转到IRQ、FIQ的入口
2、做中断现场保护(start.s),然后跳入ISR_handler
3、在ISR_handler中确定是哪一个中断,然后直接去这个VIC的ADDR
寄存器中取ISR来执行即可。
4、ISR执行完,中断现场恢复,直接返回继续做常规任务。
相关文章推荐
- S5PV210中断处理的主要寄存器
- 中断处理(中断向量寄存器)
- STM32 NVIC嵌套向量中断控制器函数分析
- 【Linux操作系统分析】中断和异常(1)——中断描述符表IDT,I/O中断处理,中断向量
- LPC2114中向量中断控制器(VIC)的操作方法
- ARM7内核寄存器、中断向量控制器
- S5PV210的向量中断控制器
- STM32 嵌套向量中断控制器NVIC学习
- 前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端。前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架)。
- STM32 EXTI(外部中断)和NVIC(嵌套向量中断控制器)学习
- 15. OP-TEE中的中断处理(一)------中断配置和向量表的配置
- s3c2410/s3c2440 中断异常处理--中断控制寄存器的角度
- ARM11---中断---向量中断控制器(VIC)---结合s3c6410
- LPC2478 向量中断控制器(VIC)
- ARM11---中断---向量中断控制器(VIC)---结合s3c6410
- ARM11---中断---向量中断控制器(VIC)---结合s3c6410
- 内建的嵌套向量中断控制器
- STM32 NVIC嵌套向量中断控制器函数分析
- 【Linux操作系统分析】中断和异常(1)——中断描述符表IDT,I/O中断处理,中断向量
- LPC2000系列的向量中断控制器(VIC)