昨晚结合《Cortex-M3权威指南》和《Cortex-M3技术参考手册》,看了一下有关中断的问题,现小结一下:
LM3S8962一共有3+7+36个中断。
3是三个固定优先级的系统异常,Reset,NMI,Hard fault,其优先级分别为-3,-2,-1.不可设置。几乎任何时候都可以抢占比它优先级低的中断
7是七个可设置优先级的系统异常,分别是
Memory manage fault
Bus fault
usage fault
SVCall
调试监视器
PendSV
SysTick
36是36个外部中断,其中断优先级也是可设置的,具体参见datasheet。
虽然Cortex-M3一共可实现256个中断(包括16个系统异常),但8962只实现了这么多。
所有可设置中断的复位后默认优先级都是0!
关于中断优先级分组、抢占优先级和子优先级:
Cortex-M3为了更好的管理中断,实现了优先级分组的功能,很强大。8962只用了3个位来表示中断优先级,因此其最多支持8级嵌套,其优先级分组的有效值范围是
【4,7】,注意我说的是有效值,你可以取其它值但不一定有效。
当优先级分组取下限值为4时,所有的优先级都是抢占优先级,优先级高的可以无条件抢占优先级低的。
当优先级分组取上限值为7时,所有的优先级都是子优先级,相当于除能了抢占功能,谁也不能抢占谁,优先级只取到在同时挂起的中断中决定谁先得到处理器响应的作用。
复位时,优先级分组取值为0,相当于取下限值为4时的情况。
在enet_io这个例程中,没有设置任何优先级,SysTick和Ethernet两个中断的优先级都是0,所以SysTick每隔10ms调用一次,但它不能抢占Ethernet的中断,所以可以推测Ethernet这个中断一般最长执行时间不能超过10ms,因为SysTick要为lwIP提供时间更新服务,它必须得到响应,有兴趣的可以测一下,不知道SysTick没有得到及时的响应会造成什么样的结果呢?
在enet_lwIP这个例程中,设置了优先级分组为4,且SysTick的优先级要比Ethernet的优先级要高,
#define SYSTICK_INT_PRIORITY 0x80
#define ETHERNET_INT_PRIORITY 0xC0
[
本帖最后由 academic 于 2011-7-31 16:53 编辑 ]