linux字符设备驱动课程设计报告

linux字符设备驱动课程设计报告
linux字符设备驱动课程设计报告

一、课程设计目的

Linux 系统的开源性使其在嵌入式系统的开发中得到了越来越广泛的应用,但其本身并没有对种类繁多的硬件设备都提供现成的驱动程序,特别是由于工程应用中的灵活性,其驱动程序更是难以统一,这时就需开发一套适合于自己产品的设备驱动。对用户而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以像对其它文件一样对此设备文件进行操作。

通过这次课程设计可以了解linux的模块机制,懂得如何加载模块和卸载模块,进一步熟悉模块的相关操作。加深对驱动程序定义和设计的了解,了解linux驱动的编写过程,提高自己的动手能力。

二、课程设计内容与要求

字符设备驱动程序

1、设计目的:掌握设备驱动程序的编写、编译和装载、卸载方法,了解设备文件的创建,并知道如何编写测试程序测试自己的驱动程序是否能够正常工作

2、设计要求:

1) 编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I\O控制与释放五个基本操作。

2) 编写一个测试程序,测试字符设备驱动程序的正确性。

3) 要求在实验报告中列出Linux内核的版本与内核模块加载过程。

三、系统分析与设计

1、系统分析

系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:

1、对设备初始化和释放;

2、把数据从内核传送到硬件和从硬件读取数据;

3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据;

4、检测和处理设备出现的错误。

字符设备提供给应用程序的是一个流控制接口,主要包括op e n、clo s e(或r ele as e)、r e ad、w r i t e、i o c t l、p o l l和m m a p等。在系统中添加一个字符设备驱动程序,实际上就是给上述操作添加对应的代码。对于字符设备和块设备,L i n u x内核对这些操作进行了统一的抽象,把它们定义在结构体fi le_operations中。

2、系统设计:

2.1、模块设计:

2.2数据结构说明

字符设备驱动主要应用了三种数据结构:①file_operations结构,这是设备驱动程序所提供的一组用一个结构向系统进行说明的入口点;②file结构,主要用于与文件系统对应的设备驱动程序。代表一个打开的文件,它由内核在open时创建,并传递给在该文件上进行操作的所有函数,直到碰到最后的close函数。在文件的所有实例都被关闭之后,内核会释放这个数据结构;③ inode结构,提供了关于特殊设备文件/dev/mydev的信息。

各个结构的定义如下:

(1)file_operations结构:

static const struct file_operations my_fops ={

.owner = THIS_MODULE,

.llseek = my_llseek,

.read = my_read,

.write = my_write,

.open = my_open,

.release = my_release,

.unlocked_ioctl = ioctl,

};

(2)file结构:

1)读

static ssize_t my_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)

2)写

static ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)

3)seek文件定位

static loff_t my_llseek(struct file *filp, loff_t offset, int whence)

4)I\O控制

static int ioctl (struct file *file, unsigned int cmd, unsigned long arg)

(3)inode结构:

1)打开

int my_open(struct inode *inode, struct file *filp) 2)释放

int my_release(struct inode *inode, struct file *filp) 2.3、算法流程图:

四、系统测试与调试分析

4.1 系统测试

4.1.1启动超级管理员模式并输入密码命令:sudo su

4.1.2对源程序进行编译

命令:make

4.1.3加载驱动程序并查看

命令:insmod lydev.ko和lsmod

4.1.4显示主设备号

命令:cat /proc/devices 4.1.5创建节点并查看

命令:mknod /dev/lydev 55 0和cd /dev

4.1.6编译测试程序

命令:gcc –o t test.c

4.1.7运行测试函数

命令:./t

4.1.8进行打开设备操作

命令:1

4.1.9进行写操作并输入hello 命令:2

4.1.10进行读操作

命令:3

4.1.11进行I/O控制

命令:4 4.1.12进行释放设备操作命令:5

4.1.13进行退出操作

命令:6

4.1.14卸载驱动程序

命令:rmmod lydev

4.1.15查看日志

命令:dmesg

4.1.16删除节点并查看

命令:rm lydev和ls

4.2调试分析

最开始的时候没有启用sudo模式,导致很多命令不能执行,启用模式的时候需要输入密码,但是输入密码的时候是不显示东西的以为出错,查阅资料之后才知道是应有的现象。

程序测试一遍之后再次测试很多命令不能执行,原因是第一次测试之后产生的各种文件没有删除,再次测试会显示已存在。

有一次测试程序,不能卸载驱动,用lsmod查看有两个进程使用,后来强制关机才能正常使用,原因不明,以后要加强学习。

五、程序清单

1.主程序

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "lydev.h"

#define SCULL_IOC_MAGIC 'k' #define SCULL_IOCRESET

_IO(SCULL_IOC_MAGIC, 0)

#define SCULL_IOCSQUANTUM

_IOW(SCULL_IOC_MAGIC, 1, int) #define SCULL_IOCSQSET

_IOW(SCULL_IOC_MAGIC, 2, int) #define SCULL_IOCTQUANTUM

_IO(SCULL_IOC_MAGIC, 3)

#define SCULL_IOCTQSET

_IO(SCULL_IOC_MAGIC, 4)

#define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, int)

#define SCULL_IOCGQSET

_IOR(SCULL_IOC_MAGIC, 6, int)

#define SCULL_IOCQQUANTUM

_IO(SCULL_IOC_MAGIC, 7)

#define SCULL_IOCQQSET

_IO(SCULL_IOC_MAGIC, 8)

#define SCULL_IOCXQUANTUM

_IOWR(SCULL_IOC_MAGIC, 9, int)

#define SCULL_IOCXQSET

_IOWR(SCULL_IOC_MAGIC,10, int)

#define SCULL_IOCHQUANTUM

_IO(SCULL_IOC_MAGIC, 11)

#define SCULL_IOCHQSET

_IO(SCULL_IOC_MAGIC, 12)

#define SCULL_IOC_MAXNR 14

static int ly_major = 55;

module_param(ly_major, int, S_IRUGO); struct ly_dev *ly_devp; /*设备结构体指针*/

struct cdev cdev;

static int ioctl (struct file *file, unsigned int cmd, unsigned long arg); /*文件打开函数*/

int ly_open(struct inode *inode,

struct

file *filp)

{

struct ly_dev *dev;

/*获取次设备号*/

int num = MINOR(inode->i_rdev); if (num >= MYDEV_NR_DEVS)

return -ENODEV;

dev = &ly_devp[num];

/*将设备描述结构指针赋值给文件私有数据指针*/

filp->private_data = dev;

return 0;

}

/*文件释放函数*/

int ly_release(struct inode *inode, struct file *filp)

{

return 0;

}

/*读函数*/

static ssize_t ly_read(struct file

*filp, char __user *buf, size_t size, loff_t *ppos)

{

unsigned long p = *ppos;

unsigned int count = size;

int ret = 0;

struct ly_dev *dev =

filp->private_data; /*获得设备结构体指针*/

/*判断读位置是否有效*/

if (p >= MYDEV_SIZE)

return 0;

if (count > MYDEV_SIZE - p)

count = MYDEV_SIZE - p;

/*读数据到用户空间*/

if (copy_to_user(buf,

(void*)(dev->data + p), count))

{

ret = - EFAULT;

}

else

{

*ppos += count; ret = count;

printk(KERN_INFO "read %d bytes(s) from %lx\n", count, p);

}

return ret;

}

