结对小伙伴博客链接
实验报告封面
实验内容、步骤与体会
1、阅读和理解源代码
进入/arm2410cl/exp/drivers/01_demo,使用vi 编辑器或其他编辑器阅读理解源代码。
2、编译驱动模块及测试程序
Makefile 中有两种编译方法,可以在本机上使用gcc;也可以使用交叉编译器进行编译。
如果编译的时候出现问题,可能是在/usr/src 下没有建立一个linux 连接,可以使用下面的命令:
[root@zxt 01_demo]# cd /usr/src/
[root@zxt src]# ln -sf linux-2.4.20-8 linux
[root@zxt src]# ls
debug linux linux-2.4 linux-2.4.20-8 redhat
3、测试驱动程序
如果使用 gcc 编译的话,需要通过下面的命令来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。
#mknod /dev/demo c 254 0
首先要插入驱动模块demo.o,然后可以用lsmod 命令来查看模块是否已经被插入,在不使用该模块的时候还可以用rmmod 命令来将模块卸载。
实验过程的理解,实验指导书中知识点的理解
(1)什么是驱动程序设计,它有何作用?
驱动程序的作用是应用程序与硬件之间的一个中间软件层,驱动程序应该为应用程序展现硬件的所有功能,不应该强加其他的约束,对于硬件使用的权限和限制应该由应用程序层控制。但有时驱动程序的设计是跟所开发的项目相关的,这时就可能在驱动层加入一些与应用相关的的设计考虑,主要是因为在驱动层的效率比应用层高,同事为了项目的需要可能只强化或优化硬件的某个功能,而弱化或关闭其他一些功能;到底需要展现硬件的哪些功能全都由开发者根据需要而定。驱动程序有时会被多个进程同时使用,这时我们要考虑如何处理并发地问题,就需要调用一些内核的函数使用互斥量和锁等机制。
(2)怎样测试驱动程序?
首先要插入驱动模块demo.o,然后可以用lsmod 命令来查看模块是否已经被插入,在不使用该模块的时候还可以用rmmod 命令来将模块卸载。然后运行测试程序,查看和预期结果是否一致。
实验过程中遇到的问题以及解决方案
(1)使用Makefile文件编译未能成功,提示头文件中的函数出错。
根据错误解释,应该是在Makefile路径未找到头文件中的库函数,于是在Redhat系统中找到存放内核头文件的路径,将其替换掉原先在Makefile文件中的路径,在执行make命令编译,成功。
(2)在编译测试文件test_demo.c时,使用gcc编译不成功, 使用armv4l-unknown-linux-gcc编译也不成功。
在使用gcc编译时未建立设备节点,建立结点后编译成功。
(3)当实验进行当编译那一步时总是出错,无法显现出指导书上那样正确的情况。
在实验中,编译我们使用了make的方法。我们错误认为使用交叉编译,但是应该用GCC编译,补上相关语句,修改MAKEFILE即可成功。