关于嵌入式入门时候,所遇到的问题

主要还是提醒自己

原因:电脑里面的WPS太卡,打开都要几分钟甚至崩溃,不如放上来,这样看或许更快

嵌入式入门:两个方向(应用开发以及对于底层驱动的修改)

由于毕业设计的需求,身为软件班底的我,不得不开始接触这方面的知识。

应用开发最好是使用Qt语言,进行开发,无论是图形重绘,对底层的控制都做了相当的简化

驱动修改则是必须得一板一眼的学习C语言,一步一脚印

接着还需要一个开发板,做好嵌入式移植的准备。

前提到此为止,

先记录自己的错误:

过往记录
搭建linux的时候,硬盘格式化尽量在同一平台工作,这样可以避免硬盘分区出错
9月14日起记录
在启动eclipse的时候,虽然注意了硬件的插入,但是忘记将驱动打开,以后要出问题了,要检查硬件和驱动
9月15日
终于将samba配置好了,由于自己在安装红帽的时候,Samba完全安装,导致使用rpm的时候无法使用,因此卸了重新安装。为此,自己上网下载了Samba,在电脑上解压。自己配置。问题是中文无法正常显示。
9月16日
安装Qt的时候竟然没有办法打开,结果发现是GCC的等级太低了,应该去升级,为此查了一翻资料。
9月18日
安装GCC的时候,gmp,mpc,mpfr这些库都要更换一边,不然无法安装。结果光是安装都消耗的4个小时,不说什么配置,以及调整软链接了,更不用说做什么了。
9月19日-9月22日
想要配置Qt,发现redhat内核自带的工具版本太低,只好重新装一个Ubuntu。再查看Qt的历代版本之后,终于弄清楚Qt究竟是什么了。首先Qt需要QT编译库,以及QT CREATOR,前者是提供了编译所需要的类库,后者是用来编写的IDE,还有一个x86的是用来模拟QT的。这两个就能开发出QT。在电脑里面还要分出PC版,以及ARM版,x86版本。三者者之间的区别就是configure的配置不一样,只需要将configure的配置修改即可。
弄懂之后,自己之前胡乱编译的东西要重新来过,用命令make configclean
重新make的速度太慢了,从9点57分开始,到了13点正结束,接着make install记住要添加权限。13:01开始,13:19结束。(Linux令人绝望的编译速度)
开始对ARM的配置:
对ARM进行配置的时候,出现了错误:
You have not explicitly asked to use pkg-config and are cross-compiling.
pkg-config will not be used to automatically query cflag/lib parameters for
dependencies


解决了。只要在配置后面添上 -force pkg-config 就能解决,但是,还有新的问题出现了,就是说环境变量出问题,最后,到了tslib的库里面调试,发现还是不行,于是配置去掉了tslib的内容,试着在gtk里面添加,还是不行,这是我一天的成果了。行,Linux你赢了,我输了行了吧。我放弃,直接用教材里面的教程。
等我以后再来收拾你这个问题,我先怂上一波。
我回去看了文档(TQ2440的),发现里面的东西全部配置好的,至少文档是这么说的。
只要一个./,无语,我废了这么大的功夫......
解压的时候记住,-C 要到主目录的话,记住在最后加上 /,老是忘记。(Linux那令人绝望的解压速度)
打开发现没有PC的build,没有QTCREATOR,还好都装上了,刚刚差了压缩包里面的ARM,不行,这个服务太差,资料和光盘的资料不符,差评。只要以后注意不要使用4.8.3里独有的类库就OK了。
开始编译ARM-qt,18:10分开始。失败了
9月23日
再一次的使用QT4.8.3,先不理会warnning,尝试着make,试试看,从早上10:44开始。
失败了.
决定更换一次配置
./configure -prefix    -opensource  -confirm-license -release -shared -embedded arm -xplatform qws/linux-arm-g++ -depths all -fast -optimized-qmake -pch -qt-sql-sqlite -qt-libjpeg  -qt-zlib -qt-libpng -qt-freetype -little-endian  -host-little-endian -no-qt3support -no-libtiff   -no-libmng -no-opengl -no-mmx  -no-sse  -no-sse2 -no-3dnow -no-openssl -no-webkit -no-qvfb -no-phonon -no-nis -no-opengl -no-cups -no-glib -no-xcursor   -no-xfixes  -no-xrandr   -no-xrender -no-separate-debug-info -nomake examples   -nomake  tools   -nomake docs -qt-mouse-tslib  -I/opt/tslib-1.0/include  -L/opt-1.0/tslib/lib
再一次的配置成功了,从11:06开始,make,12:24结束。
醉了,找不到目录,这一次确定好目录。


10月10日
将已经配置好的环境,已经开始学习Qt,在学习中,要在头文件中声明好了,一个字母都能不能出错的使用,以及类库中的所含有的函数表达式也不能打错。在信号和槽里面都是使用函数居多。


原来如此,QtCreate创建的时候,产生的ui 头文件在同级文件夹里面。


10月11日
#ifndef GOTOCELLDIALOG_H
#define GOTOCELLDIALOG_H


