008.S3C2440中断分析|千篇笔记实现嵌入式全栈/裸机篇
1. 流程S3C2440中断流程如下发生中断时[SUB]SRCPND源挂起寄存器对应的bit位会置位然后[SUB]MASK屏蔽寄存器对应的bit位会卡一下决定中断流要不要继续也就是说不管中断有没有被屏蔽源挂起寄存器对应的bit位都会先置位最后经过优先级相关寄存器进行优先级排序输入进ARM920T内核并通过INTPND挂起寄存器对应的bit位体现⚠️和[SUB]SRCPND源挂起寄存器不同INTPND挂起寄存器每个时刻只能有1bit位置位就说处理完当前的才能再次触发置位其他的中断bit位2. 关键寄存器寄存器说明SUBSRCPND/SRCPND[sub]源挂起寄存器哪个中断触发了对应的bit位就会置位可以有多个bit位同时置位SUBMASK/MASK[sub]屏蔽寄存器中断对应的bit位置位后此中断就会被屏蔽INTPND挂起寄存器最终的挂起展示哪个中断最终给到ARM920T内核对应的bit位就置位但是同一时刻只能有一个bit置位INTOFFSET偏移寄存器用于辅助判断INTPND对应的哪个中断源1 I N T O F F S E T I N T P N D 1 INTOFFSET INTPND1INTOFFSETINTPND优先级目前不重要暂不研究也不会用到~关于外部中断有额外的寄存器配置|EXTINTn外部中断控制寄存器用于控制对应的中断触发方式的比如边沿触发还是电平触发EINTMASK外部中断屏蔽寄存器顾名思义EINTPEND外部中断挂起寄存器对应的bit置位表示相关中断挂起触发3. CPU内核层面深入到CPU内核其实还有一道最后的关卡那就是CPSR寄存器的控制域字段的I标志位此标志位置位后将disable中断在CPU的触发参考006.寄存器工作模式杂谈|千篇笔记实现嵌入式全栈/裸机篇这一章节我们知道IRQ触发后CPU自动切换到IRQ工作模式使用独立的SP_irq栈空间切换工作模式时CPU自动将CPSR备份至SPSR_irq将PC值8自动赋给LRARM的流水线设计取指 译码 执行因此发生IRQ异常时刻其实PC值已经快进了两步44 84. 程序怎么写4.1 CPU层面对于CPU层面我们需要通过CPSR_c和I标志位控制全局中断开关手动切换到IRQ模式去设置此模式下的栈指针SP_irqIRQ触发时要做一定的包装处理比如计算实际的返回地址压栈保护相关的寄存器处理中断处理完中断后还要恢复现场和地址跳转4.2 SOC层面对于S3C2440 我们需要通过相关的MASK寄存器设置需要的屏蔽中断源在处理中断时通过挂起寄存器或者偏移寄存器确定中断源如果有次级中断通过相关模块的挂起寄存器判断具体的次级中断源比如对于外部中断要在EINTPEND中进一步确定具体的外部中断源如果有次级中断还要通过相关模块的配置寄存器进行额外的配置比如对于外部中断还有配置相关的触发方式、屏蔽等中断处理时需要手动清除相关的挂起寄存器挂起寄存器特性是写1清除下一章节是具体的代码实践~