程序跑飞了!?

[复制链接]
4526|8
 楼主| jianwenwu 发表于 2008-3-15 16:24 | 显示全部楼层 |阅读模式
刚整了个简单的定时器中断程序,却发现程序下载后运行的结果怪怪的。<br />主程序很简单,如下:<br />void&nbsp;Main(void)<br />{<br />MMU_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;ChangeClockDivider(1,1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ChangeMPllValue(0xa1,0x3,0x1);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Isr_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer1_init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer1INT_Init();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ledflash();//流水灯程序,死循环。<br />}<br />定时器1中断子程序如下:<br />void&nbsp;__irq&nbsp;Timer1_ISR(&nbsp;void&nbsp;)<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;ledflash();<br />}<br />定时器中断初始化程序:<br />void&nbsp;Timer1INT_Init(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((rINTPND&nbsp;&&nbsp;BIT_TIMER1))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rSRCPND&nbsp;|=&nbsp;BIT_TIMER1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;pISR_TIMER1&nbsp;=&nbsp;(int)&nbsp;Timer1_ISR<br />&nbsp;&nbsp;&nbsp;&nbsp;rINTMSK&nbsp;&nbsp;&=&nbsp;~(BIT_TIMER1);&nbsp;&nbsp;//开中断;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />也就是说不管有没有进入定时器1中断,程序都应该是执行流水灯程序。<br />结果却是流水灯程序运行了一段时间就停止了。<br />这是什么问题呢?难道是程序进入了别的中断?但是我试过改定时器1的装载时间,它对流水灯停止的时间是对应的,但却不是进入定时器1中断。这种现象怎么解释呢?<br />
Ice_River 发表于 2008-3-15 17:08 | 显示全部楼层

好像冲入的次数不少!

ledflash()&nbsp;正在运行,然后中断调用ledflash(),又正在运行此时中断又调用ledflash(),你看看调用多少次?
 楼主| jianwenwu 发表于 2008-3-15 18:54 | 显示全部楼层

是有问题

这样调用会产生什么问题?我也用过让一个灯亮来指示有没有进程序的办法,但是结果还是没有。
armfan 发表于 2008-3-15 20:03 | 显示全部楼层

re

你的中断程序里面是不是应该加上<br />rSRCPND&nbsp;=&nbsp;0x00000400&nbsp;&nbsp;;&nbsp;<br />rINTPND&nbsp;=&nbsp;0x00000400&nbsp;;<br /><br />类似这样的语句
 楼主| jianwenwu 发表于 2008-3-15 22:07 | 显示全部楼层

谢谢armfan

是有这样的语句,只是我调用了ledflash()以后,就把这些语句删了.因为ledflash()里是一个流水灯的死循环.
 楼主| jianwenwu 发表于 2008-3-17 14:14 | 显示全部楼层

搞了很久,还是不懂,有哪位大虾指点下/

  
阿南 发表于 2008-3-17 18:55 | 显示全部楼层

测试一下有无顺利的进入到中断处理程序Timer1_ISR

如果在0x0处的中断向量表有问题,当产生中断后程序会跑飞的.
 楼主| jianwenwu 发表于 2008-3-17 19:27 | 显示全部楼层

应该是跑飞

谢谢阿南!<br /><br />我在中断里加了句串口显示字符语句,但是还是没显示,说明程序确实没有进入到定时器1中断.想来想去最有可能是跑飞了,但是又不知道问题出在哪。下面是中断入口:<br /><br />_ISR_STARTADDRESS&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;0x33ffff00<br /><br />pISR_TIMER1&nbsp;&nbsp;&nbsp;&nbsp;EQU&nbsp;&nbsp;(_ISR_STARTADDRESS+0x4c)<br /><br />pISR_TIMER1&nbsp;=&nbsp;(int)Timer1_ISR;<br /><br />与之相对应的ADS哪些方面要作必要的设定呢?<br />
armecos 发表于 2008-3-17 20:25 | 显示全部楼层

你看下万能中断模板吧,

中断的写法有严格的顺序要求,清除、应答、使能/去使能、创建/删除、高低电平/上下边沿模式配置,特别是外部为电平触发时要注意先撤除外部电平事件再开对应中断。<br /><br />检查一下,你是否反复陷入了中断,类似于死机但不是死机,你不能在中断里用打印语句调试,因为此时可能已经影响了串口,你无法看到调试信息。<br /><br />下面的《ecos中断处理》一文全面地概括了中断处理的所有过程和细节,你只要按照这个顺序书写中断ISR就不会有任何问题,这个处理过程适合所有CPU架构。另外,你这样写中断暴露了硬件寄存器,最好按照**里说的那样,把中断处理函数抽象成几个API接口,细节在里面实现,外部接口保持统一。<br /><b>《ecos中断处理》</b>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

20

帖子

0

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