本帖最后由 缥缈九哥 于 2012-9-14 12:10 编辑
非常感谢关于GPIO小练一贴神的指点,同时响应HOT大叔的号召,记下神点拨之感受,铭记不要知其然要知其所以然,懂其机理,但本人水平有限,理解有些肤浅,请见谅!
从GPIO小练中关于外部中断0设置说开来,1.图1中中断响应函数名为什么为EINT0Callback?
原因为:DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback);设置其中断处理函数为EINT0Callback。
2.此函数是如何实现中断响应的呢?
原因:图2中DrvGPIO_EnableEINT0函数的第三个入口参数类型为GPIO_EINT0_CALLBACK(其定义为typedef void (*GPIO_EINT0_CALLBACK)(void);),也就是在函数体内函数EINT0Callback的开始地址指向了_pfEINT0Callback(static void (*_pfEINT0Callback)(void);----DrvGPIO.c中)的地址。
3._pfEINT0Callback这个函数又是如何与中断响应关联的呢?
原因:
Cortex M0异常的处理:摘自中文手册
NVIC区分和处理所有支持的异常,所有异常在“处理器模式“处理. NVIC结构支持32(IRQ[31:0])4级离散中断优先级. 所有的中断和大多数系统异常可以配置为不同优先级. 当中断发生时,NVIC将比较新中断与当前中断的优先级,如果新中断优先级高,则立即处理新中断.
当接受任何中断时,ISR的开始地址可从内存的向量表中取得. 不需要确定哪个中断被响应,也不要软件分配相关中断服务程序(ISR)的开始地址。
其中断异常向量表在startup_NUC1xx.s中定义如下图:
而EINT0_IRQHandler这个函数(具体函数键下图)又实现了如下功能:
①清中断
②如果_pfEINT1Callback定义则实现该函数的功能
基于MDK的LPC1100处理器开发应用中关于异常中断向量表有如下描述:
CMSIS对系统异常处理函数以及普通的中断处理函数名得定义也有所不同。系统异常处理函数名需加后缀_Handler,而普通中断处理函数名则加后缀_IRQHandler,这些异常处理函数被定义为weak属性的,以便在其他的文件中重新实现时不出现重复定义的错误。(关于基于MDK的LPC1100处理器开发应用的描述不甚理解,望赐教!) |