linux学习总结__裸机驱动(8)_番外篇_中断执行的本质总结(S5PV210)

大家应该都玩过中断,也清楚中断的特性。但是今天要讲的是为什么中断会执行到IRQHANDLE函数中。很多时候我们并没有好好考虑到这个问题,因为这些大部分都含在了库函数中,我们只要应用就可以了。这里我通过朱老师ARM裸机了解后,做了总结。
一、一个背景是大家要知道的,就是异常向量表,这是什么呢,这其实是soc内部已经编制好的一张表(S5PV210为例)。看下图:这个表中能看到IRQ所在的地址,当然vector table的基地址我们也能从右边的图上看出来是0xD003 7480(满减栈)。所以IRQ其实是异常向量表中的一部分而已。
在这里插入图片描述
在这里插入图片描述

二、背景知道后,我们来看下IRQ
IRQ其实是异常向量表中的一种模式而已,硬件在触发中断的时候,cpu的工作模式就切换到了IRQ模式,那么在期间需要执行的是什么呢(异常向量表编程)?
答:S5PV210的异常向量表可以改变(在CP15协处理器中),当我们将异常处理程序的首地址和异常向量表绑定起来标记文本后,异常处理初步阶段就完成了。到目前可以保证相应异常发生后,硬件自动跳转到对应异常向量表入口去执行时,可以执行到我们事先绑定的函数。
#define IRQ_STACK 0xd0037f80

IRQ_handle:
	// 设置IRQ模式下的栈
	ldr sp, =IRQ_STACK
	// 保存LR
	// 因为ARM有流水线,所以PC的值会比真正执行的代码+8,
	sub lr, lr, #4
	// 保存r0-r12和lr到irq模式下的栈上面
	stmfd sp!, {r0-r12, lr} //满减栈 保存lr,r0-r12到栈中 ,lr中保存的是中断返回地址
	// 在此调用真正的isr来处理中断
	bl irq_handler
	// 处理完成开始恢复现场,其实就是做中断返回,关键是将r0-r12,pc,cpsr一起回复
	ldmfd sp!, {r0-r12, pc}^ //恢复之前保存的状态

代码的详细解释:
(1)中断处理要注意保护现场(中断从SVC模式来,则保存SVC模式下的必要寄存器的值)和恢复现场(中断处理完成后,准备返回SVC模式前,要将保存的SVC模式下的必要寄存器的值恢复回去,不然到了SVC模式后寄存器的值乱了,SVC模式下原来正在进行的常规任务就被你搞坏了)
(2)保存现场包括:第一:设置IRQ栈;第二,保存LR;第三,保存R0~R12
(3)为什么要保存LR寄存器?要考虑中断返回的问题。中断ISR执行完后如何返回SVC模式下去接着执行原来的代码。中断返回其实取决于我们进入中断时如何保存现场。中断返回时关键的2个寄存器就是PC和CPSR。所以我们在进入IRQ模式时,应该将SVC模式下的下一句指令的地址(中断返回地址)和CPSR保存起来,将来恢复时才可以将中断返回地址给PC,将保存的CPSR给CPSR。
(4)中断返回地址就保存在LR中,而CPSR(自动)保存在(IRQ模式下的)SPSR
在下面汇编函数中,用来做中断模式下的现场保护和恢复,并且调用真正的中断处理程序
以上的(4)个步骤是朱老师的笔记中COPY的。
这段代码最重要的其实是把正真的IRQ处理函数链接起来了

