S3C2440中断控制器痛点详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中断详解
1、S3C2440官方手册最权威:
手册是最芯片IP开发者最直接的描述,最准确;但对英文阅读能力要求高、因详细而繁杂;适合参考和深入研究;
另外参考网上相关短文较容易入门,并短文是有套路的:基本是围绕几个较优秀的文章(优秀短文要多研读几遍理解透作者的每个心思)。
2、支持60个中断源:
S3C2440中断控制器总共支持60个中断源(内部外设和外部管脚):详细数下表中Descriptions中的中断源个数正好60;
子中断源分解如下:
注:INT_LCD也有两个中断但没有包含在子中断源寄存器中
3、一种中断源分类方法:
1、独立的外部中断源(EINT0-EINT3):4个;
2、合并的外部中断源(EINT4-EINT23):20个,合并后对应EINT4_7和EINT8_23;
注意:对应的相关寄存器在IO模块中,手册中的做法有点特殊;
3、带子中断的内部中断源:15个中断源,体现为6个bit(INT_WDT_AC97/ INT_CAM/ INT_ADC/ INT_UART2/ INT_UART1/ INT_UART0);
4、不带子中断的内部中断源:21个;
注意:INT_LCD实际对应两个中断源但是没有作为带子中断的内部中断源(如下图手册中有提到,TMD隐蔽!);
综上理解中断过程可以总结为:
4、中断优先级解析:
优秀的SOC对外设中断的处理都比较用心,基本能照顾到用户的各种场景,和LPC2292以及作者工作期间参与开发的一款SOC相比,作者经历到的三款SOC对中断的处理各有千秋(原谅不细说,因为没有必要);
可以总结为易用和特性的平衡,如果极特殊的场景下的实时性得不到满足,那就换个SOC 呗!没有必要使用一款SOC打遍天下,也不可能,而且厂家也没有强迫你呀!
言归正传:
S3C2440A支持60种中断,多个硬件可能同时产生中断请求,由于CPU只能处理一个中断,中断控制器怎么选择出一个最佳的中断,交给ARM内核进行处理呢?中断控制器采用优先级仲裁比较的方式进行选择,找出优先级最高的中断源。中断控制器将60种中断源分成7组,如下图所示,它类似体育赛事里的比赛方式,所有参赛选手在小组赛PK,选择出小组赛最优秀选手,然后进入决赛阶段和其它小组最优先选择再PK,最后优胜者就是总冠军。其中ARBITER0~ARBITER5为“小组赛”阶段,中断源信号在各自小组里进行优先级仲裁,选择出最高优先级中断信号,每小组选出的中断信号送到ARBITER6,也就是决赛阶段,选择出最高优先级中断信号,交给ARM内核。
中断信号在7个分组里PK时的优先级是可编程的,通过PRIORITY寄存器进行优先级设置。如下表(只列出PRIORITY寄存器部分位):
表3-6 中断优先级控制寄存器(PRIORITY)
如果不是极特殊场景要求,我们就让这套机制留着三星自己的开发人员慢慢研究吧!
我们使用默认模式即可!
5、中断服务函数的入口:
重点说下920T内核外中断控制器对各种中断的入口函数处理,如果读者对X86保护模式程序员模型熟悉的话,2440的机制和其有异曲同工之妙!
支持定义的总入口,根据不同中断的编号偏移取得对应的中断服务函数入口。
分享下作者中断函数管理机制:
irq_handler irq_table[IRQ_HANDLE_SIZE];
即使用一个全局变量保存32个向量,根据INTOFFSET寄存器的中断号计算偏移取得入口地址;
这种机制比官网提供的各个中断有固定地址的机制有较大的灵活性,另外要注意Cache一致性的问题(如果遇到bug就是一个隐蔽性很强的bug):注册了中断服务函数就要flushcache。
6、中断模式:
FIQ模式业内认为是鸡肋,就像thumb模式这个大鸡肋一样!
总之一句话:不管、不问、任他去!不要用arm的错误惩罚自己!