之前遇到了一个关于FLASH编程的问题,和原子哥遇到的某个问题是差不多的,帖子在这:
http://www.openedv.com/forum.php?mod=viewthread&tid=24177
也就是在擦除FLASH的时候,运行printf就能正常擦除,调试也能进行擦除,但如果不printf也不调试,则必须得关闭数据缓存才能擦除,这个问题我当时也遇到了,后来看了原子哥的这帖子解决了。
但是就在昨天,我又遇到了类似的问题,运行freertos的时候,有多个任务,其中有个任务在频繁的分别从网口接收数据,一个任务接收串口的数据但不是一直有数据,另一个任务会对这两组数据进行解析并且把数据从串口发出去,然后有个灯,这个灯会根据从串口解析出来的数据执行不同的动作,现在问题来了,从网口频繁接收数据(大概10ms 40字节,连续收,且这个时候串口也会频繁打印信息)的时候,如果突然从串口接收来数据的话,整个系统就死了,我看了下不管是任务优先级、资源、信号量、队列什么的都用的正确的,然后我尝试去调试看是什么问题,结果打开keil的调试后,就死活不会出现这个问题,关闭了调试才有。
我想问下大家知道这是为什么吗?为什么printf打印 和 调试会对结果造成影响?
是这样的,有多个任务,一个任务A一直在接收网口数据的任务(一直在收,大概隔20ms 40字节),一个任务B在接收串口1的数据(串口1,没有一直收,但),一个任务C在对网口和串口2的DMA接收来的数据进行解析然后从串口2 printf打印回去信息(同时打印串口2与网口解析出来的数据,也会打印任务D的执行结果),另一个D任务会对解析出来的结果进行执行,也会根据串口1里的数据不解析直接执行,这个时候串口1进来数据了,D任务执行了,任务C打印了结果后,就卡死了。我检查了所有IPC关系与任务优先级,配置是完全合理没问题的,不会是系统层次的问题,然后我尝试使用KEIL调试,这个问题就一直复现不了了,关闭了调试就又能复现了。
于是我就联想到了之前原子哥遇到FLASH编程的问题也有这样类似的情况(就是上面那个链接里的文章),就想问下串口printf和调试为什么会给系统带来如此不同的结果
我理解你说的运行时间不同带来的运行结果差异,但个人认为差异不至于如此之大。对于上面链接里的文章,FLASH编程时必须关闭FLASH数据缓存,或者不关闭数据缓存,但必须使用一次串口打印或开启调试才能解决问,我能联想到是调试的确是跟数据总线有关系,因为调试的数据就是走的数据总线,但串口打印我实在是没辙了。
一周热门 更多>