北京电子科技学院(BESTI)

实 验 报 告


封面

课程:信息安全系统设计基础                                           班级:1352                                   姓名:(按贡献大小排名)李行之 刘蔚然

学号:(按贡献大小排名)20135211 20135216                 成绩:                    指导教师:娄嘉鹏                     实验日期:2015.12.1

实验密级:                       预习程度:                  实验时间:15:30—17:30                 仪器组次:11                  必修/选修:必修

实验序号:4                  实验名称: 外设驱动程序设计

实验目的与要求:  1.在掌握基于 S3C2410 的 linux 开发环境的配置和使用的基础上进行交叉编译。  2.理解驱动程序的一般设计方法。 3.(要求)正确使用连接线等实验仪器,并注意保护实验箱。实验结束之后将实验箱送回。

实验仪器: - (名称)          (型号)                (数量)

- 嵌入式开发平台 UP-NETARM2410-CL 1

- PC机                                                      1

正文(个人理解部分由【】标出)

一、实验内容:

(同实验一)本次实验建立在掌握嵌入式开发平台使用方法和配置方法的基础上,要求使用windows xp,linux(red hat),arm三个系统(即NFS方式);在linux系统中安装arm系统,然后对01_demo文件夹中的.c文件进行交叉编译。

二、实验原理

  1. 什么是驱动程序?

    • 目的:驱动程序是应用程序和硬件之间的一个软件层,为(许多个)应用程序提供硬件的所有功能。为了处理并发的情况,还需要考虑互斥量和锁等机制。
    • 特点:应用程序一般有一个 main 函数,从头到尾执行一个任务;驱动程序却不同,它没有main函数,通过使用宏module_init(初始化函数名)。
    • 用法:将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待被应用软件调用。驱动程序中有一个宏moudule_exit(退出处理函数名)注册退出处理函数。它在驱动退出时被调用。
  2. 主要代码

test_demo.c

    #include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>//其中定义了很多宏和诸如open,close函数
#include <unistd.h>
#include <sys/ioctl.h>//ioctl函数的头文件 void showbuf(char *buf);
int MAX_LEN=32; int main()
{
int fd;
int i;
char buf[255]; for(i=0; i<MAX_LEN; i++){//给数组元素依次赋值
buf[i]=i;
} fd=open("/dev/demo",O_RDWR);//以既可以读又可以写的方式打开文件
if(fd < 0){
printf("####DEMO device open fail####\n");
return (-1);
}
printf("write %d bytes data to /dev/demo \n",MAX_LEN);
showbuf(buf);//先显示一下要写入什么,然后写入
write(fd,buf,MAX_LEN); printf("Read %d bytes data from /dev/demo \n",MAX_LEN);
read(fd,buf,MAX_LEN);
showbuf(buf);//先读出来字符串到buf中,再显示 ioctl(fd,1,NULL);
ioctl(fd,4,NULL);
close(fd);
return 0; } void showbuf(char *buf)
{
int i,j=0;
for(i=0;i<MAX_LEN;i++){
if(i%4 ==0)
printf("\n%4d: ",j++);
printf("%4d ",buf[i]);
}
printf("\n*****************************************************\n");
}

这段代码很简单,然而会出现一个疑问:write函数、read函数在哪里定义的?ioctl函数优势做什么的?于是我接下来查看了实验指导书的原理部分和demo.c代码。

其实,上面这段代码中出现的函数都在demo.c代码中有了定义。比如,ioctl函数的定义(严格说来,驱动程序里定义的是方法):

static int demo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
printk("ioctl runing\n");
switch(cmd){
case 1:printk("runing command 1 \n");break;
case 2:printk("runing command 2 \n");break;
default:
printk("error cmd number\n");break;
}
return 0;
}

ioctl 方法主要用于对设备进行读写之外的其他控制,比如配置设备、进入或退出某种 操作模式,这些操作一般都无法通过read/write 文件操作来完成。

三、实验过程&困难排查

1.配置实验箱

  • 同实验一中一样,配置实验环境

    • 连接arm开发板;
    • 建立超级终端;
    • 启动实验平台;
    • 修改windows xp系统的ip使得它与arm机的ip在同一网段;
    • 在red hat中安装arm编译器;
    • 配置环境变量。

2.进入01_demo文件夹中,尝试直接make进行自动编译。出现如下图所示的错误。

(图1)

按照指导书的提示,进行如下操作建立linux连接:

cd /usr/src/
ln -sf linux-2.4.20-8 linux
ls
(结果)debug linux linux-2.4 linux-2.4.20-8 redhat

