OpenEdv-开源电子网

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

关于一个非常奇怪的问题

[复制链接]

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
发表于 2017-12-28 10:09:34 | 显示全部楼层 |阅读模式
10金钱
之前遇到了一个关于FLASH编程的问题,和原子哥遇到的某个问题是差不多的,帖子在这:http://www.openedv.com/forum.php?mod=viewthread&tid=24177

也就是在擦除FLASH的时候,运行printf就能正常擦除,调试也能进行擦除,但如果不printf也不调试,则必须得关闭数据缓存才能擦除,这个问题我当时也遇到了,后来看了原子哥的这帖子解决了。

但是就在昨天,我又遇到了类似的问题,运行freertos的时候,有多个任务,其中有个任务在频繁的分别从网口接收数据,一个任务接收串口的数据但不是一直有数据,另一个任务会对这两组数据进行解析并且把数据从串口发出去,然后有个灯,这个灯会根据从串口解析出来的数据执行不同的动作,现在问题来了,从网口频繁接收数据(大概10ms 40字节,连续收,且这个时候串口也会频繁打印信息)的时候,如果突然从串口接收来数据的话,整个系统就死了,我看了下不管是任务优先级、资源、信号量、队列什么的都用的正确的,然后我尝试去调试看是什么问题,结果打开keil的调试后,就死活不会出现这个问题,关闭了调试才有。

我想问下大家知道这是为什么吗?为什么printf打印 和 调试会对结果造成影响?

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

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-28 10:32:52 | 显示全部楼层
打印本身和调试代码都会耗费一定的运行时间,这就会导致调式状态和运行状态会有差异
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-28 10:34:47 | 显示全部楼层
另外请对"从串口接收来数据的话,整个系统就死了"这句话进行详细描述
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 10:58:30 | 显示全部楼层
lanlzp 发表于 2017-12-28 10:34
另外请对"从串口接收来数据的话,整个系统就死了"这句话进行详细描述

是这样的,有多个任务,一个任务A一直在接收网口数据的任务(一直在收,大概隔20ms 40字节),一个任务B在接收串口1的数据(串口1,没有一直收,但),一个任务C在对网口和串口2的DMA接收来的数据进行解析然后从串口2 printf打印回去信息(同时打印串口2与网口解析出来的数据,也会打印任务D的执行结果),另一个D任务会对解析出来的结果进行执行,也会根据串口1里的数据不解析直接执行,这个时候串口1进来数据了,D任务执行了,任务C打印了结果后,就卡死了。我检查了所有IPC关系与任务优先级,配置是完全合理没问题的,不会是系统层次的问题,然后我尝试使用KEIL调试,这个问题就一直复现不了了,关闭了调试就又能复现了。

于是我就联想到了之前原子哥遇到FLASH编程的问题也有这样类似的情况(就是上面那个链接里的文章),就想问下串口printf和调试为什么会给系统带来如此不同的结果
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 11:03:18 | 显示全部楼层
lanlzp 发表于 2017-12-28 10:32
打印本身和调试代码都会耗费一定的运行时间,这就会导致调式状态和运行状态会有差异

我理解你说的运行时间不同带来的运行结果差异,但个人认为差异不至于如此之大。对于上面链接里的文章,FLASH编程时必须关闭FLASH数据缓存,或者不关闭数据缓存,但必须使用一次串口打印或开启调试才能解决问,我能联想到是调试的确是跟数据总线有关系,因为调试的数据就是走的数据总线,但串口打印我实在是没辙了。
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 11:03:48 | 显示全部楼层
@正点原子 原子哥最后这个问题有解决吗
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
849
金钱
849
注册时间
2017-6-18
在线时间
166 小时
发表于 2017-12-28 13:12:03 来自手机 | 显示全部楼层
一看就是串口都没有调通的人,继续调串口吧
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 13:35:18 | 显示全部楼层
wlq19911021 发表于 2017-12-28 13:12
一看就是串口都没有调通的人,继续调串口吧

。。。。。。我都用了这么久了407了,还没调通串口。。。看来你是没理解我的意思
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
849
金钱
849
注册时间
2017-6-18
在线时间
166 小时
发表于 2017-12-28 13:43:55 来自手机 | 显示全部楼层
使用时间片轮转,锁调度方式进中断,OS没有就把串口接收中断关了
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-28 14:12:27 | 显示全部楼层
Szep 发表于 2017-12-28 11:03
@正点原子 原子哥最后这个问题有解决吗

        FLASH->ACR&=~(1<<10);                        //FLASH擦除期间,必须禁止数据fetch!
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-28 14:12:53 | 显示全部楼层
Szep 发表于 2017-12-28 11:03
我理解你说的运行时间不同带来的运行结果差异,但个人认为差异不至于如此之大。对于上面链接里的文章,FL ...

        FLASH->ACR&=~(1<<10);                        //FLASH擦除期间,必须禁止数据fetch!!!搞了我两晚上才发现这个问题!
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-12-28 14:15:29 | 显示全部楼层
Szep 发表于 2017-12-28 10:58
是这样的,有多个任务,一个任务A一直在接收网口数据的任务(一直在收,大概隔20ms 40字节),一个任务B ...

D任务会修改数据么?开仿真并不是没问题,只是正好时序避开了而已.你看看有没有临界变量,或者死锁了
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 14:17:59 | 显示全部楼层
lanlzp 发表于 2017-12-28 14:15
D任务会修改数据么?开仿真并不是没问题,只是正好时序避开了而已.你看看有没有临界变量,或者死锁了

好的我再测试下,也可能是因为时序避开的巧合
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 14:19:06 | 显示全部楼层

那个只是解决方法,但是在擦除时如果调用printf或者进入调试就可以不用禁止这个ACR也能正常擦除
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2017-12-28 14:19:49 | 显示全部楼层
wlq19911021 发表于 2017-12-28 13:43
使用时间片轮转,锁调度方式进中断,OS没有就把串口接收中断关了

我可以试下,谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-12-29 00:32:49 | 显示全部楼层
你后面这个问题,应该和flash编程无关了吧?
回复

使用道具 举报

4

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2017-7-18
在线时间
29 小时
 楼主| 发表于 2018-1-3 17:33:37 | 显示全部楼层
正点原子 发表于 2017-12-29 00:32
你后面这个问题,应该和flash编程无关了吧?

对的,只是类似的情况让我想起来了你之前的帖子,就是上面的那个链接,也就是使用调试时一切正常,不调试直接运行就会出错。

这个问题我已经解决了,是因为团队其他人员操作了一个野指针,而进入调试时能正常运行的情况应该是楼上的一个哥们说的时序不同。

但我现在依然很疑惑上面链接中的文章中出现的问题,也就是printf与调试都会对flash编程产生影响,而其他操作都不会,当然除了关闭数据缓存。当时我也出现了这样的情况,然后查阅了非常多的资料,依然无法理解这一现象的原因。不知原子哥是否能指点一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-4 00:24:54 | 显示全部楼层
Szep 发表于 2018-1-3 17:33
对的,只是类似的情况让我想起来了你之前的帖子,就是上面的那个链接,也就是使用调试时一切正常,不调试 ...

这种得实际遇到才好操作,找问题。暂时没遇到。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 19:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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