/*写函数*/

static ssize_t ly_write(struct file

*filp, const char __user *buf, size_t size, loff_t *ppos)

{

unsigned long p = *ppos;

unsigned int count = size;

int ret = 0;

struct ly_dev *dev =

filp->private_data; /*获得设备结构体指针*/

/*分析和获取有效的写长度*/

if (p >= MYDEV_SIZE)

return 0;

if (count > MYDEV_SIZE - p)

count = MYDEV_SIZE - p;

/*从用户空间写入数据*/

if (copy_from_user(dev->data + p, buf, count))

ret = - EFAULT;

else

{

*ppos += count;

ret = count;

printk(KERN_INFO "written %d

bytes(s) from %lx\n", count, p);

}

return ret;

}

/*I\O控制函数*/

static int ioctl (struct file *file, unsigned int cmd, unsigned long arg) {

if(_IOC_TYPE(cmd)!=SCULL_IOC_MAGI C)

{

return -EFAULT;

}

if(_IOC_NR(cmd)>SCULL_IOC_MAXNR)

{

return -EFAULT;

}

switch(cmd)

{

case SCULL_IOCRESET:

printk("SCULL_IOCRESET

+ %lx",arg);

break;

case SCULL_IOCSQUANTUM: /* Set: arg points to the value */

printk("SCULL_IOCSQUANTUM

+ %lx",arg);

break;

case SCULL_IOCTQUANTUM: /* Tell: arg is the value */

printk("SCULL_IOCTQUANTUM

+ %lx",arg);

break;

case SCULL_IOCGQUANTUM: /* Get: arg is pointer to result */

printk("SCULL_IOCGQUANTUM

+ %lx",arg);

break;

case SCULL_IOCQQUANTUM: /* Query: return it (it's positive) */

printk("SCULL_IOCQQUANTUM

+ %lx",arg);

break;

case SCULL_IOCXQUANTUM: /* eXchange: use arg as pointer */

printk("SCULL_IOCXQUANTUM

+ %lx",arg);

break;

case SCULL_IOCHQUANTUM: /* sHift: like Tell + Query */

printk("SCULL_IOCHQUANTUM

+ %lx",arg);

break;

}

return 0; }

/* seek文件定位函数 */

static loff_t ly_llseek(struct file

*filp, loff_t offset, int whence)

{

loff_t newpos;

switch(whence) {

case 0: /* SEEK_SET */

newpos = offset;

break;

case 1: /* SEEK_CUR */

newpos = filp->f_pos + offset; break;

case 2: /* SEEK_END */

newpos = MYDEV_SIZE -1 + offset; break;

default: /* can't happen */

return -EINVAL;

}

if ((newpos<0) ||

(newpos>MYDEV_SIZE))

return -EINVAL;

filp->f_pos = newpos;

return newpos;

}

/*文件操作结构体*/

static const struct file_operations

ly_fops =

{

.owner = THIS_MODULE,

.llseek = ly_llseek,

.read = ly_read,

.write = ly_write,

.open = ly_open,

.release = ly_release,

.unlocked_ioctl = ioctl,

};

/*设备驱动模块加载函数*/

static int lydev_init(void)

{

int result;

int i;

dev_t devno = MKDEV(ly_major, 0);

/* 静态申请设备号*/

if (ly_major)

result =

register_chrdev_region(devno, 2, "lydev");

else /* 动态分配设备号 */

{

result =

alloc_chrdev_region(&devno, 0, 2, "lydev");

ly_major = MAJOR(devno); }

if (result < 0)

return result;

/*初始化cdev结构*/

cdev_init(&cdev, &ly_fops);

cdev.owner = THIS_MODULE;

cdev.ops = &ly_fops;

/* 注册字符设备 */

cdev_add(&cdev, MKDEV(ly_major, 0), MYDEV_NR_DEVS);

/* 为设备描述结构分配内存*/

ly_devp = kmalloc(MYDEV_NR_DEVS * sizeof(struct ly_dev), GFP_KERNEL); if (!ly_devp) /*申请失败*/

{

result = - ENOMEM;

goto fail_malloc;

}

memset(ly_devp, 0, sizeof(struct

ly_dev));

/*为设备分配内存*/

for (i=0; i < MYDEV_NR_DEVS; i++) {

ly_devp[i].size = MYDEV_SIZE; ly_devp[i].data =

kmalloc(MYDEV_SIZE, GFP_KERNEL);

memset(ly_devp[i].data, 0, MYDEV_SIZE);

} printk("模块加载成功!\n");

return 0;

fail_malloc:

unregister_chrdev_region(devno, 1); return result;

}

/*模块卸载函数*/

static void lydev_exit(void)

{

cdev_del(&cdev); /*注销设备*/

kfree(ly_devp); /*释放设备结构体内存*/

unregister_chrdev_region(MKDEV(ly_maj or, 0), 2); /*释放设备号*/

printk("模块卸载成功!\n");

}

MODULE_LICENSE("GPL");

module_init(lydev_init);

module_exit(lydev_exit);

2.测试程序

#include

#include

#include

#include

#include

#include

#include

#include

#define MAXBUF 20

#define SCULL_IOC_MAGIC 'k' #define SCULL_IOCRESET

_IO(SCULL_IOC_MAGIC, 0)

#define SCULL_IOCSQUANTUM

_IOW(SCULL_IOC_MAGIC, 1, int) #define SCULL_IOCSQSET

_IOW(SCULL_IOC_MAGIC, 2, int) #define SCULL_IOCTQUANTUM

_IO(SCULL_IOC_MAGIC, 3)

#define SCULL_IOCTQSET

_IO(SCULL_IOC_MAGIC, 4)

#define SCULL_IOCGQUANTUM

_IOR(SCULL_IOC_MAGIC, 5, int) #define SCULL_IOCGQSET

_IOR(SCULL_IOC_MAGIC, 6, int) #define SCULL_IOCQQUANTUM

_IO(SCULL_IOC_MAGIC, 7)

#define SCULL_IOCQQSET

_IO(SCULL_IOC_MAGIC, 8)

#define SCULL_IOCXQUANTUM

_IOWR(SCULL_IOC_MAGIC, 9, int)

#define SCULL_IOCXQSET

_IOWR(SCULL_IOC_MAGIC,10, int)

#define SCULL_IOCHQUANTUM

_IO(SCULL_IOC_MAGIC, 11)

#define SCULL_IOCHQSET

_IO(SCULL_IOC_MAGIC, 12)

#define SCULL_IOC_MAXNR 14

int main()

{

int testdev;

int i,flag = 1,t,len = -1;

char sel;

char buf[MAXBUF],tmp[MAXBUF];

printf("1、打开设备\n2、写操作\n3、读操作\n4、I/O控制\n5、释放设备\n6、退出\n");

while(1) {

printf("请输入要执行的操作:");

sel = getchar();

getchar();

switch(sel) {

case '1':testdev =

open("/dev/lydev",O_RDWR);

if ( testdev < 0 ) {

printf("设备打开失败 \n");

break;

}

flag = 0;

printf("设备打开成功!\n"

break;

/*case '2':if (flag) {

printf("请先打开设备!\n");

break;

}

printf("请输入写入的字符串:");

gets(tmp);

len = strlen(tmp);

printf("len = %d\n",len);

t = write(testdev,tmp,len);

if (t < 0) {

printf("写操作失败!\n");

break; }

printf("%s字符串写入成功!\n",tmp); break;

case '3':if (flag) {

printf("请先打开设备!\n");

break;

}

if (len < 0) {

printf("请先进行写操作!\n");

break;

}

t = read(testdev,buf,len);

if (t < 0) {

printf("读操作失败!\n");

break;

}

printf("读操作成功!结果为:%s\n",buf); break;*/

case '2':if (flag) {

printf("请先打开设备!\n"); continue;

}

printf("请输入要写入的字符串:"); gets(tmp);

len = sizeof(tmp);//strlen(tmp);

t = write(testdev,tmp,len);

if(t < 0) {

perror("写操作失败!\n");

exit(-1);

}

printf("字符串:%s写入成功!\n",tmp); break;

case '3':if (flag) {

printf("请先打开设备!\n"); continue;

}

lseek(testdev,0,SEEK_SET);

t = read(testdev,buf,len);

if(t < 0) {

perror("读操作失败!\n");

exit(-1);

}

printf("读操作成功!结果为:%s\n",buf); break;

case '4':if (flag) {

printf("请先打开设备!\n");

break;

}

t =

ioctl(testdev,SCULL_IOCTQUANTUM,3); if(t < 0) {

printf("IO控制失败\n");

} else {

printf("IO控制成功\n");

}

break;

case '5':if (flag) {

printf("请先打开设备!\n"); break;

}

//release(testdev);

close(testdev);

printf("设备释放成功!\n"); flag = 1;

break;

case '6':close(testdev);

exit(0);

default:printf("输入有误!\n");

break;

}

}

}

六、体会与自我评价

在这次课程设计之前从没有接触过Linux系统,Linux系统这个词作为计算机系的学生都不会陌生,多多少少也知道些它的历史,知道它是开放的免费的操作系统,支持开源软件的开发,但是,Linux系统到底是怎样的一个系统,甚至对它的界面都从未见过。这次课程设计使我接触并了解了Linux系统,见识了它的界面以及种种与Windos系统不同之处,增长了见识。

驱动相较于Linux系统是更加熟悉的一个名词,每次重装系统都要安装各种各样的驱动,不然计算机就不能正常运行,各个硬件就不能发挥作用,通过这次课程设计,对Linux系统的驱动有了比较深入的认识:。Linux下的设备驱动程序分为字符设备驱动、快设备驱动和

网络设备驱动程序。驱动程序在硬件和软件之间起纽带的作用,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都有其文件属性(c/b),表示是字符设备还块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备。

这次的课程设计提高了自己的自我学习能力和交流能力,Linux系统是以前学习从未接触到的东西,为了完成设计,需要自己查询各种资料,并且与同学交流学习心得,讨论程序运行的细节,完善自己的程序。

这次课程设计使我反省很多,无论Linux还是驱动程序都是挂在嘴边的东西,但是对于这些自己并没有进行过深入的了解,导致这次课程设计一切都要从头开始,进行的并不顺利,以后对于一些经常提起,在将来有可能用的到的东西要未雨绸缪,先做了解,将来的时候才能轻松应对,事半功倍。

七、参考文献

[1] 汤子瀛编著,《计算机操作系统(修订版)》,西安电子科技大学出版社,2001年

[2] Alessandro Rubini.Linux设备驱动程序[M].魏永明,耿兵,钟书毅,译.北京:中国电力

出版社,2006.

[3] Sreekrishnan ,《精通Linux设备驱动程序开发》,人民邮电出版社,2010年

[4]Arm Corporation.ARM920T Technical Reference Manual.2001.

[5] Atmel Corporation.AT91RM9200 datasheet.2005.

Linux 系统课程设计报告

Linux 系统课程设计报告 专业班级: 学号: 姓名: 同组成员: 2016年6月2日星期四

序论实验要求 实验目的 了解Linux内核源代码的目录结构及各目录的相关内容。 了解Linux内核各配置选项内容和作用。 掌握Linux内核配置文件的作用。 掌握Linux内核的编译过程。 掌握将新增内核代码加入到Linux内核结构中的方法。 实验指引 尽管目前Linux 2.6版本内核已经增加了很多对ARM体系甚至是S3C2440 CPU 的支持,但仍然需要对内核作一些小的修改来适应我们的开发板,并且需要重新配置、编译和重新生成新的内核映像。本实验从软硬件准备到下载到开发板等一系列连贯的操作来进行嵌入式Linux内核的移植。本实验的内核版本为2.6.29.1。 第一章Linux内核基础知识 1.1Linux版本 Linux主要的版本定义为“[主].[次].[发布].[修改]”的样式,次版本为奇数表示此版本为开发中版本,次版本为偶数表示此版本为稳定版本。 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PATCHLEVEL = 6 SUBLEVEL = 29 EXTRA VERSION = .1 其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如 2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。 1.2什么是标准内核 按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在https://www.360docs.net/doc/8f10730727.html,/维护和获取的内核,实际上它也有平台属性的。这些linux

(完整版)操作系统毕业课程设计说明书-基于Linux的模拟文件系统的设计与实现

中北大学 操作系统课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:徐春花学号: 设计题目:基于Linux的模拟文件系统的设计与实现 起迄日 期: 2014年6月14日- 2014年6月26日指导教薛海丽

师: 2014 年 6月 26 日 前言 简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 Linux不仅为用户提供了强大的操作系统功能,而且还提供了丰富的应用软件。用户不但可以从Internet上下载Linux及其源代码,而且还可以从Internet上下载许多Linux的应用程序。可以说,Linux本身包含的应用程序以及移植到Linux上的应用程序包罗万象,任何一位用户都能从有关Linux的网站上找到适合自己特殊需要的应用程序及其源代码,这样,用户就可以根据自己的需要下载源代码,以便修改和扩充操作系统或应用程序的功能。这对Windows NT、Windows98、MS-DOS或OS2

等商品化操作系统来说是无法做到的。 Linux具有:稳定、可靠、安全的优点,并且有强大的网络功能。其中有对读、 写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。在相关软 件的支持下,可实现WWW、FTP、DNS、DHCP、E-mail等服务,还可作为路由器 使用,利用IPCHAINSIPTABLE网络治理工具可构建NAT及功能全面的防火墙。 Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系 统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本编辑 器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形 用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系 统进行操作。 目录 1需求分析 (3) 1.1 功能介绍 (3) 1.2 目的及意义 (5) 1.2.1 目的 (5) 1.2.2 意义 (6) 1.3 设计成果 (7) 2总体设计 (8) 2.1功能介绍 (8) 2.2模块关联 (9) 3详细设计 (12)

Linux设备驱动程序举例

Linux设备驱动程序设计实例2007-03-03 23:09 Linux系统中,设备驱动程序是操作系统内核的重要组成部分,在与硬件设备之间 建立了标准的抽象接口。通过这个接口,用户可以像处理普通文件一样,对硬件设 备进行打开(open)、关闭(close)、读写(read/write)等操作。通过分析和设计设 备驱动程序,可以深入理解Linux系统和进行系统开发。本文通过一个简单的例子 来说明设备驱动程序的设计。 1、程序清单 //MyDev.c 2000年2月7日编写 #ifndef __KERNEL__ #define __KERNEL__//按内核模块编译 #endif #ifndef MODULE #define MODULE//设备驱动程序模块编译 #endif #define DEVICE_NAME "MyDev" #define OPENSPK 1 #define CLOSESPK 2 //必要的头文件 #include //同kernel.h,最基本的内核模块头文件 #include //同module.h,最基本的内核模块头文件 #include //这里包含了进行正确性检查的宏 #include //文件系统所必需的头文件 #include //这里包含了内核空间与用户空间进行数据交换时的函数宏 #include //I/O访问 int my_major=0; //主设备号 static int Device_Open=0; static char Message[]="This is from device driver"; char *Message_Ptr; int my_open(struct inode *inode, struct file *file) {//每当应用程序用open打开设备时,此函数被调用 printk ("\ndevice_open(%p,%p)\n", inode, file); if (Device_Open) return -EBUSY;//同时只能由一个应用程序打开 Device_Open++; MOD_INC_USE_COUNT;//设备打开期间禁止卸载 return 0; } static void my_release(struct inode *inode, struct file *file)

课程设计报告模板)

课程设计报告模板()

————————————————————————————————作者: ————————————————————————————————日期: ?

课程设计(论文)任务书 软件学院软件+电商专业09级(2)班 一、课程设计(论文)题目基本模型机设计与实现 二、课程设计(论文)工作自2011年6月 20 日起至2011年 6月 24日止。 三、课程设计(论文) 地点:计算机组成原理实验室(5#301) 四、课程设计(论文)内容要求: 1.课程设计的目的 通过课程设计的综合训练,在掌握部件单元电路实验的基础上,进一步掌握整机 概念。培养学生实际分析问题、解决问题和动手能力,最终目标是想通过课程设计的形式,帮助学生系统掌握该门课程的主要内容,更好地完成教学任务。 2.课程设计的任务及要求 1)基本要求? (1)课程设计前必须根据课程设计题目认真查阅资料; (2)实验前准备好实验程序及调试时所需的输入数据; (3)实验独立认真完成; (4)对实验结果认真记录,并进行总结和讨论。 2)课程设计论文编写要求 (1)按照书稿的规格撰写打印课设论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)正文中要有问题描述、实验原理、设计思路、实验步骤、调试过程与遇到问题的解决方法、总结和讨论等 (4)课设论文装订按学校的统一要求完成 3)课设考核 从以下几方面来考查:

(1)出勤情况和课设态度; (2)设计思路; (3)代码实现; (4)动手调试能力; (5)论文的层次性、条理性、格式的规范性。 4)参考文献 [1]王爱英.计算机组成与结构[M]. 北京:清华大学出版社, 2007. [2] 王爱英. 计算机组成与结构习题详解与实验指导[M]. 北京:清华大学出版社, 2007. 5)课程设计进度安排 内容天数地点 构思及收集资料1图书馆 实验与调试 3 实验室 撰写论文 1 图书馆 6)任务及具体要求 设计实现一个简单的模型机,该模型机包含若干条简单的计算机指令,其中至少包括输入、输出指令,存储器读写指令,寄存器访问指令,运算指令,程序控制指令。学生须根据要求自行设计出这些机器指令对应的微指令代码,并将其存放于控制存储器,并利用机器指令设计一段简单机器指令程序。将实验设备通过串口连接计算机,通过联机软件将机器指令程序和编写的微指令程序存入主存中,并运行此段程序,通过联机软件显示和观察该段程序的运行,验证编写的指令和微指令的执行情况是否符 合设计要求,并对程序运行结果的正、误分析其原因。 学生签名: 亲笔签名 2011年6月20 日 课程设计(论文)评审意见 (1)设计思路:优( )、良()、中( )、一般()、差( ); (2)代码实现:优()、良()、中()、一般()、差();

linux网络编程课设报告

《Linux网络编程》 课程设计 班级: 姓名: 指导老师:

一、设计背景 Linux操作系统作为一个开源的操作系统被越来越多的人所应用,它的好处在于操作系统源代码的公开化!只要是基于GNU公约的软件你都可以任意使用并修改它的源代码。通过这次课程设计能更好的学习网络编程知识和掌握LINUX平台上应用程序设计开发的过程,将大学四年所学知识综合运用,为未来的工作学习打下基础。 二、设计目的 1、学习epoll 跟FTP被动模式 2、掌握linux基本命令,例如ls、cd、login; 3、学会如何编译、运行 三、环境要求 1、centos 64位操作系统 2、gcc编译器 四、设计原理 4.1客户端 客户端程序的主要任务有以下3个: (1)、分析用户输入的命令。 (2)、根据命令向服务器发出请求 (3)、接受服务器返回请求的结果 客户端为用户提供了3种命令:(1)、get:从服务器下载文件(2)、list:列出客户端当前目录的内容(3)、quit离开 4.2 服务器端 (1)、分析请求代码。 (2)、根据请求代码做相应的处理 (3)、等待返回结果或者应答信息

五、软件测试结果

六、部分主代码 #include "ftserve.h" int main(int argc, char *argv[]) { int sock_listen, sock_control, port, pid; if (argc != 2) { printf("usage: ./ftserve port\n"); exit(0); } port = atoi(argv[1]); // create socket if ((sock_listen = socket_create(port)) < 0 ) { perror("Error creating socket"); exit(1); } while(1) { // wait for client request

课程设计报告【模板】

模拟电子技术课程设计报告设计题目:直流稳压电源设计 专业电子信息科学与技术 班级电信092 学号 200916022230 学生姓名夏惜 指导教师王瑞 设计时间2010-2011学年上学期 教师评分 2010年月日

昆明理工大学津桥学院模拟电子技术课程设计 目录 1.概述 (2) 1.1直流稳压电源设计目的 (2) 1.2课程设计的组成部分 (2) 2.直流稳压电源设计的内容 (4) 2.1变压电路设计 (4) 2.2整流电路设计 (4) 2.3滤波电路设计 (8) 2.4稳压电路设计 (9) 2.5总电路设计 (10) 3.总结 (12) 3.1所遇到的问题,你是怎样解决这些问题的12 3.3体会收获及建议 (12) 3.4参考资料(书、论文、网络资料) (13) 4.教师评语 (13) 5.成绩 (13)

昆明理工大学津桥学院模拟电子技术课程设计 1.概述 电源是各种电子、电器设备工作的动力,是自动化不可或缺的组成部分,直流稳压电源是应用极为广泛的一种电源。直流稳压电源是常用的电子设备,它能保证在电网电压波动或负载发生变化时,输出稳定的电压。一个低纹波、高精度的稳压源在仪器仪表、工业控制及测量领域中有着重要的实际应用价值。 直流稳压电源通常由变压器、整流电路、滤波电路、稳压控制电路所组成,具有体积小,重量轻,性能稳定可等优点,电压从零起连续可调,可串联或关联使用,直流输出纹波小,稳定度高,稳压稳流自动转换、限流式过短路保护和自动恢复功能,是大专院校、工业企业、科研单位及电子维修人员理想的直流稳压电源。适用于电子仪器设备、电器维修、实验室、电解电镀、测试、测量设备、工厂电器设备配套使用。几乎所有的电子设备都需要有稳压的电压供给,才能使其处于良好的工作状态。家用电器中的电视机、音响、电脑尤其是这样。电网电压时高时低,电子设备本身耗供电造成不稳定因家。解决这个不稳定因素的办法是在电子设备的前端进行稳压。 直流稳压电源广泛应用于国防、科研、大专院校、实验室、工矿企业、电解、电镀、充电设备等的直流供电。 1.1直流稳压电源设计目的 (1)、学习直流稳压电源的设计方法; (2)、研究直流稳压电源的设计方案; (3)、掌握直流稳压电源的稳压系数和内阻测试方法。 1.2课程设计的组成部分 1.2.1 设计原理

Linux课程设计报告

《Linux课程设计》 设计题目:shell 编程实现用户信息管理专业:软件工程 指导教师:蔡照鹏王斌斌 班级: 学号: 姓名: 同组人: 计算机科学与工程学院

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux 内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 Linux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX 和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux 继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。

EDA课程设计说明书参考格式

<>课程设计说明书 题目 院、部: 学生姓名: 指导教师:王晓丽职称助教 专业: 班级: 完成时间:

摘要(三号,黑体,居中,字间空两格字符) (空二行换行) 空4格打印摘要内容(小四号宋体,行距20)。 关键词:(摘要内容后下空一行打印“关键词”三字(小四号黑体),其后为关键词(小四号宋体),每一关键词之间用分号隔开,最后一个关键词后不打标点符号。 ABSTRACT ①居中打印“ABSTRACT”,再下空二行打印英文摘要内容。②摘要内容每段开头留四个空字符。③摘要内容后下空一行打印“Key words”,其后为关键词用小写字母,每一关键词之间用分号隔开,最后一个关键词后不打标点符号。 Key words :aaa;bbb;ccc

目录(3号,黑体,居中) (空1行,以小4号黑体设置字体及大小,行间距22、字间距标准) 1 XXXXXX………………………………………………………………………… 1.1 XXXXXX……………………………………………………………………… 1.2 XXXXXX……………………………………………………………………… ┇ 2 XXXXXX………………………………………………………………………… 2.1 XXXXXX……………………………………………………………………… 2.2 XXXXXX……………………………………………………………………… ┇ 3 4 结束语 参考文献………………………………………………………………………………. 致谢……………………………………………………………………………………附录……………………………………………………………………………………

2011180021-Linux操作系统-课程设计报告-基于Linux的进程调度模拟程序

河南中医学院 《linux操作系统》课程设计报告 题目:基于Linux的进程调度模拟程序 所在院系:信息技术学院 专业年级:2011级计算机科学与技术完成学生:2011180021 郭姗 指导教师:阮晓龙 完成日期:201X 年06 月22 日 目录 1. 课程设计题目概述3 2. 研究内容与目的4 3. 研究方法5 4. 研究报告6 5. 测试报告/实验报告7 6. 课题研究结论8 7. 总结9

1、课程设计题目概述 随着Linux系统的逐渐推广,它被越来越多的计算机用户所了解和应用. Linux是一个多任务的操作系统,也就是说,在同一个时间内,可以有多个进程同时执行。如果读者对计算机硬件体系有一定了解的话,会知道我们大家常用的单CPU计算机实际上在一个时间片断内只能执行一条指令,那么Linux是如何实现多进程同时执行的呢?原来Linux使用了一种称为"进程调度(process scheduling)"的手段,首先,为每个进程指派一定的运行时间,这个时间通常很短,短到以毫秒为单位,然后依照某种规则,从众多进程中挑选一个投入运行,其他的进程暂时等待,当正在运行的那个进程时间耗尽,或执行完毕退出,或因某种原因暂停,Linux就会重新进行调度,挑选下一个进程投入运行。因为每个进程占用的时间片都很短,在我们使用者的角度来看,就好像多个进程同时运行一样了。本文就是对进程调度进行研究、实验的。 本文首先对Linux系统进行了简要的介绍, 然后介绍了进程管理的相关理论知识。其次,又介绍最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)、先来先服务算法的相关知识,并对进程调度进行最高优先数优先的调度算法和先来先服务算法模拟实验,并对比分析两种算法的优缺点,从而加深对进程概念和进程调度过程/算法的理解 设计目的:在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择某一进程占用处理机。使得系统中的进程能够有条不紊的运行,同时提高处理机的利用率以及系统的性能。所以设计模拟进程调度算法(最高优先数优先的调度算法、先来先服务算法),以巩固和加深处理进程的概念,并且分析这两种算法的优缺点。关键词:linux 进程调度调度算法

linux设备驱动中常用函数

Linux2.6设备驱动常用的接口函数(一) ----字符设备 刚开始,学习linux驱动,觉得linux驱动很难,有字符设备,块设备,网络设备,针对每一种设备其接口函数,驱动的架构都不一样。这么多函数,要每一个的熟悉,那可多难啦!可后来发现linux驱动有很多规律可循,驱动的基本框架都差不多,再就是一些通用的模块。 基本的架构里包括:加载,卸载,常用的读写,打开,关闭,这是那种那基本的咯。利用这些基本的功能,当然无法实现一个系统。比方说:当多个执行单元对资源进行访问时,会引发竞态;当执行单元获取不到资源时,它是阻塞还是非阻塞?当突然间来了中断,该怎么办?还有内存管理,异步通知。而linux 针对这些问题提供了一系列的接口函数和模板框架。这样,在实际驱动设计中,根据具体的要求,选择不同的模块来实现其功能需求。 觉得能熟练理解,运用这些函数,是写号linux设备驱动的第一步。因为是设备驱动,是与最底层的设备打交道,就必须要熟悉底层设备的一些特性,例如字符设备,块设备等。系统提供的接口函数,功能模块就像是工具,能够根据不同的底层设备的的一些特性,选择不同的工具,方能在linux驱动中游刃有余。 最后就是调试,这可是最头疼的事。在调试过程中,总会遇到这样,那样的问题。怎样能更快,更好的发现并解决这些问题,就是一个人的道行咯!我个人觉得: 发现问题比解决问题更难! 时好时坏的东西,最纠结! 看得见的错误比看不见的错误好解决! 一:Fops结构体中函数: ①ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 用来从设备中获取数据. 在这个位置的一个空指针导致 read 系统调用以-EINVAL("Invalid argument") 失败. 一个非负返回值代表了成功读取的字节数( 返回值是一个 "signed size" 类型, 常常是目标平台本地的整数类型). ②ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 发送数据给设备. 如果 NULL, -EINVAL 返回给调用 write 系统调用的程序. 如果非负, 返回值代表成功写的字节数 ③loff_t (*llseek) (struct file *, loff_t, int); llseek 方法用作改变文件中的当前读/写位置, 并且新位置作为(正的)返回值. loff_t 参数是一个"long offset", 并且就算在 32位平台上也至少 64 位宽. 错误由一个负返回值指示. 如果这个函数指针是 NULL, seek 调用会以潜在地无法预知的方式修改 file 结构中的位置计数器( 在"file 结构" 一节中描述). ④int (*open) (struct inode *, struct file *);

课程设计报告撰写规范

.课程设计报告撰写规范

————————————————————————————————作者:————————————————————————————————日期: 2

江西理工大学应用科学学院信息工程系 课程设计规范 (试行) 信息工程系 二○一○年六月

第1章内容要求 第1章内容要求 课程设计报告由以下几个部分组成组成,依次为: I、统一的封面,封面之后为课设评分表及答辩记录表; II、摘要; III、目录; IV、课程设计总结报告正文; V、总结(本课题核心内容、特点和方案的优缺点、改进方向和意见)VI、按统一格式列出主要参考文献。 1

第2章格式要求 第2章格式要求 课程设计报告每部分从新的一页开始,各部分要求如下: 2.1封面 统一的封面(含课程设计课题名称、专业、班级、姓名、学号、指导教师等,详见第五部分“格式范例”) 2.2摘要 应概括地反映出本课程设计的主要内容,包括工作目的、实验研究方法、研究成果和结论,重点是本论文的主要工作。摘要力求语言精炼准确,建议500字以内。摘要中不要出现图片、图表、表格或其他插图材料。 关键词是为了便于作文献索引和检索工作而从论文中选取出来用以表示全文主题内容信息的单词或术语。 关键词在摘要内容后另起一行标明,一般3~5个,之间用“;”分开。 2.3 目录 目录由标题名称和页码组成,包括:正文(含结论)的一级、二级和三级标题和序号。具体格式见第五部分“格式范例”。 2.4 符号说明 如果课程设计报告中使用了大量的物理量符号、标志、缩略词、专门计量单位、自定义名词和术语等,应将全文中常用的这些符号及意义列出。如果上述符号和缩略词使用数量不多,可以不设专门的主要符号表,但在报告中出现时须加以说明。缩略词应列出中英文全称。 2

Linux课程设计报告

《Linux课程设计》 设计题目: shell 编程实现用户信息管理专业:软件工程 指导教师:蔡照鹏王斌斌 班级: 学号: 姓名: 同组人: 计算机科学与工程学院

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux核。Linux可安装在各种计算机硬件设备中。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux核,但实际上人们已经习惯了用Linux来形容整个基于Linux核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于天才程序员林纳斯·托瓦兹。 Linux操作系统是UNIX操作系统的一种克隆系统,它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet 网络,并通过全世界各地计算机爱好者的共同努力,已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的制约的、全世界都能自由使用的Unix兼容产品。

Linux课程设计

Linux课程设计---编写proc文件系统相关的内核模块 学号:20085229 姓名:杜森 班级:08级网络一班 指导教师:于群 日期:2011年6月29号

一、背景知识: 1、内核模块。 操作系统采用两种体系结构:微内核(Micro kernel),最常用的功能模块被设计成内核模式运行的一个或一组进程,而其它大部分不十分重要的功能模块都作为单独的进程在用户模式下运行!单内核(Monolithic kernel,有时也叫宏内核Macro kernel)!内核一般作为一个大进程的方式存在。该进程内部又可以被分为若干模块,在运行的时候,它是一个独立的二进制映象为了弥补单一体系结构的这一缺陷,Linux操作系统使用了模块机制。用户可以根据需要,在不需要对内核重新编译的情况下,模块可以动态地载入内核或从内核中移出!如图所示,模块可通过 insmod命令插入内核,也可以通过rmmod命令从内核中删除。 2、进程管理 Linux的每一个进程都有自己的属性,用一个task struct数据结构表示,即进程控制块Ⅲ(Process Concrol Block,PCB)。它对进程在其生命周期内涉及的所有事件进行全面的描述,主要有进程标识符(PID)、进程状态信息、进程调度信息、进程所占的内存区域、相关文件的文件描述符、处理器环境信息、信号处理、Linux操作系统内核分析与研究资源安排、同步处理等几个方面。在一个系统中,通常可拥有数百个甚至数千个进程,相应地就有很多进程控 制块。为了有效地对它们加以管理,应该用适当地方式将这些进程控制块组织起来。 进程控制块数据结构主要域定义如下: task_struct结构:在linux/sched.h中 struct task_struct{ volatile long state; //系统进程状态,一共有五种状态: //0 可运行态 //1 可中断的等待态 //2 不可中断的等待态 //3 僵死态

linux字符设备驱动课程设计报告

一、课程设计目的 Linux 系统的开源性使其在嵌入式系统的开发中得到了越来越广泛的应用,但其本身并没有对种类繁多的硬件设备都提供现成的驱动程序,特别是由于工程应用中的灵活性,其驱动程序更是难以统一,这时就需开发一套适合于自己产品的设备驱动。对用户而言,设备驱动程序隐藏了设备的具体细节,对各种不同设备提供了一致的接口,一般来说是把设备映射为一个特殊的设备文件,用户程序可以像对其它文件一样对此设备文件进行操作。 通过这次课程设计可以了解linux的模块机制,懂得如何加载模块和卸载模块,进一步熟悉模块的相关操作。加深对驱动程序定义和设计的了解,了解linux驱动的编写过程,提高自己的动手能力。 二、课程设计内容与要求 字符设备驱动程序 1、设计目的:掌握设备驱动程序的编写、编译和装载、卸载方法,了解设备文件的创建,并知道如何编写测试程序测试自己的驱动程序是否能够正常工作 2、设计要求: 1) 编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、I\O控制与释放五个基本操作。 2) 编写一个测试程序,测试字符设备驱动程序的正确性。 3) 要求在实验报告中列出Linux内核的版本与内核模块加载过程。 三、系统分析与设计 1、系统分析 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1、对设备初始化和释放; 2、把数据从内核传送到硬件和从硬件读取数据; 3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4、检测和处理设备出现的错误。 字符设备提供给应用程序的是一个流控制接口,主要包括op e n、clo s e(或r ele as e)、r e ad、w r i t e、i o c t l、p o l l和m m a p等。在系统中添加一个字符设备驱动程序,实际上就是给上述操作添加对应的代码。对于字符设备和块设备,L i n u x内核对这些操作进行了统一的抽象,把它们定义在结构体fi le_operations中。 2、系统设计: 、模块设计:

课程设计报告书正文标准格式

课 程 设 计 报 告 书 专 用 纸 1 引言(或绪论)(可作为正文第1章标题,用小3号黑体,加粗, 并留出上下间距为:段前0.5行,段后0.5行) ×××××××××(小4号宋体,20磅行距)××××××××××××××××××××××××××××××………… 1.1 ××××××(作为正文2级标题,用4号黑体,加粗) ×××××××××(小4号宋体,20磅行距)×××××××××××××××××××××××××××××××………… 1.1.1 ××××(作为正文3级标题,用小4号黑体,不加粗) ×××××××××(小4号宋体,20磅行距)×××××××××××××××××××××××××××………… 2 ×××××××(作为正文第2章标题,用小3号黑体,加粗, 并留出上下间距为:段前0.5行,段后0.5行) ×××××××××(小4号宋体,20磅行距)×××××××××××××××××××××××××××××××××××………… ×××××××××××××××××××………… ………… 注:1.正文中表格与插图的字体一律用5号宋体; 2.正文各页的格式请以此页为标准复制。 请留出一个汉字的空间,下同

报告中的内容仅为参考字体格式,与本次设计无关! 题目 内部排序教学软件。 1需求分析和说明 内部排序教学软件的总体目标:在TURBO C2.0 的开发环境下,利用所学C语言和数据结构的相关知识,开发一个具有良好人机界面的内部排序教学软件,实现各种内部排序,并能使用户通过其显示结果对每种排序方法的性能有一个直观的了解,从而达到教学的目的。 1.1基本要求 (1)界面友好,易与操作。采用菜单或其它人机对话方式进行选择。 (2)实现各种内部排序。包括冒泡排序,直接插入排序,直接选择排序,希尔排序,快速排序,堆排序。 (3)待排序的元素的关键字为整数。可用随机数据和用户输入数据作测试比较。比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换以3次计)。 (4)演示程序以人机对话的形式进行。每次测试完毕显示各种比较指标 的列表,以便比较各种排序的优劣。 1.2各功能模块的功能描述: 1.主函数模块 本模块的主要功能是初始化图形界面,调用各模块,实现软件功能。 2.排序功能及输出子模块 本模块的主要功能是根据用户的选择进行数组的创建,并对输入数据或者随机产生的数据使用六种排序方法进行排序并统计每种方法的移动次数和比较次数,然后输出以表格形式输出。 3.封面和结束画面子模块 本模块的主要功能是当用户打开本软件时模拟软件加载,延时数秒后关闭,并进入图形界面,在用户退出软件时显示结束画面,延时数秒后关闭程序。 4.图形界面子模块 本模块的主要功能是根据用户的选择显示不同的画面,引导用户使用软件所提供的各种功能,并在用户提供必要数据,并选择排序功能时调用排序模块,并显示结果画面。 5.输入子模块 本模块的主要功能是进行光标定位,输出提示文字,并对用户输入数据进行处理,创建数组。 6.鼠标实现模块 本模块的主要功能是为用户提供鼠标操作支持,使用户能使用鼠标进行功能的选择。2详细设计

Linux设计报告

广西大学计算机与电子信息学院 课程设计报告 ( 2015——2016年度第一学期) 名称: UNIX程序设计课程设计 题目: UNIX程序设计课程设计 院系:计算机与电子信息学院 班级:计科132班 学号: 58 学生姓名:郭江达 指导教师:葛志辉 设计周数: 2周 成绩: 日期: 2015年 12月 27日

目录 1. 设计任务 (1) 2. 设计步骤 (1) 开发环境配置 (1) 开发工具 (2) 3. 程序开发步骤 (4) 4. 遇到的问题及相应解决办法 (12) 5. 个人体会及建议 (13) 参考文献 (13)

1. 设计任务 设计题目、任务及完成情况的大致说明,让老师能够了解你所做工作的大体情况。(每个人都要独立完成下面三个题目,不要相互抄袭!切记!) 1、完成Linux下的shell编程,要利用shell编程实现某一个具体的功能。 2、完成Linux下的C语言编程,要求至少包括两个文件,比如一个,,中包含了中的声明,分别利用gcc和makefile进行编译。 3、完成Linux下PHP+MySQL的编程,能够完成一个简单的具有数据库存储功能的网站。 2. 设计步骤 开发环境配置 Shell编程的开发环境 Shell编程的开发环境不需要什么配置,只需在Linux系统的终端进行即可。 C语言编程的开发环境 C语言在Linux系统下编程,需要dev安装包,用于编译C语言。 在终端下输入“sudo apt-get install libc6-dev”进行下载,在下载之前需要输入登录密码,之前已经下载好了,如下图所示:

下载好后,系统会自动安装,安装完成便可在终端编译C语言程序了。 Linux下PHP+MySQL编程的开发环境 这是在ubuntu上搭建LAMP,需要安装“php5”,“mysql”,“apache2”和“phpmyadmin”,如下图所示: 开发工具 VMware Workstation 12 虚拟机 VMware Workstation 12 虚拟机简介:著名的虚拟机软件。不需要分区或重开机就能在同一台PC上使用两种以上的操作系统,完全隔离并且保护不同OS的操作环境以及所有安装在OS上面的应用软件和资料,不同的OS之间还能互动操作,包括网络、周边、文件分享以及复制贴上功能等。 安装方法: 1.下载虚拟机可执行文件点击运行,按照安装教程安装即可。 使用方法: 打开虚拟机,在“文件”菜单中选择“新建虚拟机”,然后弹出“新建虚拟机

课程设计报告书写规范

郑州工业应用技术学院 课程设计报告科目: 题目: 姓名: 院(系): 专业班级: 学号: 指导教师: 成绩: 时间:年月日至年月日

课程设计报告的格式 一、课程设计报告内容 课程设计报告一般由以下几部分组成:A.任务书; B.目录; C.正文; D.参考文献;E.附录。 课程设计题目 摘要(200~300字) 目录 1.概述 包括课程设计选题、项目背景、课程设计报告编写目的、课程设计报告的组织等内容。 2.课程设计任务的需求分析 2.1任务描述 2.2需求描述的规范文档(要画出DFD数据流图和DD(数据字典)) 3.概念结构设计 3.1概念结构设计工具(E-R模型) 3.2XXX子系统(局部) 3.2.1子系统描述 3.2.2分E-R图 3.2.3说明 3.3YYY子系统 3.3.1子系统描述 3.3.2 分E-R图 3.3.3 说明 …… 3.X 总体E-R图 3.X.1 E-R图的集成 3.X.2 总体E-R图 4.逻辑结构设计(参考教材P16图1-10逻辑结构设计步骤) 4.1关系数据模式 4.2优化 5.数据库物理设计与实施(至少包含前4节) 5.1数据库应用的硬件、软件环境介绍 5.2表结构设计 5.3索引的设计

5.4视图设计 5.5 存储过程 5.6 触发器 5.7 游标 5.8建立数据库 5.9 建立表 5.9 加载数据库测试数据 6.数据操作 6.1数据查询操作 6.2数据更新操作 6.3数据维护操作 6.4其他 7.数据库应用系统的实现 8.设计心得体会 9.参考文献 二、书写要求 1.层次标题 层次标题要简短明确,同一层次的标题应尽可能“排比”,词(或词组)类型相同(或相近),意义相关,语气一致。 各层次标题一律用阿拉伯数字连续编号;不同层次的数字之间用英文输入状态下小圆点“.”相隔,末位数字后面不加点号,如“1”,“2.1”,“3.1.2”等;各层次的序号均左顶格起排,编号与标题或文字间空一个汉字的间隙。段的文字空两个汉字起排,回行时顶格排。 报告正文撰写的题序层次格式 2.篇眉和页码 篇眉从摘要开始,内容与该部分的一级标题相同。 页码从正文开始按阿拉伯数字(1,2,3……)连续编排,之前的部分(中文摘要、目录等)用大写罗马数字(Ⅰ,Ⅱ,Ⅲ……)单独编排,均居中排列。 3.有关图、表、表达式 (1)图

Linux应用开发课程设计报告

Linux应用开发课程设计报告 项目名称贪吃蛇 学号: 姓名:张浩 专业:软件工程专业 班级:14软工软设1班 指导教师:郭俊颖 南阳理工学院软件学院 2016年12月

一需求分析 1.问题描述 ①蛇与食物出现的位置; ②蛇的游动; ③怎样实现蛇撞到自身会死; ④怎样判断蛇撞到墙; 2基本要求 实现蛇在不断吃到食物后分数增加,实现蛇的游动。 3.需实现的主要功能 ①蛇与食物不能出现在一起; ②蛇撞到自身以及墙都会死; ③蛇吃到事物后,长度增加同时分数增加一 ⑤随着分数的增加,关卡难度增加 4.设计实现方案 将蛇头的坐标以及蛇身的坐标都用二维数组表示出来,规定第一个下标为0则代表蛇头,为i则为蛇身,第二个下标为0代表横坐标,为1代表纵坐标,foodx代表食物横坐标,foody代表食物纵坐标,当蛇头坐标与事物坐标相等时则表示蛇吃到了事物,长度加一。方向变化为:当向上走时,横坐标不变,纵坐标减减;向下走时,横坐标不变,纵坐标加加;向左走时纵坐标不变,横坐标--;向右走时纵坐标不变,横坐标++。 2系统设计

分功能描述和设计流程图 当用户打开贪吃蛇时,进入主界面,主界面有开始及退出两个选项,当用户点击开始时,进入第二个界面(游戏界面),左侧为游戏界面,右上方显示分数与等级,当用户控制蛇吃到事物时分数会增加,当分数增加到5,15,20时,等级会提升。右下方为上下左右开始返回键,用户可以控制上下左右来操控蛇的游动方向,当用户点击开始时游戏则开始,当用户点击返回时,则退回到主界面。 。设计流程图如图2-1所示: 2-1 设计流程图 3系统实现 贪吃蛇的界面和代码

Linux设备驱动程序简介

第一章Linux设备驱动程序简介 Linux Kernel 系统架构图 一、驱动程序的特点 ?是应用和硬件设备之间的一个软件层。 ?这个软件层一般在内核中实现 ?设备驱动程序的作用在于提供机制,而不是提供策略,编写访问硬件的内核代码时不要给用户强加任何策略 o机制:驱动程序能实现什么功能。 o策略:用户如何使用这些功能。 二、设备驱动分类和内核模块 ?设备驱动类型。Linux 系统将设备驱动分成三种类型 o字符设备 o块设备 o网络设备 ?内核模块:内核模块是内核提供的一种可以动态加载功能单元来扩展内核功能的机制,类似于软件中的插件机制。这种功能单元叫内核模块。 ?通常为每个驱动创建一个不同的模块,而不在一个模块中实现多个设备驱动,从而实现良好的伸缩性和扩展性。 三、字符设备 ?字符设备是个能够象字节流<比如文件)一样访问的设备,由字符设备驱动程序来实现这种特性。通过/dev下的字符设备文件来访问。字符设备驱动程序通常至少需要实现 open、close、read 和 write 等系统调用 所对应的对该硬件进行操作的功能函数。 ?应用程序调用system call<系统调用),例如:read、write,将会导致操作系统执行上层功能组件的代码,这些代码会处理内核的一些内部 事务,为操作硬件做好准备,然后就会调用驱动程序中实现的对硬件进 行物理操作的函数,从而完成对硬件的驱动,然后返回操作系统上层功 能组件的代码,做好内核内部的善后事务,最后返回应用程序。 ?由于应用程序必须使用/dev目录下的设备文件<参见open调用的第1个参数),所以该设备文件必须事先创建。谁创建设备文件呢? ?大多数字符设备是个只能顺序访问的数据通道,不能前后移动访问指针,这点和文件不同。比如串口驱动,只能顺序的读写设备。然而,也 存在和数据区或者文件特性类似的字符设备,访问它们时可前后移动访

