中断程序被擦除

tyrone3000   2009-3-6 16:15 楼主
请教各位:

我的热表程序运行一段时间后出现异常,经读回代码查看后得知,从0xFFE0地址开始,也就是中断向量口地址,全部变成0XFF,包括中断的入口地址也是如此;我分析如果是程序跑飞,至少入口地址不应该全为FF吧,它应该是读操作而非写操作呀,但从现象看来不是被擦除了就是这段地址被破坏了,不知道哪位高手可以帮忙分析一下,非常感谢!
另外还有一个情况说明,这个现象只是部分表的程序才会出现,其它的运行几年的也没出现

回复评论 (14)

你程序有对FLASH操作的语句吗
点赞  2009-3-6 20:21
我想知道你是怎么读回代码的?除了中断向量外,其他的数据对吗?
点赞  2009-3-6 22:35
工作温度,电压都正常吗?
点赞  2009-3-6 22:44
如果有对flash操作代码,在单片机因为电压不稳或干扰造成错误是有可能的
点赞  2009-3-9 09:56
引用:

我想知道你是怎么读回代码的?除了中断向量外,其他的数据对吗?
直接用编程器读回,其他数据都对,只有中断向量这块出了问题
点赞  2009-3-12 13:04
引用:

你程序有对FLASH操作的语句吗
有对Information段的读写操作,不过在写操作时关中断了,时序也没有问题
点赞  2009-3-12 13:05
引用:

如果有对flash操作代码,在单片机因为电压不稳或干扰造成错误是有可能的
请教:如果是这样,在硬件没办法改动的情况下,如何在软件上进行改进来规避这种情况的发生,或者受到干扰后能够重新执行程序呢?
点赞  2009-3-12 13:10
再请教高手:我发现同样的中断程序经C语言编译后代码不相同,汇编理论上应该是一样的,不知道C语言编译后会不会一样? 如果应该相同,那么是否说明我的中断程序有问题呢
点赞  2009-3-12 13:14
编译后代码不一定得相同,你可以把你中断程序贴出来大家帮你看看
点赞  2009-3-12 13:52
有FLASH操作的时候最好对中断向量等重要数据进行备份
点赞  2009-3-12 23:00
先写 一段小程序看看是不是 也会跑飞掉
看看中断向量里面的内容是不是变成FFFF了
点赞  2009-3-12 23:45
我重新核对问题后发现出厂前没有出现这个问题,都是运行一段时间后才出现,但是对FLASH的操作在出厂后就没有了,很困惑!下面这段程序是基本定时器中断程序,也就是中断向量开始的地方,请大家看看有什么问题
#pragma vector=BASICTIMER_VECTOR //基本定时器中断程序,秒中断
__interrupt void BASICTIME()
{
display_renew_time++; //显示更新时间+1
key_time++; //test key‘s delay
if(LCDCTL&LCDON)
displaytime++;//显示时间+1
if(display_instant_flux_flag==0x5a)
{
if(++display_instant_time>=5)
{
display_instant_flux_firstflag=0;
_BIC_SR_IRQ(LPM3_bits);
}
}
if(display_power_flag==0x5a)
{
if(++display_power_time>=30)
{
display_power_firstflag=0;
_BIC_SR_IRQ(LPM3_bits);
}
}
if(++second10>=60)
{
second10=0;
if(++minute10>=65) //分钟计数器+1
{
minute10=0;
hour_soft_flag=0x5a;//软件定时一小时标志
_BIC_SR_IRQ(LPM3_bits);
}
}
if(debug_flag==0x5a)// sample AD per 2 second when debuging
{
if(++debug_time>=2)
{
debug_time=0;
temperaturemesure_flag=0x5a; //置AD采样标识
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
}
else if(fluxing_flag==0x5a)
{
if(++basic_time>=10)//若5秒钟没有脉冲标志,即认为无脉冲
{
fluxing_flag=0;
temperaturemesure_flag=0x5a;//when flux stop,calculate flux and heat
_BIC_SR_IRQ(LPM3_bits);
}
else if(!(second10%30))//when fluxing test temperature once 30 second
{
temperaturemesure_flag=0x5a;
_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)
}
}
else if(!second10)
{
if(minute10>=2)
{
minute10=0;
temperaturemesure_flag=0x5a;
_BIC_SR_IRQ(LPM3_bits); //test temperature once 2 minute when no flux
}
}//
if(displaypoint!=0)
{
if(debug_flag==0x5a)
{
if(LCDMEM[0]&BIT0)//调试状态时“t"闪烁
guanceshi;
else
ceshi;
}
_BIC_SR_IRQ(LPM3_bits);
}
点赞  2009-3-13 08:48
引用:

先写 一段小程序看看是不是 也会跑飞掉
看看中断向量里面的内容是不是变成FFFF了
我现在对程序调试也不会跑飞,除非中断程序只有_NOP()指令而没有实际操作就会全变成FFFF了,这个问题好像是小概率事件,但是就是不知道在什么条件下会触发它?如何测试呢?
点赞  2009-3-13 08:52
要不要对要存储的数据进行备份?

还有就是我现在用169片子,RST引脚直接上拉到VCC,没有加其他的器件,这样做行吗??


引用:

有FLASH操作的时候最好对中断向量等重要数据进行备份
点赞  2009-3-13 11:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复