6.8.1中断控制器初始化
主要工作有:第一阶段绑定异常处理程序到异常向量表;禁止所有中断源;选择所有中断类型为IRQ;清理VICnADDR寄存器为0。
为什么要禁止所有中断源:
因为中断一旦打开,因为外部或硬件自己的原因产生中断后一定就会寻找isr,而我们可能认为自己用不到这个中断就没有提供isr,这时它自动拿到的就是乱码,程序可能跑飞,所以不用的中断一定要禁掉。一般的做法是先全部禁止,然后逐一打开自己感兴趣的中断,一旦打开就必须给这个中断提供相应的isr并绑定好。
6.8.2中断的使能与禁止
思路是先根据中断号intnum判断这个中断属于VIC几,然后在用中断号减去这个VIC的偏移量,得到这个中断号在本VIC的偏移量,然后1<<x位,写入相应的VIC的INTENABLE/INTENCLEAR寄存器即可。
6.8.3绑定自己实现的isr到VICnVECTADDRx
(1)先要搞清楚2个寄存器的区别:VICnVECTADDRx和VICnADDR。
VICnADDR是将真正产生中断的VICnVECTADDRx中isr的地址复制到VICnADDR中。
(2)VICVECTADDR寄存器一共有4*32个,每个中断源都有一个VECTADDR寄存器,我们应该将自己为这个中断源写的isr地址丢到这个中断源对应的VECTADDR寄存器中即可。
6.8.4真正的中断处理程序如何获取isr
当发生中断时,硬件会自动把相应中断源的isr的地址从VICnVECTADDR寄存器中推入到VICnADDR寄存器中,所以我们第二阶段的第二步irq_handler中,只需要到对应的VICnADDR寄存器中去拿出isr地址,调用执行即可。
总结:第3步绑定isr到VICnVECTADDR和第4步中断发生时第二阶段的第二部分如何获取isr地址,这两步是相关的。这两个的结合技术,就是我们一直在说的210的硬件自动寻找isr的机制。
整个中断的流程梳理:
整个中断的工作分为2部分:
第一部分是我们为中断响应而做的预备工作:
1.初始化中断控制器
2.绑定写好的isr到中断控制器
3.相应中断的所有条件使能
第二部分是当硬件产生中断后如何自动执行isr:
1.第一步,经过异常向量表跳转入IRQ/FIQ的入口
2.第二步,做中断现场保护(在start.S中),然后跳入irq_handler
3.第三步,在irq_handler中先搞清楚是哪个VIC中断了,然后直接去这个VIC的ADDR寄存器中取isr来执行即可。
4.第四步,isr执行完,中断现场恢复。直接返回继续做常规任务。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。在评论区私信“嵌入式”0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!