Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13641
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 25
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-18 09:09
文章分类
文章存档

2015年(9)

我的朋友

分类: 嵌入式

2015-03-24 15:38:11

      我们都知道,在嵌入式图形界面中使用最多的也就是QT了。但在使用过程中可能会遇到各种各样问题,最近我就遇到一个问题。

想必printf和Debug都使用过很多次了吧。但是在QT界面里请慎用,还是直奔主题吧!

     我的开发环境是IMX287开发板。需要开发一个通讯控制程序。需要长时间运行。但我发现我的程序大约在运行8个小时左右界面就会卡死,奇怪的是看门狗却没有复位。当时以为自己的程序有问题。查了好几遍都没有找出原因。后来进过多次测试才发现原来是我程序中的printf导致的。

       IMX287默认带有一个图标启动程序,当我把我的程序做成图标程序启动时,发现过几个小时,程序界面就会卡死。当我用命令行启动时,程序跑了30多个小时还是正常的。相同的程序,不同的启动方式,造成不同的结果。唯一区别就是我在程序里加的printf语句在用命令行启动时打印在串口上了。

      用图标启动时串口就没有打印出任何东西。可能原因是printf在通过QT启动时,标准输出对应的应该是LCD,但是printf是无法直接在打印在ARM LCD上的。所以printf打印的内容一致驻留在linux的缓冲区内,当数据越来越多就会造成溢出。然后程序界面就会卡死。但是看门狗不复位。此时串口显示如下(前提是用图标启动前已通过串口登陆开发板,如果卡死后再通过串口登陆无法难道下面的打印信息):

DMA: 66*4kB 0*8kB 1*16kB 1*32kB 2*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 440kB
Normal: 8*4kB 1*8kB 1*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 760kB
289 total pagecache pages
0 pages in swap cache
Swap cache stats: add 0, delete 0, find 0/0
Free swap  = 0kB
Total swap = 0kB
16384 pages of RAM
359 free pages
1486 reserved pages
875 slab pages
150 pages shared
0 pages swap cached
Out of memory: kill process 2171 (start_zylaunche) score 795 or a child
Killed process 2193 (framework) vsz:97360kB, anon-rss:49908kB, file-rss:556kB

      根据提示可以看出是内存什么的不够了啊,而且也kill掉start_zylaunche和framework两个进程了,所以卡死后通过ps命令发现那两个进程都没有了(正常情况下是有的)。

      用命令行启动程序时printf通过标准输出打印到串口上了,所以数据就不会驻留在内存里。图标启动大家可以理解为没有把数据拿走,负荷太重就崩溃了。而命令行启动数据被通过串口输出了。

      为了进一步验证我的猜想,我把复杂的通讯功能都去掉了,只留一个界面和一个打印线程。通过图标启动一两分钟就卡死。通过命令行就正常。


  以上就是我的测试,我是在IMX287上测试的。其他的平台并未测试过。

  总结:万一你的QT程序过一会界面卡死了。可能使你程序里printf造成的!

阅读(1199) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~