[ZLG-ARM] ucos的IRQ问题

[复制链接]
3008|7
 楼主| wubren 发表于 2007-8-31 17:16 | 显示全部楼层 |阅读模式
ucos, TI, ic, IO, vi
<font color=#000000><font color=#000000><b>我使用了外部中断1,程序如下</b></font><br /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exint1_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exint1_Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTMODE=0X02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr2=(uint32)Exint1_Handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl2=(0x02|0x0f);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable=0x00008000;<br /><br />void&nbsp;Exint1_Exception()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IO0CLR=0x00000080;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXTINT=0x02;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=0x00000080;<br />}<br /><br /><b>为什么每次外部有中断时都是跳到<br /></b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;IRQ_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;这一句替换为自己的代码<br />}<br /><br /><br /><br /><b>我用的是周功2200的板子,<br />哪位好心的大哥帮一下忙呀,<br />先谢谢了<br /></b><br />
lpf336 发表于 2007-8-31 19:50 | 显示全部楼层

  
 楼主| wubren 发表于 2007-8-31 20:34 | 显示全部楼层

ucos的IRQ问题

<br />楼上lpf336,这是什么意思呀?<br />$IRQ_Label&nbsp;HANDLER&nbsp;$IRQ_Exception_Function
Ice_River 发表于 2007-9-1 15:22 | 显示全部楼层

就是说你的跳转标号定义不对!

  
zlgARM 发表于 2007-9-1 15:42 | 显示全部楼层

wubren

您好!<br /><br />&nbsp;&nbsp;在uc/os-II使用ISR和前后台系统里使用ISR有所不同,uc/os-II使用ISR的步骤如下所示:<br />&nbsp;&nbsp;1、&nbsp;在IRQ.S添加中断句柄;<br />&nbsp;&nbsp;例:<br />&nbsp;&nbsp;&nbsp;&nbsp;Exint1_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exint1_Exception<br />&nbsp;&nbsp;2、&nbsp;在target.C文件配置向量中断控制器和初始化中断源:<br />&nbsp;&nbsp;例:<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr2&nbsp;=&nbsp;(uint32)Exint1_Handler;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl2&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;0x0f);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x00008000;<br />&nbsp;&nbsp;3、&nbsp;编写中断服务程序,如:void&nbsp;Exint1_Exception(void)……<br /><br />&nbsp;&nbsp;现在回到您所提的问题。您对向量控制寄存器(VICVectCntl)的初始化有错:<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl2=(0x02|0x0f);<br />而正确的设置是:&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl2=(0x20|0x0f);<br />&nbsp;&nbsp;您的初始化程序使得向量IRQ没有使能,系统把外部中断1中断请求默认为非向量IRQ,而非向量IRQ的ISR正是IRQ_Exception。所以运行程序时,每次有外部中断时就进入IRQ_Exception函数了。
 楼主| wubren 发表于 2007-9-1 22:05 | 显示全部楼层

回复主题:ucos的IRQ问题

谢谢周功悉心指点,确实是VICVectCntl2=(0x20|0x0f);这里错了,<br />改正后可以运行了,<br />但是有时产生是断后会指令预取失败.一般什么情况下会有这样的问题出现?
 楼主| wubren 发表于 2007-9-2 12:42 | 显示全部楼层

回复主题:ucos的IRQ问题

我的中断程序如下:<br /><br />void&nbsp;Eint2_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR=outenable;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnClr=(1&nbsp;&lt&lt4)|(1&lt&lt16);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;EXTINT=0X04;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*Msg=WAN_ADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSQPost(WANMsgQ,(void*)Msg);<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;(1&nbsp;&lt&lt4)|(1&lt&lt16);<br />}<br /><br />每次中断返回时都会指令预取失败,不知道是什么原因.<br />帮我看一下可以吗?
lammy 发表于 2007-9-3 10:16 | 显示全部楼层

可能是*Msg它是一个空指针

可能是因为*Msg它是一个空指针。建议你用编译器跟踪它在什么地方发生了预取指中断。然后分析之。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

1

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