OpenEdv-开源电子网

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

定时器处理多个事件,主程序卡死。

[复制链接]

2

主题

8

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-10-15
在线时间
10 小时
发表于 2020-4-24 03:18:56 | 显示全部楼层 |阅读模式
10金钱
我在一个定时器中设置了3个不同的时间间隔,然后在三个时间间隔更新3个不同的标志位。主循环里查询这三个标位来处理事件函数,这三个函数都是对SIM模块发送指令的。现在问题是主程序会出现程序跑死的问题。可以麻烦大家帮我看一下程序问题是在哪里吗? 第一段代码是定时器中断处理函数。 分别更新了ReadAdxl345QueryDefenceInfoFlag和AddGpsInfoFlag这3个标志位。 第二段是主循环中根据标志位调用的事件函数。主循环中调用的send_message函数时查询的ReportLater变量是根据ReadAdxl345 变化的。
  1. void TIM3_IRQHandler(void){ //TIM3中断处理函数
  2.     if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){        //判断是否是TIM3中断
  3.         TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  4.                 time50ms++;
  5.                 timer2Count1++;
  6.                 timer3DefenceCount++;
  7.                 if(time50ms%5==0)
  8.                 {
  9.                
  10. <font color="#ff0000"><b>                        ReadAdxl345</b></font> =1;
  11.                         if(time50ms%10==0)
  12.                                 sendDataFlag =1;
  13.                         if(time50ms%20==0)
  14.                         {
  15.                                 ReportLater++;
  16.                                 KeyLater++;
  17.                         }       
  18.                 }                       
  19.                 UartBusy++;                        //5次未处理
  20.                 if(UartBusy>=6)          //50ms处理一次
  21.                 {
  22.                         ReadFlag=1;       
  23.                 }
  24.                 if(timer3DefenceCount==201) //每10秒查询一次围栏信息
  25.                 {
  26.                         timer3DefenceCount=0;
  27. <font color="#ff0000"><b>                        QueryDefenceInfoFlag</b></font>=1;
  28.                 }
  29.                 if(timer2Count1==401)                        //每20秒发送一次GPS定位数据
  30.                 {
  31.                         timer2Count1=0;
  32. <b><font color="#ff0000">                        AddGpsInfoFlag</font></b>=1;
  33.                 }
  34.                        
  35.                        
  36.     }
  37. }
复制代码
  1. while(1)
  2.         {
  3.                 lenx++;
  4.                 if(ReadAdxl345== 1)   //定时读取adxl345数据
  5.     {
  6.       test_X();
  7.     }

  8.     if(ReportLater>=15)        //15s
  9.     {
  10. <font color="#006400"><b>                        send_message();</b></font>
  11.     }
  12.                
  13.     if(KEY1==0)                 //按键处理
  14.     {
  15.       delay_ms(3);          //按键消抖动
  16.       if(KEY1 ==0)                 //按键处理
  17.       {
  18.         ReportLater=0;          //按键延时上报
  19.         KeyLater=0;                //按键延时处理
  20.       }
  21.     }
  22.                
  23.                 if(AddGpsInfoFlag==1){
  24.                         AddGpsInfoFlag=0;
  25. <font color="#008000"><b>                        AddGpsInfoRequest();</b></font>
  26.                 }
  27.        
  28.                 if(QueryDefenceInfoFlag==1){
  29.                         QueryDefenceInfoFlag=0;
  30. <font color="#008000"><b>                        QueryDefenceInfo();</b></font>
  31.                        
  32.                 }
  33.         }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2020-4-24 10:52:04 | 显示全部楼层
有可能是程序逻辑没处理好,处理事件的时间超过的定时器的定时时间,假如定时器定时10ms置一次标志位,而处理一次事件需要15ms,当定时器第一次置位标志后,事件开始处理数据,事件的数据还没处理完,发现标志又置位了,事件就会嵌套,随着时间越来越长,嵌套越来越深,单片机内存可能就会被耗光了,出现死机现象。仔细分析分析代码,看看逻辑上有没有问题。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2020-4-24 14:07:50 | 显示全部楼层
看着两个代码没有明显的问题。
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14410
金钱
14410
注册时间
2018-8-3
在线时间
1156 小时
发表于 2020-4-24 14:57:14 | 显示全部楼层
仿真看看卡死在哪
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-10-15
在线时间
10 小时
 楼主| 发表于 2020-4-24 19:55:33 | 显示全部楼层
HXYDJ 发表于 2020-4-24 10:52
有可能是程序逻辑没处理好,处理事件的时间超过的定时器的定时时间,假如定时器定时10ms置一次标志位,而处 ...

我每个定时的时间分别是10s,15秒和20s。这些时间单独处理事件的时候是不会卡死的。就是一起处理的时候,程序跑一会儿就卡死了。我想问一下主循环在查询标志位的时候需不需要先把定时器关闭了,等事件执行完了再打开定时器?
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-10-15
在线时间
10 小时
 楼主| 发表于 2020-4-25 01:07:36 | 显示全部楼层
@正点原子  原子哥,可以麻烦你帮我看看吗?
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-10-15
在线时间
10 小时
 楼主| 发表于 2020-4-25 01:09:36 | 显示全部楼层

没有JLink啊。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 03:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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