#include
#include "ui_gotocelldialog.h"
namespace Ui {
class gotocelldialog;
}


class gotocelldialog : public QDialog,public Ui::gotocelldialog
{
    Q_OBJECT


public:
    gotocelldialog(QWidget *parent = 0);


private slots:
    void on_lineEdit_textChanged();


};


#endif
在昨天做的一个例子里面,发现了一个小错误,‘{’前少了期望的类名,当时我以为我语法上出错,检查了几遍之后,发现没有问题。检查了宏定义之后还是没有问题,那么是哪里出错呢?
当时我不明白,类的名字出错吗?我检验了一下,上下的类名使用统一,我还是没有明白,上网搜了资料众说芸芸。我只好从头在思索自己做的过程。就这样字花了一天。不过1今天早上忽然间明白了。
我将ui_xxx的头文件打开,发现系统自动编译的类名与我引用的不符,当时就将上面的更改,还是出错。接着把引用的和系统自动编译的统一起来就好了。换句话说,还是头文件上面出了差错,当时以为系统编译的肯定没有问题,但是那只是语法上没有问题,很有可能造成的是逻辑上的问题。
关于无法识别U盘的问题在于,在虚拟机上没有设置好USB的接口等级。
这一次解决了关于为什么在开发板上出现了编译时,编译文件无法相连的问题,就是因为我是从windows上拷到arm里面,导致了里面软链接全乱了,所以切记不要轻易的从LINUX上直接复制到window上。
问题又来了,字体库不匹配。


10月12日
字体库的问题,自己突然消失了,换言之是一个找不到etc下的pointercal经过查找发现是,自己的tslib没有通过十字测试,所以运行ts_calibate。却有新的问题,就是无法识别触摸屏。
现在我在tslib里面查看源代码,查看错误代码来源:
if (! ((ioctl(ts->fd, EVIOCGVERSION, &version) >= 0) &&
02.(version == EV_VERSION) &&
03.(ioctl(ts->fd, EVIOCGBIT(0, sizeof(bit) * 8), &bit) >= 0) &&
04.(bit & (1 << EV_ABS)) &&
05.(ioctl(ts->fd, EVIOCGBIT(EV_ABS, sizeof(absbit) * 8), &absbit) >= 0) &&
06.(absbit & (1 << ABS_X)) &&
07.(absbit & (1 << ABS_Y)) && (absbit & (1 << ABS_PRESSURE)))) {
08.fprintf(stderr, "selected device is not a touchscreen I understand
09.");
发现了验证这个错误的有几点首先是EV的版本号,接着是EV获得设备的号码,最后是在屏幕上接触的X轴与Y轴的位置。
开始排除错误来源:EV版本号查了一下是0x10001好像是友臂的开发板都有的BUG,但是天嵌好像没有。因为成为二进制的编码无法查看ARM里面EV
第二那就是触摸屏的事件号码,应该没错是3号。
第三十接触X,Y轴,触碰无果,接受不到信号?
难道是这一步出错?


10月13日
经过昨天的查找资料,我逐一排除了错误因为我使用cat event3 出现了乱码,说明了我选择了正确的触摸屏设备号,接着触摸屏内部驱动代码经过查找,一样没有问题,也就是说X,Y两轴的信号接受没问题。
那就剩下最后一个问题,这是大部分人都容易遇到的错误,那就是linux内核EV版本号和arm-linux-gcc编译器的EV版本不一致。
只要从0x10001改到0x10000或者0x10000改成0x10001
Tslib可以正确运行了,但是新的问题又来了,
blit_setup(): Screen depth 32 not supported!
上网查了之后,再看看自己的配置,的确在depth上的配置上少了一个32位的颜色,因此必须重新编译,make


#./configure -prefix /opt/qt-4.8.3-arm/ -shared -no-fast -no-largefile -no-exceptions -qt-sql-sqlite -qt3support -no-xmlpatterns -multimedia -no-svg -no-mmx -no-3dnow -no-sse -no-sse2 -qt-zlib -no-webkit -qt-libtiff -qt-libpng -qt-libjpeg -make libs -nomake examples -nomake docs -nomake demo -no-optimized-qmake -no-nis -no-cups -no-iconv -no-dbus -no-separate-debug-info -no-openssl -xplatform qws/linux-arm-g++ -embedded arm -little-endian -no-freetype -depths all -qt-gfx-linuxfb -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-kbd-tty -no-glib -armfpa -no-mouse-qvfb -qt-mouse-pc -qt-mouse-tslib -I/opt/tslib-1.4.1/include -L/opt/tslib-1.4.1/lib


又开始一小时的等待了...
好了,重新编译,装QT库,成功了!
屏幕支持32位深度的显示,但是新的问题立即又来了,我的屏幕只有对角线才能感应到了!看来只能继续解决了。


10月16日
经过了一段时间之后,开发板接触不良的现象好了,推测应该是接触不良或者是打开开发板过久使得接触过热之类的问题了。
还有容易自己的程序容易闪退的问题,没想到是自己的USB线搭在绿色区域上,所以才会闪退
至此我的所有,所有的配置问题在此正式结束。


历时一个月


感想:对于初步接触的我,为了了解多平台之间的工作协调性,相互的配置问题,甚至跑到了内核查找问题,修改内核,重新编译。虽然十分耗时,但是所有的一切问题在自己的手上迎刃而解实在大快人心。


当写关于扩展对话框的时候出现了错误,里面什么提示都没有,只有一个程序异常终止。连错误代码都没有,究竟是哪里出问题了呢?
我开始单步调试:
到了layout()->setSizeConstraint(QLayout::SetFixedSize);
这一句的时候,弹出了一个对话框,大意是操作系统给予了一个信号,拾起终止。当我看见下面的解释的时候,就知道,这是段错误。
段错误的原因:大概就是数组超出界限(内存越界)。
访问NULL(不存在地址)的指针。
访问变量所占地址空间是否被程序释放掉。
还有访问了只读的内存。
等等。
这次错误发生在哪里呢?


RTTI symbol not found for class 'QDialog'
程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型


终于解决了,我查了一番资料之后,我明白了,为什么不是调试说找不到QDialog,要么就是到了libqtgui的时候,跳转到了段错误里面。
其实就是layout()这个函数读取不到想要的内存,换句话说,就是读取不到布局!
想通了之后,整个事情就能解决了
我查看了一下我的布局,在整个对话框中,我的的确确布局了,那么为什么有没有办法读取布局呢?
我百思不得其解。
我在旁边的篮框发现了,我实在QDialog之上开始建立多一个子对话框。
也就是说,最大的布局我根本没有做,又何来的的布局呢?
想通了,直接在外面布下了LAY OUT IN GRID 就是阑珊布局
搞定!


10月23日
经过几日的学习之后,终于将电子表格做出来了。不过,还是有不少的缺陷,发现自己对this这个指针不是很了解。不知道怎么用。因此诞生了一些指针上的一些错误。


10月24日
自定义窗口部件的时候,记住在定义上面添加上部件原来的头文件,不然无法识别。还有QT3.5里面pro是自动识别的,只需要自己修改即可。


10月25日
在自定义的之后,发现自己的自定义的库里面完全没有自己定义的iconeditor。通过网上的查找大约出现了三种情况:第一放的工具链位置不对。第二就是依赖库之间不存在。第三就是buildkey不对。
无法加载的原因基本有3种:
    1. 编译的插件库没有放在正确的目录下,程序根本没找到;
    2. 插件库运行需要其他库的支持(比如数据库驱动插件,需要额外的相关数据库连接库),如果系统没有找到这些相关库,虽然可以找到你的插件,同样会无法加载;
    3. Build Key不兼容的问题,也就是说主程序编译的环境和插件编译的环境不兼容,导致插件和主程序可能无法调用,因此Qt也无法加载这些插件。
我发现我是第一种之后,就放进了designer里面,虽然识别出来,却无法加载。这是怎么回事呢?


难道是依赖的库不对,我自己编写的就没有依赖过库,那么就是buildkey不对?不对我的确是使用release来构建的?
问题是哪里呢?
插件验证数又是什么来的呢?


 qt_plugin_query_verification_data()
应该是这个
通过验证这个函数来使得插件通过加载。




思考了半天,还是没有结果,没有想通。不过已经有一个模糊的猜测。可能是库没放对??不知道。之后


11月3日
时隔多日,再一次出现了重复定义的问题,主要是自己重复定义了相同的构造函数。还有,arm-linux-gcc并不支持UTF-8BOM的格式,带有之后必须去除其全角符号,还有拷到笔记本之后虽然没有了全角符号,不过顶部会添加了记事本带有的特殊符号。因此也不能拷到记事本里面。


正式开始做毕业设计11月22日
想要的模块一共分三个:音响,图片自动播放,以及编辑界面
首先实现音响播放。
按钮图层设定:需要把资源里面的完整路径写到url中。


11月29日
将MP3模块做好后,在ARM-LINUX上进行测试,发现缺少了必须的gstreamer和他的依赖库glib,那么就要开始进行重新的配置。
12月1日-2日
对glib进行编译,需要用su切换到root的权限,才能够将其make install
Gstreamer的依赖库有两个,一个是glib以及libxml.
当编译好两者之后,开始编译Gstreamer.
由于是交叉编译,需要用到PKG_CONFIG_PATH来验证自己的编译库是什么。


CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。
LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。
LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv
简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。不过使用时链接阶段这两个参数都会加上,所以你即使将这两个的值互换,也没有问题。
有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":
LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib
如果在执行./configure以前设置环境变量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意设置环境变量等号两边不可以有空格,而且要加上引号(shell的用法)。那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。


12月29日
明白了Qt调用资源的格式了。
比如说setpixmap里面,“:”就是调用的是Qt资源里面的图片,而接下来的符号就是资源的前缀
想要调用绝对路径的文件,就不需要加双猫好,但是路径名一定要写对。
同时可以调用声明好的QString
接下来测试数据库中调用的绝对路径该如何显示图片。


你可能感兴趣的:(嵌入式入门)