驱动程序在控制中断系统时要注意的事项如上
1:boot之后马上禁止中断产生,因为除了中断系统还没设定好外,可能产生中断的硬设备也还没初始化完毕。
2:内建中断处理器的CPU会规定哪些PIN引脚是可以产生中断的,而会产生什么中断通常也是定义好的。
3:同理,软件工程师必须知道什么装置接到CPU的哪一个PIN引脚,是否会引发中断,如果会的话,又是第几号中断,一定要弄清楚相关的硬件设计,否则怎么会有办法写该装置的驱动程序?
4:设定中断向量表的起始地址,中断向量表可以写成一人C语言的数组,数组内的元素就是各个ISR的地址。
5:我们的产品不见得会用到所有CPU支持的中断源,也就是说不是每一个中断向量表的entry 都有对应的ISR,但中断向量表的每一个entry都必须有值,此时就必须为这些没有用到的中断来源写一个空的ISR,当这个空的ISR被执行时,就表示不该产生的中断产生了,这可能是硬件设计错误或静电产生的误动作,必须通知硬件同仁处理。
6:驱动程序可以通过设定缓存器为每一个中断来源设定优先等级,PSR缓存器中除了可以设定中断是否可以产生之外,也可以设定哪一个优先级以下的中断不会被CPU处理。
7;除非产品有硬实时的应用,一般状况我们不允许巢状中断,即ISR执行时期禁止中断产生,这是因为巢状中断会出现很复杂的状况。此时可以通过设定CPU允许产生中断的优先等级,
8.此处还有一个比较特殊的中断叫做NMI(nonmaskable interrupt),顾名思义就是无论如何都不会禁止的中断,硬件设计时可以把hard real time的中断来源接到NMI上,
9.虽说ISR也是一个函数,但有很多注意事项要遵守,尤其是critical section的保护。
此外ISR不像一般程序是循序执行的,它会在任何程序在执行时被调用,可能发生的状况很好,。所以我们会要求对ISR进行更严格地测试。 |