三、链接好了真正的函数后,那么问题来了,中断有很多个,其他中断是怎么一一对应的呢?
1)第一个问题,怎么找到具体是哪个中断:
答:S5PV210中因为支持的中断源很多,所以直接设计了4个中断寄存器,每个32位,每位对应一个中断源。(理论上210最多支持128个中断,实际支持不足128个,有些位是空的);210没有子中断寄存器,每个中断源都是并列的。当中断发生时,在irq_handler中依次去查询4个中断源寄存器,看哪一个的哪一位被置1,则这个位对应的寄存器就发生了中断,即找到了中断编号。
(2)第二个问题,怎么找到对应的isr的问题:
答:210中支持的中断源多了很多,如果还使用2440的那一套来寻找isr地址就太慢了,太影响实时性了。于是210开拓了一种全新的寻找isr的机制。210提供了很多寄存器来解决每个中断源对应isr的寻找问题,具体寻找过程和建立过程见下面,实现的效果是当发生相应中断时,硬件会自动的将相应isr推入一定的寄存器中,我们软件只要去这个寄存器中执行函数就行了。

怎么寻找到个ISR呢?
(1)VICnVECTADDR(n是0~3一共4个32位寄存器) 0到31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,程序员在设置中断的时候,把这个中断的isr地址直接放入这个中断对应的VECTADDR寄存器即可。
(2)VICnADDR这个寄存器是只需要读的,它里面的内容是由硬件自动设置的。当发生了相应中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,然后将其读出复制到VICnADDR中,供我们使用。这样的设计避免了软件查找中断源和isr,节省了时间,提高了210的中断响应速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 米联客02是一本关于Xilinx Zynq裸机开发的书籍,2019年版。该书详细介绍了Zynq系列SoC的基本知识和裸机开发的流程,对于想要深入了解和掌握Zynq开发的人来说是一本不错的参考资料。 该书首先介绍了Zynq系列SoC的基本架构和特点,包括ARM Cortex-A9处理器和可编程逻辑的结合,以及内部的设模块和扩展接口。读者可以对Zynq SoC的组成和工作原理有一个全面的了解。 接着,书中详细介绍了如何搭建和配置开发环境,包括软件工具的安装和配置,硬件开发板的准备以及基本的调试方法。读者可以根据书中的指导逐步完成一个完整的裸机开发环境的搭建。 在开发环境搭建完成后,书中介绍了裸机开发的基本流程和方法。从初始化硬件到编写驱动程序,再到应用程序的开发,读者可以学习到如何从零开始进行Zynq裸机开发。 此,书中还介绍了一些常用的驱动开发技巧和调试方法,如中断处理、DMA数据传输等。这些内容对于进行高性能嵌入式系统开发的人来说非常有用。 总的来说,米联客02_xilinx zynq裸机篇2019版是一本全面介绍Zynq裸机开发的书籍。通过学习该书,读者可以系统地掌握Zynq SoC的基本知识和裸机开发的流程,从而能够独立进行Zynq应用的开发和调试工作。 ### 回答2: 米联客02_Xilinx Zynq裸机篇2019版是一本关于Xilinx Zynq系列芯片的裸机开发指南。在这本书中,作者详细介绍了Zynq芯片的架构和特性,以及如何在没有操作系统支持的情况下进行裸机开发。 首先,书中介绍了Zynq芯片的核心架构,包括ARM Cortex-A9双核处理器和FPGA逻辑。作者解释了如何使用Zynq的双核处理器进行程序的运行和管理,并且详细介绍了如何配置和操作FPGA逻辑,以满足不同的应用需求。 然后,书中提供了丰富的实例和案例,来帮助读者理解和掌握Zynq芯片的裸机开发技术。这些实例包括如何配置中断、串口通信、驱动、内存管理等。通过这些实例,读者可以了解裸机开发的基本原理和技巧,以及如何在没有操作系统的情况下,实现各种功能和应用。 此,书中还介绍了一些常用的开发工具和调试技巧,如SDK工具链、JTAG调试等。这些工具和技巧可以帮助开发者更加高效地进行调试和优化,提高开发效率和质量。 总之,米联客02_Xilinx Zynq裸机篇2019版是一本非常实用和详细的裸机开发指南,适用于对Zynq芯片有兴趣的开发者和工程师。无论是初学者还是有经验的开发者,都可以通过这本书学习到丰富的知识和技巧,在Zynq芯片上进行高效的裸机开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mhj258258

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值