20145316&20145229实验四:驱动程序设计
实验结对情况:
20145229吴姗珊
一、实验内容与步骤
1.本次实验建立在掌握嵌入式开发平台使用方法和配置方法的基础上,要求使用windows xp
,linux(red hat)
,arm
三个系统(即NFS
方式);
2.在linux系统中安装arm系统,然后对01_demo
文件夹中的.c文件
进行交叉编译。
3.阅读和理解源代码:进入/arm2410cl/exp/drivers/01_demo
,使用vim编辑器或其他编辑器阅读理解源代码。
4.编译驱动模块及测试程序
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
5.测试驱动程序
若使用 gcc 编译,需要通过命令#mknod /dev/demo c 254 0来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。
二、实验原理
驱动程序
目的:驱动程序是应用程序和硬件之间的一个软件层,为(许多个)应用程序提供硬件的所有功能。为了处理并发的情况,还需要考虑互斥量和锁等机制。
特点:应用程序一般有一个 main 函数,从头到尾执行一个任务;驱动程序却不同,它没有main函数,通过使用宏module_init(初始化函数名)。
用法:将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。驱动程序中有一个宏moudule_exit(退出处理函数名)注册退出处理函数。它在驱动退出时被调用。
三、实验过程与结果
1.配置实验箱
配置实验环境、连接arm开发板、建立超级终端、启动实验平台、修改windows xp系统的ip使得它与arm机的ip在同一网段、在red hat中安装arm编译器、配置环境变量
2.进入01_demo文件夹中,尝试直接make进行自动编译。出现错误。
3.发现错误后,修改01_demo文件夹中的Makefile
KERNELDIR = /usr/src/linux
KERNELDIR = /arm2410cl/ kernel/linux-2.4.18-2410cl/
INCLUDEDIR = $(KERNELDIR)/include
CROSS_COMPILE=armv41-unknown-linux-
AS =$(CROSS_COMPILE)as
LD =$(CROSS_COMPILE)ld
CC =$(CROSS_COMPILE)gcc
CPP =$(CC) -E
AR =$(CROSS_COMPILE)ar
NM =$(CROSS_COMPILE)nm
STRIP =$(CROSS_COMPILE)strip
OBJCOPY =$(CROSS_COMPILE)objcopy
OBJDUMP =$(CROSS_COMPILE)objdump
CFLAGS += -I..
CFLAGS += -Wall -O -D__KERNEL__ -DMODULE -I$(INCLUDEDIR)
TARGET = demo
OBJS = demo.o hello.o
SRC = demo.c hello.c
all: $(OBJS)
demo.o: demo.c
$(CC) -c $(CFLAGS) $^ -o $@
hello.o:hello.c
$(CC) -c $(CFLAGS) $^ -o $@
install:
install -d $(INSTALLDIR)
install -c $(TARGET).o $(INSTALLDIR)
clean:
rm -f *.o *~ core .depend
四、实验截图
五、实验总结
在这次实验中,一开始出现了error127的错误,折腾了好久,发现是makefile文件中一个字母错了,是“linux-2.4.18-2410cl”,不是“linux-2.4.18-2410c1”,“l”和“1”在清晰度不高的屏幕上真的很容易搞错,修改过后最终取得了成功。实验过程中感激武钰和蔡野同学的帮助。