前两天把智能家居的项目给开了一个开头,
项目大致介绍:模仿智能家居系统,安装交叉编译器(arm-linux-gcc),u-boot移植,linux内核移植,tslib移植,QT移植,根文件系统制作(busybox)等环境。基于以上的开发环境,通过编写驱动代码,封装底层库函数实现功能,并编写测试程序进行测试,最后利用QT图形界面设计终端显示界面,通过开发板来控制实现。
现在所实现的功能:在开发板上编写了一个QT图形界面,里面有4个按键能通过按键控制开发板的LED开关,和BEEP蜂鸣器的开关,今天在做ADC转换功能。AD转化电压功能已完成(1.18)
这里先把所遇到的问题记录一下,
1.当封装好库函数的时候制作一个动态库:
arm-linux-gcc -shared -fpic -o libbeep.so beep.c beep.h
制作好动态库以后再编写测试代码和生成测试文件。
arm-linux-gcc -o beep_test beep_test.c -L/opt/project/hwlib/beep -lbeep(当前路径)
编译测试文件之前必须先有这个动态库,今天做ADC的时候先生成测试文件了,结果不行。
2.在QT交叉编译的时候
第一步生成一个工程文件没有问题
/opt/project/qt/bin/qmake project (注意,生成工程文件做一次!)
第二部在工程文件里面添加自己封装的C库函数(问题)
INCLUDEPATH += /opt/project/hwlib/led
LIBS += -L/opt/project/hwlib/led -lled (添加LED的库)
添加完后qmake,这里qmake一定要在之前移植的qt路径下qmake,之前不知道,一直在当前路径下qmake,结果后面make一直出现没有定义头文件的错误!/opt/project/qt/bin/qmake
qmake之后会生成一个Makefile文件,之后执行make即可。
当添加beep蜂鸣器C库的时候,在工程文件里继续添加:
INCLUDEPATH += /opt/project/hwlib/beep
LIBS += -L/opt/project/hwlib/beep -lbeep
这里要注意了,添加完之后一定要把之前make生成的文件删除,重新去qmake一下,因为之前make生成的文件都是基于led生成的,里面不包含beep的文件,要是不删除的话会提醒找不到beep头文件,而led的头文件是能找到的。这里在做的时候弄了挺一会的,后面问项目经理才彻底搞明白。
3.一些马虎造成的错误
把ADC的驱动和C库函数以及测试程序都写完后,在开发板上测试的时候出现,加载模块没有问题,显示打开设备成功,打开ioctl成功,结果就没有下文了,下面就没有显示了。我的分析肯定是read出现问题了,我检查了一遍测试代码和C库代码,好像也什么错,我加了几个printf打印信息,还是没有能够找到,那我估计就是驱动里面出错了。再对照老师给的参考代码里面发现,在启动ADC的时候代码写反了,cur |= (1 << 0); 写成了 cur |= (0 << 1);
本来一个是把1左移0位,然后取或,结果给写反了。在写驱动的有些细节上一定要仔细,还有许多的编写错误这里就不一一列举了。等遇到新问题的时候在继续补充吧。
4.在写I2C内核框架的时候设计到修改内核的头文件参数,所以需要重新编译zImage文件,开始直接在原来的基础上直接make,因为上课老师就是这样的,我就跟着他做了,结果我的make到最后出错了,老师的却可以。这让我非常郁闷,他错误提示是没有在这个路径下找到找到什么文件,我回想了下当时编译内核的时候是没有修改内核默认文件夹名字的,是cw210-kernel... ,于是我把文件夹名字换成原来的这个,重新make了一下,到最后还是出错了。于是我就问了度娘,度娘说试试把make生成的文件全部删除,重新编译。对哦,之前在qt交叉编译的时候也是这样的问题,于是乎,我先make clean删除所有文件,最后重新make 生成文件。果然可以了,接着就是把新的内核放到开
阅读(1583) | 评论(0) | 转发(0) |