OpenEdv-开源电子网

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

程序会跑死,不知道问题出在哪,很奇怪。。

[复制链接]

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
发表于 2016-5-18 13:29:21 | 显示全部楼层 |阅读模式
10金钱
做的项目,自己画的板子,代码基本都是从原子例程中移植过来的(之前在探索者板子上已经实现了大部分功能),现在跑个把小时左右就会跑死,但又不完全死,能进中断,
webserver还能访问,就是程序主循环里的代码不跑了,看门狗我是在定时器中断里喂狗的,没起作用,,debug没跑死,停止debug指针停在串口代码里,还是看不出问题在哪。。

QQ截图20160518131318.jpg
QQ截图20160518131731.jpg
付出总有回报
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2014-11-13
在线时间
54 小时
发表于 2016-5-18 16:15:39 | 显示全部楼层
是不是主程序有死循环,用仿真查一下程序死在哪里。
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-18 16:39:52 | 显示全部楼层
魏浒 发表于 2016-5-18 16:15
是不是主程序有死循环,用仿真查一下程序死在哪里。

我怀疑也是掉进了某个死循环里出不来,但是不知道掉在哪了,用仿真器看不了啊,并不是跑一遍就出问题的,跑一两个小时才出的问题,单步调试没法调。。而且我自己的逻辑代码哪里有循环我是清楚的,问题应该不是出在这,怀疑是调用底层代码的循环里出问题了。。
付出总有回报
回复

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2282
金钱
2282
注册时间
2013-12-16
在线时间
448 小时
发表于 2016-5-18 17:36:18 | 显示全部楼层
一层一层往外跳跟踪,总能找到
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2014-11-13
在线时间
54 小时
发表于 2016-5-19 08:08:59 | 显示全部楼层
JAMES 发表于 2016-5-18 16:39
我怀疑也是掉进了某个死循环里出不来,但是不知道掉在哪了,用仿真器看不了啊,并不是跑一遍就出问题的, ...

在主循环中放一个标记(可用串口之类的打印出来),看主循环是不是真死了。在你认为可能死掉的地方放上标记,看看到底死在哪里。
我之前碰到过这样的问题是一个中断在响应后没有清除中断标志位,你也可以查一下这方面的问题。
1379
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-19 09:05:08 | 显示全部楼层
魏浒 发表于 2016-5-19 08:08
在主循环中放一个标记(可用串口之类的打印出来),看主循环是不是真死了。在你认为可能死掉的地方放上标 ...

移植的探索者板子的例程,串口中断中都没有清楚中断标志位,现在改过来,正在测试中。。
付出总有回报
回复

使用道具 举报

1

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2014-11-13
在线时间
54 小时
发表于 2016-5-19 10:22:51 | 显示全部楼层
JAMES 发表于 2016-5-19 09:05
移植的探索者板子的例程,串口中断中都没有清楚中断标志位,现在改过来,正在测试中。。

如果是中断引起的,触发中断就应该可以重复问题
1379
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-19 12:31:15 | 显示全部楼层
魏浒 发表于 2016-5-19 10:22
如果是中断引起的,触发中断就应该可以重复问题

加上清楚中断标志位,测了几次,问题依旧啊。。跑半个小时左右就出问题,诶,愁啊~~
付出总有回报
回复

使用道具 举报

4

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
622
金钱
622
注册时间
2016-5-11
在线时间
40 小时
发表于 2016-5-19 13:28:06 | 显示全部楼层
是不是某种条件下一致发生中断或者中断没有成功清除,导致程序循环进入中断,而主程序无法执行,比如串口出现某种错误后没有清除而一致循环 “进中断 - 出中断”...
仿真一下看出现问题后中断是否清除...
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-19 14:30:12 | 显示全部楼层
楼主你的 *.map文件可以发出来吗。我看下你的内存分布。
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-20 14:10:24 | 显示全部楼层
airproject.rar (29.43 KB, 下载次数: 479)
付出总有回报
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-20 14:10:53 | 显示全部楼层
czdspeed 发表于 2016-5-19 14:30
楼主你的 *.map文件可以发出来吗。我看下你的内存分布。

已发,怎么看的?能看出什么问题?
付出总有回报
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-20 14:29:39 | 显示全部楼层
JAMES 发表于 2016-5-20 14:10
已发,怎么看的?能看出什么问题?

我是看看你的lr寄存器的值,这里最后停在time.c了。是不是定时器的中断标志位没有被清掉啊。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-20 15:13:05 | 显示全部楼层
JAMES 发表于 2016-5-20 14:10
已发,怎么看的?能看出什么问题?

