OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2814|回复: 13

程序执行几秒后卡死!!

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-11-30
在线时间
7 小时
发表于 2016-11-30 11:29:36 | 显示全部楼层 |阅读模式
我用STM32f103的RTC做了一个用LCD显示的时钟,但是程序执行后十几秒后无缘无故就卡死了,按什么键都不管用,但是卡死之后过一段时间,程序就会恢复执行,然后过一段时间又会卡死,一直循环,这是为什么??只要主循环里有LCD显示,就会出现这种情况,把LCD显示去掉,程序就不卡死了。求大神帮!!

我用的是TFT3.5寸彩屏
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2016-11-30 12:03:17 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-11-30
在线时间
7 小时
 楼主| 发表于 2016-11-30 12:12:12 | 显示全部楼层

我单步调试的时候并不会出现卡死的状态,只有全速运行的时候会出现,我并不知道是在哪卡死的。
还有,LCD显示以5HZ运行时,会出现卡死,如果直接把LCD显示放在主函数中一直刷新,就不会卡死了。
回复 支持 反对

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2016-11-30 12:16:23 | 显示全部楼层
那你刷新放中断了?
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-11-30
在线时间
7 小时
 楼主| 发表于 2016-11-30 12:26:05 | 显示全部楼层
ljz1987cj 发表于 2016-11-30 12:16
那你刷新放中断了?

还是在主函数里,TIM3每1ms中断一次使time+1,
主函数中:
while(1){
  if(time==200)
  {
      LCD_Show_Data();
      time=0;
  }
}       //这个会卡死

如果:
while(1)
{
   LCD_Show_Data();
}                 //这样就没事
如果卡死后等一会就会接着运行。。
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-11-30 12:37:40 | 显示全部楼层
改为1Hz试试           time=1000
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-11-30
在线时间
7 小时
 楼主| 发表于 2016-11-30 12:51:03 | 显示全部楼层
d1z1y2 发表于 2016-11-30 12:37
改为1Hz试试           time=1000

还是不行,只能把lcd显示直接放在主函数里。。
回复 支持 反对

使用道具 举报

5

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2016-10-27
在线时间
76 小时
发表于 2016-11-30 13:39:43 | 显示全部楼层
呵呵 改成这样看看
while(1){
         if(time>=200){
           time=0;
           LCD_Show_Data();
        }
}
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-11-30
在线时间
7 小时
 楼主| 发表于 2016-11-30 13:49:02 | 显示全部楼层
ljz1987cj 发表于 2016-11-30 13:39
呵呵 改成这样看看
while(1){
         if(time>=200){

还是不行
回复 支持 反对

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-11-30 14:00:42 | 显示全部楼层

在里面增加别的操作,你先确定他能不能按时进入这个if语句。这种小问题自己想办法一步步排除,别自己什么都不干就来问
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-11-30
在线时间
7 小时
 楼主| 发表于 2016-11-30 21:06:39 | 显示全部楼层
憨厚诚实大叔 发表于 2016-11-30 14:00
在里面增加别的操作,你先确定他能不能按时进入这个if语句。这种小问题自己想办法一步步排除,别自己什么 ...

我已经调了一天了,我能想到的方法都试了,还是解决不了。
程序在显示函数中的随机位置卡死:
void LCD_Show_Data(void)
{

        u8 a[2]={'.','\0'},b[2]={'0','\0'};
        //1#
        LCD_ShowNum(140,130,Data1.temperature,2,BLUE);
        LCD_ShowNum(140,150,Data1.humidity,2,BLUE);
        LCD_ShowNum(140,170,Data1.Voltage/100,1,BLUE);
  GUI_Show12ASCII(148,170,a,BLUE,BLACK);
        LCD_ShowNum(156,170,Data1.Voltage%100,2,BLUE);
        //2#
        LCD_ShowNum(140,225,Data2.temperature,2,BLUE);
        LCD_ShowNum(140,245,Data2.humidity,2,BLUE);
        LCD_ShowNum(140,265,Data2.Voltage/100,1,BLUE);
        GUI_Show12ASCII(148,265,a,BLUE,BLACK);
        LCD_ShowNum(156,265,Data2.Voltage%100,2,BLUE);
        //RTCêy¾Y
                        //
                        LCD_ShowNum(40,65,calendar.w_year,4,BLUE);
                        LCD_ShowNum(80,65,calendar.w_month,2,BLUE);
                        LCD_ShowNum(104,65,calendar.w_date,2,BLUE);
                        RTC_ShowWeek(140,65,calendar.week,BLUE);
               
                        //       
                        LCD_ShowNum(40,85,calendar.hour,2,BLUE);
                        LCD_ShowNum(64,85,calendar.min,2,BLUE);
                        LCD_ShowNum(88,85,calendar.sec,2,BLUE);
                       
                        //为了美观,时间补零
                        if(calendar.sec<10)
                                GUI_Show12ASCII(88,85,b,BLUE,BLACK);
                        if(calendar.min<10)
                                GUI_Show12ASCII(64,85,b,BLUE,BLACK);
                        if(calendar.hour<10)
                                GUI_Show12ASCII(40,85,b,BLUE,BLACK);
               
}
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-11-30 21:25:02 | 显示全部楼层
卡死的时候,   停止运行,   看看  在运行什么代码, 或者 在等待什么代码.   
另外写程序的时候,  实时记得代码的带宽.    你这明显就是  有些代码带宽不足,  有些代码 又过于随机性的突然占用太多MCU运算资源.
回复 支持 反对

使用道具 举报

24

主题

695

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1666
金钱
1666
注册时间
2016-4-29
在线时间
266 小时
发表于 2016-12-1 22:14:16 | 显示全部楼层
本帖最后由 d1z1y2 于 2016-12-1 22:16 编辑

看看刷新一次要多长时间,怀疑超过了200ms另外,如上面所说,== 改为 >= 更严谨一点
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2015-10-8
在线时间
32 小时
发表于 2016-12-2 01:42:14 | 显示全部楼层
你还是没听懂我的话,  卡死有会自动恢复.   很明显,  是你的  if(time==200)  这个代码被 执行成功的概率太低了.    至于为什么低,    1 你的time参数,变化太快,  2 你的液晶显示代码  太费.
举个例子
运行到 if(time==200)的时候, 不成立 (此时time<200),      然后进中断(要么你的定时器中断, 要么你的别的中断, )   等程序返回回来  运行if(time==200)的时候, 还是不成立 此时time>200

这样 一直不成立.    直到有一次,  恰好运行回来的时候  才成立.   这样看起来  一会卡死, 一会 好了
默认你的程序本身功能没问题的情况下,  应该是这个问题.   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 21:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表