[ZLG-ARM] 中断问题求助

[复制链接]
1922|6
 楼主| fdy2007 发表于 2007-4-16 18:52 | 显示全部楼层 |阅读模式
我在smartarm上写了一个简单的实验,主要实现以下功能:ucos只建立一个任务,向PC发送字母w,当pc机连续向arm发送8个字节后,arm中断向pc机发送h<br />在实验过程中,w字母是收到了,但是不管我连续向arm发送多少数字字母,都没有受到中断,我已经在strtup.s中开了中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置系统模式堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPSR_c,&nbsp;#0x5f<br />程序如下:<br />#include&nbsp;&quot;config.h&quot;<br />#include&nbsp;&quot;stdlib.h&quot;<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;TaskStkLengh&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义用户任务0的堆栈长度&nbsp;<br />OS_STK&nbsp;&nbsp;&nbsp;&nbsp;TaskStk&nbsp;[TaskStkLengh];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义用户任务0的堆栈<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task0(void&nbsp;*pdata);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Task0&nbsp;任务0<br />void&nbsp;VICIn();<br />/*********************************************************************************************************<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主程序<br />********************************************************************************************************/<br />int&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIn();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSInit&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreate&nbsp;(Task0,(void&nbsp;*)0,&nbsp;&TaskStk[TaskStkLengh&nbsp;-&nbsp;1],&nbsp;2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSStart&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />/*********************************************************************************************************<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Task0&nbsp;任务0<br />********************************************************************************************************/<br /><br />void&nbsp;Task0&nbsp;&nbsp;&nbsp;&nbsp;(void&nbsp;*pdata)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;TargetInit&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIn();<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR='w';<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&0x40)==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSTimeDly(10);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />&nbsp;&nbsp;/*********************************************************************************************************<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VIC初始化<br />********************************************************************************************************/&nbsp;&nbsp;<br />void&nbsp;VICIn(void)<br />{<br />&nbsp;&nbsp;extern&nbsp;void&nbsp;IRQ_UART0(void);<br />&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;//均为向量中断<br />&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;0x26;//UART0分配为向量0号中断<br />&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_UART0;//UART0中断服务子程序入口<br />&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;1&lt&lt7;//允许UART0中断<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;U0FCR&nbsp;=&nbsp;0x81;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能FIFO,并设置触发点为8字节<br />&nbsp;&nbsp;&nbsp;U0IER&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;允许RBR中断,即接收中断<br />}<br />/*********************************************************************************************************<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中断服务子程序<br />********************************************************************************************************/&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;__irq&nbsp;IRQ_UART0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(0x04==(U0IIR&nbsp;&&nbsp;0x0F))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR='h';<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;//中断处理结束<br />}<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />/*********************************************************************************************************<br />**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;End&nbsp;Of&nbsp;File<br />********************************************************************************************************/<br />
zlgARM 发表于 2007-4-16 19:36 | 显示全部楼层

fdy2007

要考虑一下为什么会出现这样的情况。<br />在ISR中设置一个断点,观察是否能进入ISR。这样就能判断,中断是否有初始化好。<br />没进ISR你就要仔细调试那些你认为能触发ISR的程序部分乐。<br />下
 楼主| fdy2007 发表于 2007-4-16 19:42 | 显示全部楼层

你好

我刚才把target.c中的<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;&nbsp;IRQ_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);&nbsp;&nbsp;//&nbsp;&nbsp;change&nbsp;it&nbsp;to&nbsp;your&nbsp;code&nbsp;这一句替换为自己的代码<br />&nbsp;&nbsp;&nbsp;<br />}<br />while(1)屏蔽了,之后中断就能发生,但是进入中断后,一直发送h不停止,不知道什么原因
 楼主| fdy2007 发表于 2007-4-16 19:46 | 显示全部楼层

你好

刚才我又把uart0中断改成了外部中断,并且增加了一个任务,向pc发s,并且同样屏蔽了&nbsp;void&nbsp;&nbsp;IRQ_Exception(void)中的while(1),这时的情况是:两个任务之发生一次,即pc机收到ws,之后pc机就收不到字符,直到外部中断发生收到h。中断正常,但是每个任务只运行一次,我真的不知道这是什么错误了
 楼主| fdy2007 发表于 2007-4-16 19:51 | 显示全部楼层

你好!

我现在不太明白target.c中的void&nbsp;&nbsp;IRQ_Exception(void)和&nbsp;void&nbsp;FIQ_Exception(void)到底起什么作用,是说IRQ中断和FIQ中断处理程序可以在这两个函数里实现吗?那在main函数中&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_UART0;以及void&nbsp;IRQ_UART0()还有什么意义,我看教程上的例子都是直接重新声明中断处理程序的,越看越糊涂了!给我解释解释把
 楼主| fdy2007 发表于 2007-4-16 19:56 | 显示全部楼层

你好!

我调试时,发现就是在&nbsp;void&nbsp;FIQ_Exception(void)的while(1)中陷入死循环的。
zlgARM 发表于 2007-4-16 21:49 | 显示全部楼层

fdy2007

uc/OS里的ISR声明有些特殊。<br />找个uc/OS的中断例程,看看怎么初始化的吧。必须把初始化中断的过程搞清楚。<br />先看一下基础教程里是怎么说ISR初始化的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

19

帖子

0

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