下面函数,只要被调用就会导致单片机死机,请大家帮忙分析

dsoyy 2013-12-25 03:41:30
都是简单的运算。
char Time_down_cmd = 0; //启动倒计时命令,1启动,0 关闭
long disp_time ;
void Disp_TimeDown(void)
{

char dispbuf1[3],dispbuf2[3] ;
int dat1=0,dat2;
int flag = 0;
int i ;


if(AutoRunType == AUTO_MODE_RUN)
{
PutStr(2,0, "运行--");
disp_time = DownTime_run;
}
else if(AutoRunType == AUTO_MODE_STOP)
{
PutStr(2,0, "停止--");
disp_time = DownTime_stop;
}


if((disp_time>=0) && (disp_time<6000) )//最大支持99分59秒
{

if(disp_time >= 60)
{
dat1 = disp_time/60;
dat2 = disp_time%60;
}
else if((disp_time >= 0))
{
dat1 = 0;
dat2 = disp_time;
}


if((dat1 >=0) && (dat2 >= 0))
{
if(dat1 < 10)
{


my_itoa(dat1,dispbuf1+1);
dispbuf1[0] = '0';
flag = 1;
}
else if(dat1 < 60)
{
my_itoa(dat1,dispbuf1);
flag = 1;
}
if(flag)
{
dispbuf1[2] = '\0';
PutStr(2,3,dispbuf1);
}

flag = 0;
if(dat2 < 10)
{


my_itoa(dat2,dispbuf2+1);
// dispbuf2[0] = '0';
flag = 1;
}
else if(dat2 < 60)
{
flag = 1;
my_itoa(dat2,dispbuf2);
}

if(flag)
{
// dispbuf2[2] = '\0';
PutStr(2,5,dispbuf2);
}
PutStr(2,4, "分");
PutStr(2,6, "秒");
PutStr(2,7, " ");
PutStr(3,0, " ");
}

}


}





简要说明:将当前的时间 XX分:XX秒 在LCD12864 上显示。

其中中到了两个子函数 PutStr()在LCD显示字符串,和my_itoa()等同于标准C的itoa()函数。在本工程中多次使用,证明是稳定可靠地。



只要调用上面的函数,CPU一两个小时左右就会死机。



编译环境MPLAB V8.66,HI-TECH

硬件8位单片机PIC16F1938



请大家指点,不胜感激。
...全文
600 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsoyy 2014-01-06
  • 打赏
  • 举报
回复
之前是定时去更新显示,调用上述函数,改成数值发生变化在调该函数,暂时没有发现问题。jieti
dsoyy 2013-12-30
  • 打赏
  • 举报
回复
感谢大家回复,暂时汇报一下情况。 1、dispbuf2[2] = '\0';这个是漏掉的代码,补上。 2、“char dispbuf1[6],dispbuf2[6] ;”尝试着增加过buf的长度,不过问题依旧存在,不是这个内存溢出导致的。 3,目前做法,之前是定时去更新显示,调用上述函数,改成数值发生变化在调该函数,暂时没有发现问题。 进一步测试中,感谢大家回复。
lm_whales 2013-12-28
  • 打赏
  • 举报
回复
char dispbuf1[6],dispbuf2[6] ; 试试
躺着睡的蜗牛 2013-12-27
  • 打赏
  • 举报
回复
在单片机上遇到过中断处理函数中输出串口Log(printf)导致死机的问题。 当时的开发环境是Keil
dsoyy 2013-12-27
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
将 // dispbuf2[2] = '\0'; 改为 dispbuf2[2] = '\0'; 试试看。
暂时调整上面函数被调用的频次,以前是定时调用刷新,现在改成判断数值变化,连续工作了9个小时了。 在观察24小时,汇报结果。
dsoyy 2013-12-27
  • 打赏
  • 举报
回复
引用 3 楼 zhaocanxing 的回复:
你的putstr是怎么写的?可不可以贴出来看看?
暂时调整上面函数被调用的频次,以前是定时调用刷新,现在改成判断数值变化,连续工作了9个小时了。 如果这个问题还会发生,我再贴这段代码,谢谢关注。
zhaocanxing 2013-12-26
  • 打赏
  • 举报
回复
你的putstr是怎么写的?可不可以贴出来看看?
dsoyy 2013-12-25
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
将 // dispbuf2[2] = '\0'; 改为 dispbuf2[2] = '\0'; 试试看。
晚上反馈结果,测试过程慢。 谢谢支持。
赵4老师 2013-12-25
  • 打赏
  • 举报
回复
将 // dispbuf2[2] = '\0'; 改为 dispbuf2[2] = '\0'; 试试看。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