然而,仍然出现上图的错误。

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

(图2)

4.再次进行make之后,系统不再提示错误。然而少了最后对于testdemo.c的编译。于是,我们进行了手动编译。最后执行./testdemo,结果如下:

(图4)

四、总结

我们在实验四上花费了比预计更多的时间。事后总结,主要是对Makefile的更改“不彻底”。一旦严格按照指导书中的内容更改了Makefile,就可以顺利地完成编译。

信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然的更多相关文章

  1. 信息安全系统设计基础实验四 20135210&20135218

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础          班级:   1352 姓名:程涵,姬梦馨 学号:20135210,20135218 ...

  2. 20135203齐岳信息安全系统设计基础——实验四&实验五实验报告

    见20135217孙小博的博客:http://www.cnblogs.com/sunxiaobo/p/4991861.html

  3. 20145215&20145307信息安全系统设计基础实验报告

    20145215&20145307信息安全系统设计基础实验报告 PART1 一.实验原理 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统 ...

  4. 20145220&20145209&20145309信息安全系统设计基础实验报告(5)

    20145220&20145209&20145309信息安全系统设计基础实验报告(5) 实验报告链接: http://www.cnblogs.com/zym0728/p/6132249 ...

  5. 20145220&20145209&20145309信息安全系统设计基础实验报告(3)

    20145220&20145209&20145309信息安全系统设计基础实验报告(3) 实验报告链接: http://www.cnblogs.com/zym0728/p/6132243 ...

  6. 20145220&20145209&20145309信息安全系统设计基础实验报告(4)

    20145220&20145209&20145309信息安全系统设计基础实验报告(4) 实验报告链接: http://www.cnblogs.com/zym0728/p/6132246 ...

  7. 20145220&20145209&20145309信息安全系统设计基础实验报告(2)

    20145220&20145209&20145309信息安全系统设计基础实验报告(2) 实验报告链接: http://www.cnblogs.com/zym0728/p/6083664 ...

  8. 20145316&20145229实验四:驱动程序设计

    20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...

  9. 信息安全系统设计基础第四次实验报告20135324&&20135330

    课程:信息安全系统设计基础 班级:1353 姓名:杨舒雯 张若嘉 学号:20135324,20135330 实验日期:2015.11.17 15:30-17:30 实验名称:外设驱动程序设计 实验目的 ...

随机推荐

  1. Extjs 控件属性(部分)

    Ext.form.TimeField: 配置项: maxValue:列表中允许的最大时间 maxText:当时间大于最大值时的错误提示信息 minValue:列表中允许的最小时间 minText:当时 ...

  2. x-forwarded-for的深度挖掘

    转自:http://www.cnblogs.com/yihang/archive/2010/12/19/1910365.html 如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有 ...

  3. redis的简单安装配置

    一.简介 Redis是一种高级key-value数据库,数据可以持久化,支持的数据类型很丰富,有字符串,哈希,链表,集合和有序集合5种数据类型 Redis支持在服务器端计算集合的并,交和补集(diff ...

  4. Sharepoint-Hosted App in 2013资料

    一个完整的流程,可参考网址 My First Sharepoint-Hosted App in 2013 部署第一个APP会遇到各种问题,可以参考网址 App development in Share ...

  5. LeetCode 2 Add Two Sum 解题报告

    LeetCode 2 Add Two Sum 解题报告 LeetCode第二题 Add Two Sum 首先我们看题目要求: You are given two linked lists repres ...

  6. 【Android Demo】加载.gif格式图片

    Android系统为了节省内存,一般不支持直接显示gif图片,即使你强制设置了,也只会显示图片的第一帧. 这个 Demo 是在网上看到的,是个思路,还是有些局限性,还是记录下,以后研究吧. 1.效果图 ...

  7. 【Android Demo】通过WebService获取今日天气情况

    因为本身是在搞.NET方面的东东,现在在学习Android,所以想实现Android通过WebService接口来获取数据,网上很多例子还有有问题的.参考:Android 通过WebService进行 ...

  8. POJ 3321 Apple Tree

    树状数组. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cm ...

  9. Android外部SD卡的读取

    package com.kevin.writeorreadfile1_1; import android.app.Activity; import android.bluetooth.le.ScanF ...

  10. 使用clone( )和Cloneable接口

    由Object类定义的绝大部分方法在本书其他部分讨论.而一个特别值得关注的方法是clone( ).clone( )方法创建调用它的对象的一个复制副本.只有那些实现Cloneable接口的类能被复制. ...