楼主,一般碰到这样的问题会看一下LR寄存器。这里是程序最后一次调用停的地方。你的截图上的数值是0x08000EC9.我就查了下map文件。正好这个地方是time.c。“ 0x08000eec   0x0000021c   Code   RO          506    .text               timer.o”这个段的函数是“TIM3_Int_Init”和“TIM3_IRQHandler”。结合你开头说的,我觉得一个是定时器的标志位。要不是是中断函数里面有什么操作导致计数器不累加了?这些都是我的思路希望能帮到楼主。但我不确定具体的问题在什么地方。
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-20 15:14:35 | 显示全部楼层
我截张图给你看
zhaobug.png
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-20 15:18:56 | 显示全部楼层
czdspeed 发表于 2016-5-20 15:13
楼主,一般碰到这样的问题会看一下LR寄存器。这里是程序最后一次调用停的地方。你的截图上的数值是0x0800 ...

大赞啊,,谢谢了,get新技能了,我去调调看
付出总有回报
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-20 15:36:27 | 显示全部楼层
JAMES 发表于 2016-5-20 15:18
大赞啊,,谢谢了,get新技能了,我去调调看

客气,我是想不一定是你的timer设置有问题,可能也有其他情况影响你的计数器了。这个我都说不清楚。你最好先不加那么多东西。
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-20 16:11:18 | 显示全部楼层
czdspeed 发表于 2016-5-20 15:36
客气,我是想不一定是你的timer设置有问题,可能也有其他情况影响你的计数器了。这个我都说不清楚。你最 ...

嗯,删了很功能代码,基本确定是串口导致的问题,但还没确定是哪个串口
付出总有回报
回复

使用道具 举报

36

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2016-4-20
在线时间
169 小时
发表于 2016-5-20 16:15:39 | 显示全部楼层
JAMES 发表于 2016-5-20 16:11
嗯,删了很功能代码,基本确定是串口导致的问题,但还没确定是哪个串口

我在想为什么是跑一段时间才会死呢,你这个申请了内存没有。是不是没有释放干净造成的。楼主先用最简单的代码测试一下吧。
回复

使用道具 举报

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2016-1-14
在线时间
42 小时
发表于 2016-5-21 10:25:27 来自手机 | 显示全部楼层
时钟配置,晶振电路检查下,起始不恰当,后面跑一会就死
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-23 08:40:22 | 显示全部楼层
czdspeed 发表于 2016-5-20 16:15
我在想为什么是跑一段时间才会死呢,你这个申请了内存没有。是不是没有释放干净造成的。楼主先用最简单的 ...

没申请内存,现在基本能确定是串口5的问题了,串口5我是作为485的,调试跑死指针都是停在串口5,,周末这两天把串口5的代码去了,今天来看跑得很正常。。现在研究下串口5 485的代码是什么问题。。
付出总有回报
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-23 09:07:34 | 显示全部楼层
JAMES 发表于 2016-5-23 08:40
没申请内存,现在基本能确定是串口5的问题了,串口5我是作为485的,调试跑死指针都是停在串口5,,周末这 ...

记错了,串口5是GPS数据接收
付出总有回报
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2016-5-23 10:11:15 | 显示全部楼层
uart5.c 内有溢出。最容易出错地方,数组越界,或是u8,u16计数值 溢出;
1-1
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-23 12:27:38 | 显示全部楼层
现在能确定的就是死在了串口5的中断中,并且是(USART_GetITStatus(UART5, USART_IT_RXNE)这个函数,但是想不通啊,这函数里没死循环啊。。我加了个定时器1秒中断一次点亮LED,跑得很正常的。感觉就是死在某个循环里,中断正常这种情况,,
QQ截图20160523122110.jpg
付出总有回报
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2016-5-23 14:15:55 | 显示全部楼层
JAMES 发表于 2016-5-23 12:27
现在能确定的就是死在了串口5的中断中,并且是(USART_GetITStatus(UART5, USART_IT_RXNE)这个函数,但是想 ...

检查下你的参数输入合法性问题,十有八九 掉在这个里面了
void assert_failed(uint8_t* file, uint32_t line)
{
    /* 用户可以增加自己的代码用于报告错误的文件名和所在行数,
       例如:printf("错误参数值: 文件名 %s 在 %d行\r\n", file, line) */

    /* 死循环 */
    while (1)
    {
                       
                //        printf("错误参数值: 文件名 %s 在 %d行\r\n", file, line);
    }
}
1-1
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-23 16:54:50 | 显示全部楼层
mygod 发表于 2016-5-23 14:15
检查下你的参数输入合法性问题,十有八九 掉在这个里面了
void assert_failed(uint8_t* file, uint32_t  ...

嗯,正在改 测试。。
付出总有回报
回复

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-5-13
在线时间
21 小时
 楼主| 发表于 2016-5-25 11:07:39 | 显示全部楼层
现在测试发现串口5和串口6一起用就会出跑死,并且最后指针是停在串口5的中断中,在判断中断标志位那里,单独测都没问题。。好郁闷,对比了代码,没看出问题。。
付出总有回报
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 08:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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