毕业课程设计报告数字秒表的设计

(此文档为word格式,下载后您可任意编辑修改!) 目录 1 引言 (1) 1.1 课程设计的目的 (1) 1.2 课程设计的内容 (1) 2 EDA、VHDL简介 (1) 2.1 EDA技术 (1) 2.2 硬件描述语言——VHDL (2) 3设计过程 (4) 3.1 设计规划 (4) 3.2 各模块的原理及其程序 (4) 3.2.1控制模块 (5) 3.2.2时基分频模块 (5) 3.2.3计时模块 (6) 3.2.4显示模块 (7) 4系统仿真 (9) 结束语 (13) 致谢 (14) 参考文献 (15) 附录 (16)

1 引言 在科技高度发展的今天,集成电路和计算机应用得到了高速发展。尤其是计算机应用的发展。它在人们日常生活已逐渐崭露头角。大多数电子产品多是由计算机电路组成,如:手机、mp3等。而且将来的不久他们的身影将会更频繁的出现在我们身边。各种家用电器多会实现微电脑技术。电脑各部分在工作时多是一时间为基准的。本文就是基于计算机电路的时钟脉冲信号、状态控制等原理设计出的数字秒表。秒表在很多领域充当一个重要的角色。在各种比赛中对秒表的精确度要求很高,尤其是一些科学实验。他们对时间精确度达到了几纳秒级别。 1.1 课程设计的目的 本次设计的目的就是在掌握EDA实验开发系统的初步使用基础上,了解EDA技术,对计算机系统中时钟控制系统进一步了解,掌握状态机工作原理,同时了解计算机时钟脉冲是怎么产生和工作的。在掌握所学的计算机组成与结构课程理论知识时。通过对数字秒表的设计,进行理论与实际的结合,提高与计算机有关设计能力,提高分析、解决计算机技术实际问题的能力。通过课程设计深入理解计算机结构与控制实现的技术,达到课程设计的目标。 1.2 课程设计的内容 利用VHDL语言设计基于计算机电路中时钟脉冲原理的数字秒表。该数字秒表能对0秒~59分59.99秒范围进行计时,显示最长时间是59分59秒。计时精度达到10ms。设计了复位开关和启停开关。复位开关可以在任何情况下使用,使用以后计时器清零,并做好下一次计时的准备。 2 EDA、VHDL简介 2.1 EDA技术 EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD通用软件包,它根据硬件描述语言HDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目

相关文档
最新文档