我们都知道,在嵌入式图形界面中使用最多的也就是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 p