[ZLG-ARM] ***_Handler HANDLER ***_Exception中的HANDLER宏是什么意思?

[复制链接]
3412|5
 楼主| zjb800zjb 发表于 2007-3-2 17:23 | 显示全部楼层 |阅读模式
在网上查到别人说HANDLER是个宏,但没查到更多的有用的信息,说实话我对这个HANDLER是一点都不懂。。。师兄师姐们指点一下吧。谢谢。<br />据《ARM嵌入式系统基础教程》中所说这句话是中断的汇编接口代码。比如在UART0试验中,我们就需要在IRQ.S中添加<br />UART0_Handler&nbsp;HANDLER&nbsp;UART0_Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;唯一的疑问:HANDLER是做啥用的?是不是跟伪指令DCD有点像?<br />
zhoujiawen 发表于 2007-3-2 18:30 | 显示全部楼层

在中断嵌套时用

UART0_ISR_Handler&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;UART0_ISR<br />UART1_ISR_Handler&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;UART1_ISR<br />RTC_ISR_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;RTC_ISR<br />TIMER1_ISR_Handler&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;TIMER1_ISR<br /><br />VICVectCntl0&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;6);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//最高优先级slot0<br />VICVectAddr0&nbsp;=&nbsp;(LPC_WORD32)UART0_ISR_Handler;//Interrupt&nbsp;source&nbsp;6<br />.<br />.<br />.<br /><br />
 楼主| zjb800zjb 发表于 2007-3-2 20:11 | 显示全部楼层

LS回答我还是没太明白

&nbsp;&nbsp;&nbsp;&nbsp;拿LS大哥的例子来讲<br />UART0_ISR_Handler&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;UART0_ISR<br />UART1_ISR_Handler&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;UART1_ISR<br />RTC_ISR_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;RTC_ISR<br />TIMER1_ISR_Handler&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;TIMER1_ISR<br /><br />VICVectCntl0&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;6);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//最高优先级slot0<br />VICVectAddr0&nbsp;=&nbsp;(LPC_WORD32)UART0_ISR_Handler;//Interrupt&nbsp;source&nbsp;6<br /><br />为什么要用VICVectAddr0&nbsp;=&nbsp;&nbsp;(LPC_WORD32)UART0_ISR_Handler?干嘛不可以在文件头部做个声明exten&nbsp;void&nbsp;UART0_ISR(void&nbsp;*cp),然后直接用VICVectAddr0&nbsp;=(LPC_WORD32)UART0_ISR?(UART0_ISR应该是个位于串口中间件中的中断处理程序)<br />
zlgARM 发表于 2007-3-3 10:45 | 显示全部楼层

RE

这个问题想要透彻搞清楚的话,需要您自己查阅一下资料。<br /><br />一、为什么要用HANDLER宏?<br />简单来说,用HANDLER宏,是为了让您自己的ISR函数***_Exception,被另一个函数***_Handler取代。<br />当中断发生的时候,系统执行的相应ISR不是***_Exception而是***_Handler了。<br /><br /><br /><br />二、那么这个***_Handler和***_Exception有什么不同呢?<br />实际上,可以用示意性的代码来表示***_Exception和***_Handler这两个函数,让您能直观地了解大致的不同。<br /><br /><br />void&nbsp;***_Exception&nbsp;(void)<br />{<br />&nbsp;&nbsp;ISR服务代码<br />}<br /><br />void&nbsp;***_Handler(void)<br />{<br />&nbsp;&nbsp;&nbsp;特别代码若干;<br />&nbsp;&nbsp;&nbsp;***_Exception&nbsp;();<br />&nbsp;&nbsp;&nbsp;特别代码若干;<br />}<br /><br />所以,实现了函数的置换,就是HANDLER宏的作用。<br /><br />三、不同点<br />我们可以发现在函数功能上,***_Handler()在功能上是包含了***_Exception&nbsp;()的,但多出了一部分代码。这部分代码,是为了让OS管理好这个中断。<br />该代码具体完成的事情。建议您自己参考我们所提供的模板里的IRQ.inc文件。<br />该文件不仅能回答您***_Handler()多做的事情,还能告诉您,程序是怎么天衣无缝地把***_Exception&nbsp;()置换成,***_Handler()的。<br /><br /><br /><br /><br /><br /><br />
 楼主| zjb800zjb 发表于 2007-3-4 15:19 | 显示全部楼层

谢谢大家的回答,我总算是明白啦

<br />另外在此佩服一下陈明计。。。那么多代码,他还写了不少注释,实在是辛苦啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部