哪个嵌入式软件开发薪资学校好呢?最好课程设计的合理点。

只是为了个人学习,存取资料所用。同时也方便他人的学习
数据库课程设计-----------学生选课管理系统的设计
由于时间关系,里面许多图片都已经变形或错位
课程设计(学年论文)
题目:学生选课管理系统的设计与实现
计算机科学技术系
计算机科学与技术
二零一三 年 六月 三十 日
课程设计(学年论文)任务书
(指导教师用表)
学 生 姓 名
指 导 教 师
学生选课管理系统的设计和实现
各阶段任务
指导教师签字:
系(院)负责人签字:
课程设计(学年论文)成绩评定表
系(院):
学生选课管理系统的设计与实现
指导教师评语
指导教师(签名):
需求分析... 6
需求分析... 6
分析阶段... 6
任务概述... 7
运行环境... 7
软件配置:
1.2 任务概述... 8
运行环境... 8
数据流图... 8
数据字典... 9
概念结构设计... 11
概念结构... 11
学生选课管理系统概念结构设计... 11
系统E-R图... 12
实体及属性的定义... 12
逻辑结构设计... 13
逻辑结构设计... 13
初始关系模式... 14
规范化处理... 14
物理结构设计... 14
索引表... 15
角色... 15
视图... 16
数据库的实施... 17
用SQL语言建数据库和表代码如下:... 17
数据的载入... 19
数据库的修改操作... 19
数据库的删除操作... 20
应用程序的调试... 20
数据库系统运行与维护... 20
数据库的维护... 20
维护... 20
检测并改善数据库性能... 21
重新组织和构造数据库... 21
前台C#设计的用户界面... 22
结论与体会... 29
科学技术的进步和生产的发展使人类知识总量的增长不断加快,生产社会化趋势的扩大和社会对产品需求的多样性使得组织在营运活动中所涉及的内部和外部信息量迅速地膨胀起来。面对激烈的市场竞争,人们对这些信息进行收集、加工、传递等过程的时间性和准确性提出了更高的要求。这一切使得传统的手工作业为基础的信息系统陷入了机构日益庞大,效率日益降低的困境。电子计算机的出现为摆脱这种困境找到了出路。计算机用于管理信息处理的突出优点是迅速、准确、可靠、具有很大的存储能力,适应于管理信息量大、面宽的特点,适合于管理信息处理及时、准确的要求。
管理信息系统(MIS,Management Information System)是一个由人和计算机等组成的能够提供信息以支持一个组织机构内部的作业、管理、分析和决策职能的系统。管理信息系统利用计算机的硬件和软件,手工规程、分析、计划、控制和决策用的模型,以及数据库对信息进行收集、传输、加工、保存和使用。因此,管理信息系统是一个信息处理系统。
数据库作为存取数据并对数据进行操作的工具在系统中所起到的作用至关重要。数据库设计是指对于一个给定的应用环境,构造优化的数据库逻辑模式和物理模式结果,并据此建立数据库及其应用系统,使之能有效地存储和管理数据,满足应用需求,包括信息管理要求和数据操作。信息管理要求是指在数据库中应该存储和管理哪些数据对象;数据操作要求是指对数据对象进行哪些操作,如查询、增、删、改、统计等操作。数据库设计地目标是维用户和各种应用系统提供的一个信息基础设施和高效率地运行环境。高效率的运行环境包括:数据库数据的存取速率、数据库存储空间的利用率、数据库系统运行管理的效率等都是高的。
为了使数据库的应用系统开发设计合理、规范、有序、正确、高效进行,现在广泛采用的是工程化6阶段开发设计过程与方法,它们是需求分析阶段、概念结构设计阶段、逻辑结构设计阶段、物理结构设计阶段、数据库实施、数据库系统运行与维护阶段。我按照以上几点开发了学生选课管理系统数据库。
就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。SQL 的优点在于它集数据查询、数据操纵、数据定义和数据控制功能于一体。
通过调查本地的学校,根据学校的具体情况设计学生选课信息管理系统。主要功能有:
1. 学生管理:学生信息查询、插入、删除、修改等
2. 选课管理:选课信息查询、插入、删除、修改等
3.成绩管理:成绩的查询。
4. 系统管理:操作员信息的管理
5. 系统维护:如数据安全管理(含备份与恢复)、操作员管理、权限设置等
1.1.1 分析阶段
本文主要以计算机和网络通信技术为基础,以一门计算机基础课程为实例,研究和探讨了怎样合理地组织和管理教学内容,并且能应用于实际教学之中,以期能达到教师组织教学内容方便、实施网络教学方便以及学生能利用计算机网络进行自主学习的目的。
经过分析,我使用Microsoft公司的MicrosoftVisual Studio 2008开发工具,将.net技术与数据库SQL server相结合进行设计。首先,在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。系统可基本实现选课信息和学生信息的录入、修改、删除等功能,扩充的功能包括与成绩相关的信息处理。同时,可根据学校教学管理制度,设定或自定义审核操作的规则。系统其他方面的需求有:安全保密性、可恢复性、可扩充性、可维护性等。
本高校管理系统的应用对象定位在普通大学,因此在进行需求分析时主要考虑高等大学的具体需求,并将设计目标确定为普通大学提供基本的高校管理功能。
1.2.2运行环境
服务器配置包括硬件配置和软件配置,它们各自都有详细的要求,下面将分别进行介绍.
1、服务器端配置
(1)、硬件配置
安装本软件之前,需要确保计算机具有如下配置,这也是最低硬件要求:
233兆赫(MHZ)Pentium或更高的微处理器(或与之相当的处理器)
使用256内存(RAM最小为64MB,最大为4GB)
不小于40MB的可用硬盘空间
(2)、软件配置
安装本软件之前,需要确保计算机已安装:MicorsoftWindows XP及以上的操作系统.
2、客户端配置
本软件开发所需要的硬件配置和软件配置分别介绍如下:
硬件配置:1台奔腾级别电脑
1.2 任务概述
本高校管理系统的应用对象定位在普通大学,因此在进行需求分析时主要考虑高等大学的具体需求,并将设计目标确定为普通大学提供基本的高校管理功能。
1.2.2运行环境
服务器配置包括硬件配置和软件配置,它们各自都有详细的要求,下面将分别进行介绍.
1、服务器端配置
(1)、硬件配置
安装本软件之前,需要确保计算机具有如下配置,这也是最低硬件要求:
233兆赫(MHZ)Pentium或更高的微处理器(或与之相当的处理器)
使用256内存(RAM最小为64MB,最大为4GB)
不小于40MB的可用硬盘空间
(2)、软件配置
安装本软件之前,需要确保计算机已安装:MicorsoftWindows XP及以上的操作系统.
2、客户端配置
本软件开发所需要的硬件配置和软件配置分别介绍如下:
硬件配置:1台奔腾级别电脑
软件配置:MicrosoftVisual Studio 2008
数据流图(1)
数据流图表达了数据与处理的关系,数据流图作为直观了解系统运行机理的手段,并没有具体描述个类数据的细节,只有通过数据字典进一步细化才能对系统的需求得到具体而确切的了解。数据字典用来说明数据流图中出现的所有元素的详细定义和描述,包括数据流、加工处理、数据存储、数据的起点和终点或外部实体等。
数据字典包括的项目有数据项、数据结构、数据流、数据存储、加工逻辑和外部实体。可使用一些符号来表示数据结构、数据流和数据存储的组成。
smalldatetime
管理员姓名
(1)学号={学号,唯一标识学生,类型:char,长度:9,与课程号唯一标识这门课成绩}。
概念结构设计
在需求分析阶段所得到的应用需求应该首先抽象为信息世界的结构,才能更好地、更准确地用某一DBMS实现这些需求。
概念结构主要特点:
(1) 能真是、充分地反映显示世界,包括事物和事物之间的联系,能满足用户对数据的处理要求,是对现实世界的一个只是模型;
(2) 易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库设计成功的关键。
(3) 易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充;
(4)易于向关系、网状、层次等各种数据模型转换;
概念结构时各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定。
学生选课管理系统概念结构设计
现在对所设计系统的需求作进一步的分析,产生概念结构设计的E-R模型。由于这个系统并不复杂,因此可采用自顶向下的设计方法。自顶向下设计的关键是确定系统的核心活动。所谓核心活动就是系统中的其他活动都要围绕这个活动展开,或与此活动密切相关。确定了核心活动之后,系统就有了可扩展的余地。
2.2.1 系统E-R图
实体及属性的定义
表2-1 学生信息表Student的表结构
SmallDatetime
表2-2 课程信息表Course的表结构
表2-3 选课成绩表SC的表结构
表2-4 管理员表Admin的表结构
操作员编号
Admin_name
操作员姓名
Permission
逻辑结构设计
逻辑结构设计
概念结构设计所得的E-R模型是对用户需求的一种抽象的表达形式,它独立于任何一种具体的数据模型,因而也不能为任何一个具体的DBMS所支持。为了能够建立起最终的物理系统,还需要将概念结构进一步转化为某一DBMS所支持的数据模型,然后根据逻辑设计的准则、数据的语义约束、规范化理论等对数据模型进行适当的调整和优化,形成合理的全局逻辑结构,并设计出用户子模式这
就是数据库逻辑设计所要完成的任务。
数据库逻辑结构的设计分为两个步骤:首先将概念设计所得的E-R图转换为
关系模型;然后对关系模型进行优化,如下图所示:
图4.1 逻辑结构设计过程
关系模型是由一组关系(二维表)的结合,而E-R模型则是由实体、实体的属性、实体间的关系三个要素组成。所以要将E-R模型转换为关系模型,就是将实体、属性和联系都要转换为相应的关系模型。
初始关系模式
Student(Sno,Sname,Ssex,Ssage,Sdept)
其中各项含义分别为:学生(学号,姓名,性别,年龄,所在系)
Course(Cno,Cname,Cpno,Credit)
其中各项含义分别为:课程(课程代码,课程名称,先修课程,学分)
SC(Sno,Cno,Grade)
其中各项含义分别为:选修(学号,课程代码,成绩)
Admin(Amin_id,Admin_name, Permission)
其中各项含义分别为:操作员(操作员编号,操作员姓名,权限)
规范化处理
经过对初始关系模式的规范化处理以下关系模式中不存在部分函数依赖和传递函数依赖,已经达到3NF。(下划线代表主码,斜体外码)
Student(Sno,Sname,Ssex,Ssage,Sdept)
Course(Cno,Cname,Cpno,Credit)
SC(Sno,Cno,Grade)
Admin(Admin_id,Admin_name,Permission)
物理结构设计
数据库在物理上的存储结构与存储方法称为数据库的物理结构,它依赖于选定的数据库管理系统。为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程,就是物理结构设计。
数据库的物理结构设计通常分为两步:
(1)确定数据库的物理结构,在关系数据库中主要指存取方法和存储结构;
(2)对物理结构进行评价,评价的中的是时间和空间效率。
表2-5 学生信息表Student的表索引表
SmallDatetime
表2-6 课程信息表Course的索引表
表2-7 选课成绩表SC的索引表
表2-8 操作员表Admin的索引表
Admin_name
Permission
建立了管理员角色
图2.5 角色
用SQL管理工具建立常用的一个视图,即学生_成绩视图。
菜单栏中单击工具→ 向导→ 数据库→ 创建视图向导,选择你所要建的试图的对象,选择列名,按照提示,最后单击完成即可。
使用SQL语句建立视图的命令如下:
ps(此处本该数据表建成以后再创建视图,为啦清楚表达物理结构设计所以提前)
create view 学生_成绩
select sc.sno,sname,course.cno,cname,grade
from student
join sc on student.sno= sc.sno
join course on course.cno=sc.cno
数据库的实施
数据库物理设计完成之后,需要用RDBMS提供的数据定义语言和其他使用程序将数据库逻辑设计和物理设计结果严格描述出来,成为DBMS可以接受的源代码,在经调试产生目标文件。
用SQL语言建数据库和表代码如下:
学生选课信息管理系统数据库代码如下:
Create database 学生选课管理系统
(Name=mydatabase1,
Filename='d:\数据库\mydatabase.mdf',
Maxsize=10,
Filegrowth=1),
(Name=mydatabase2,
Filename='d:\数据库\mydatabase.ndf',
Maxsize=15,
Filegrowth=2)
(Name=mydatabase_log,
Filename='d:\数据库\mydatabase_log.ldf',
Maxsize=10,
Filegrowth=1)
学生选课信息管理系统数据表代码如下:
create table Student(
Sno char(9)primary
Sname char
Sex char(2)check
(sex in('男','女')),
Sbirth smalldatetime,
Sdept char(20)
create table Course(
Cno char(3)primary
Cname char(40)not
Credit Decimal(3,1)
create table SC(
Sno char(9)references Student(Sno),
Cno char(4)references Course(Cno),
Grade decimal(5,1),
constraint pk
primary key(Sno,Cno)
create table Admin(
Admin_id char(9)primary
Admin_name char(12)not
Permission char(20)default
数据的载入
INTO &表名&[(&属性列1&[,&属性列2&…)]
VALUES(&常量1&[,&常量2&]);
以学生表为例插入输入如下:PS(学号是主码,故不可以相同)
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('','李勇','男','20','CS');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('','刘晨','女','19','CS');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('','王敏','女','18','MA');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
values('','张立','男','19','IS');
insert into Student(Sno,Sname,Ssex,Sage,Sdept)
数据库的修改操作
UPDATE &表名&
SET&列名&=&表达式&
[WHERE&条件&];
例如:在学生表中修改学号为’’的所在系为’IS’。
update student
set sdept='IS'
where sno=''
数据库的删除操作
FROM&表名&
[WHERE&条件&];
例如:删除学号为’’的相关信息
from student
where sno=''
应用程序的调试
系统操作运行演示:为了使数据库的设计过程更加完整一些,这点专门拿到后面的一章前台界面的开发中去描述。
数据库的运行和应用程序的调试都将在第七章中进行演示。
数据库的维护
在数据库运行阶段,对数据库经常性的维护工作主要是有DBA完成,它包括:
数据库的转储和恢复
数据库的安全性和完整性控制
数据库性能的监督、分析和改造
数据库的重组织与重构造
6.1.1 维护
数据库既是共享的资源,又要进行适当的保密。DBA必须对数据库安全性和完整性控制负起责任。尤其在计算机网络普遍引应用的今天,保证数据安全、防止黑客攻击、防止病毒入侵等,都是DBA所需要面对的。按照设计阶段提供的安全防范和故障恢复规范,DBA要经常检查系统的安全是否受到侵犯,根据用户的实际需要授予用户不同的操作权限。数据库在运行过程中,由于应用环境发生变化,对安全性的要求可能发生变化,DBA要根据实际情况及时调整相应的授权和密码,以保证数据库的安全性。同样数据库的完整性约束条件也可能会随应用环境的改变而改变,这时DBA也要对其进行调整,以满足用户的要求。
6.1.2检测并改善数据库性能
目前许多DBMS产品都提供了检测系统性能参数的工具,DBA可以利用系统提供的这些工具,经常对数据库的存储空间及响应时间进行分析评价;结合用户的反映情况确定改进措施;及时改正运行中发现的错误;按用户的要求对数据库的现有功能进行适当的扩充。但要注意在增加新功能时应保证原有功能和性能不受损害。
6.1.3重新组织和构造数据库
数据库建立后,除了数据本身是动态变化外,随着应用环境的变化,数据库本身也必须变化以适应应用要求。
数据库运行一段时间后,由于记录在不断增加、删除和修改,会改变数据库的物理存储结构,使数据库的物理特性受到破坏,从而降低数据库存储空间的利用率和数据的存取效率,使数据库的性能下降。因此,需要对数据库进行重新组织,即重新安排数据的存储位置,回收垃圾,减少指针链,改进数据库的响应时间和空间利用率,提高系统性能。这与操作系统对“磁盘碎片”的处理的概念相似。数据库的重组只是使数据库的物理存储结构发生变化,而数据库的逻辑结构不变,所以根据数据库的三级模式,可以知道数据库重组对系统功能没有影响,只是为了提高系统的性能。
由此可知,数据库的重组并不会改变原设计的数据逻辑结构和物理结构,而数据库的重构造则不同,它部分修改原数据库的模式或内模式,这主要是因为数据库的应用环境发生了变化,如需求变化、设计调整等。例如增加新的数据项、改变数据类型、改变数据库的容量、增加或删除索引、修改完整性约束等。
DBMS一般都提供了重新组织和构造数据库的应用程序,以帮助DBA完成数据库的重组和重构工作。
只要数据库系统在运行,就需要不断地进行修改、调整和维护。一旦应用变化太大,数据库重新组织和构造也无济于事,这就表明数据库应用系统的生命周期结束,应该建立新系统,重新设计数据库。从头开始数据库设计工作,标准着一个新的数据库应用系统生命周期的开始。
C#设计的用户界面
用户登录界面如下:
系统主界面如下:
学生管理界面如下:此界面具有增删改查功能。具体演示以选课信息为例
选课信息界面设计:
连接数据库和添加课程de代码如下:
void button1_Click(object sender,
EventArgs e)
{string s =
"server=.;database=学生选课管理系统;integrated security=";
SqlConnection conn =new
SqlConnection();
conn.ConnectionString =
SqlCommand cmd =
new SqlCommand();
string sql =
string.Format("insert into Course (Cno,Cname,Cpno,Ccredit) values('{0}','{1}','{2}','{3}')",textBox1.Text,textBox2.Text,textBox3.Text,textBox4.Text);
cmd.CommandText =
cmd.Connection =
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
MessageBox.Show("添加成功!");
删除课程:
void button1_Click(object sender,
EventArgs e)
DialogResult r =
MessageBox.Show("你确实要删除吗?","提示",
MessageBoxButtons.YesNo);
DialogResult.No) return;
string s =
"server=.;database=学生选课管理系统;integrated security=";
SqlConnection conn =new
SqlConnection();
conn.ConnectionString =
SqlCommand cmd =
new SqlCommand();
sql = string.Format("delete from Course where Cno='{0}'", textBox1.Text);
cmd.CommandText =
cmd.Connection =
conn.Open();
int n = cmd.ExecuteNonQuery();
conn.Close();
MessageBox.Show("删除" + n +"条数据");
删除代码如下:
修改课程信息:
查找课程:
课表显示:
成绩查询:
由于代码太多,就不一一附上啦。更多的信息操作功能与源代码的实现可查看源项目。
结论与体会
在我做课程设计时,将书本上所学的知识尽可能地发挥到了实践中。经过需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施及数据库运营与维护6大阶段,我制作并运营成功了一个的以SQLSERVER 2005数据库为后台、以Microsoft Visual Studio 2008所制作的应用程序为前台。
通过这次设计,我受益非浅,亲身体验了数据库设计的全过程,在实践中了解了数据库系统设计的步骤、流程以及思路,增长了在数据库设计方面的见识,我深刻认识到以前所学的基础课程的重要性,也使我们掌握了很多新知识,特别是一些课本之外的知识,体会到了理论知识和实践相结合的重要性。
学生选课系统设计
数据库课程设计
数据库课程设计 - Flow Blog
没有更多推荐了,新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
题目:设计和实现一个虚拟命名管道(FIFO)的字符设备。我们知道,管道是进程间通信的一种
方式:一个进程向管道中写数据,另一个进程从管道中读取数据,先写入的数据先读出。我
们的驱动程序要实现N(N=4)个管道,每个管道对应两个设备,次设备号是偶数的设备是只
写设备,次设备号是奇数的是只读设备。写入设备i(i是偶数)的字符可以从设备i+1读出。
这样,我们一共就需要2N 个次设备号。
我们的目标是写一个模块化的字符设备驱动程序。设备所使用的主设备号可以从尚未分
配的主设备号中任选一个,/Documentation/devices.txt 记录了当前版本内核的主设备号分配
情况。如果设备文件系统(devfs)尚未激活,我们在加载模块之后,还必须用mknod 命令创
建相应的设备文件节点。
如果 FIFO 的写入端尚未打开,FIFO 中就不会有数据可读,所以此时试图从FIFO 中读
取数据的进程应该返回一个错误码。如果写入端已经打开,为了保证对临界区的互斥访问,
调用读操作的进程必须被阻塞。如果存在被阻塞的读者,在写操作完成后(或者关闭一个写
设备时)必须唤醒它。
如果写入的数据太多,超出了缓冲区中空闲块的大小,调用写操作的进程必须睡眠,以
等待缓冲区中有新的空闲块。
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
#ifndef& &__KERNEL__& &&&
#define& &__KERNEL__
#ifndef& &MODULE
#define& &MODULE
#define& &__NO__VERSION__
#include& &&linux/config.h&
#include& &&linux/module.h&
#include& &&linux/kernel.h&
#include& &&linux/slab.h&
#include& &&linux/fs.h&
#include& &&linux/proc_fs.h&
#include& &&linux/errno.h&
#include& &&linux/types.h&
#include& &&linux/fcntl.h&
#include& &&linux/init.h&
#include& &&linux/poll.h&
#include& &&asm/uaccess.h&
#include& &&asm/system.h&
#ifndef& &VFIFO_MAJOR
#define& &VFIFO_MAJOR& &&&241
#ifndef& &VFIFO_NR_DEVS
#define& &VFIFO_NR_DEVS& &&&4
#ifndef& &VFIFO_BUFFER
#define& &VFIFO_BUFFER& &4000
#include& &&linux/devfs_fs_kernel.h&
devfs_handle_t& &vfifo_devfs_
int& &vfifo_major=VFIFO_MAJOR;
int& &vfifo_nr_devs=VFIFO_NR_DEVS;
int& &vfifo_buffer=VFIFO_BUFFER;
MODULE_PARM(vfifo_major, &i &);
MODULE_PARM(vfifo_nr_devs, &i &);
MODULE_PARM(vfifo_buffer, &i &);
MODULE_AUTHOR( &CODEPRIMER &);
typedef& &struct& &Vfifo_Dev{
wait_queue_head_t& &rdq,& && && &//& &rdq表示堵塞读的等待队列,wrq是堵塞写的等待队列
char& &*& && && && && && && && && && & //所分配缓冲区的起始地址
unsigned& &int& && &&&//是缓冲区的大小
unsigned& &int& && && && && && && && &//表示管道中已有数据块的长度
unsigned& &int& && & & && && &&&//应该读取得缓冲区位置相对于base的偏移量
unsigned& &int& &readers,& &
//表示VFIFO设备当前的读者个数和写着个数
struct& &semaphore& && && && && && && & //用于互斥的访问的信号量
devfs_handle_t& &r_handle,w_& &//用于保存设备文件系统的注册句柄,前者表示只读设备,后者表示同一管道的只写设备
struct& &Vfifo_Dev& &*vfifo_
char& &vfifoname[8];
static& &int& &vfifo_open(struct& &inode& &*inode,struct& &file& &*filp)
Vfifo_Dev& &*
int& &num=MINOR(inode-& i_rdev);
if(!filp-& private_data)
if& &(num& =vfifo_nr_devs*2)& & & &
return& &-ENODEV;
dev=&vfifo_devices[num/2];
filp-& private_data=
}else{& & & &
dev=filp-& private_
if& &(down_interruptible(&dev-& sem))
return& &-ERESTARTSYS;
if(!dev-& base){
dev-& base=kmalloc(vfifo_buffer,GFP_KERNEL);
if(!dev-& base){& & & &
up(&dev-& sem);
return& &-ENOMEM;& & & &
dev-& buffersize=vfifo_
dev-& len=dev-& start=0;
if(filp-& f_mode& &&& &FMODE_READ)& & & & //****
dev-& readers++;
if(filp-& f_mode& &&& &FMODE_WRITE)& & & & dev-& writers++;& &&&//****
filp-& private_data=& && && && && &&&
MOD_INC_USE_COUNT;
up(&dev-& sem);
return& &0;
static& &int& &vfifo_release(struct& &inode& &*inode,struct& &file& &*filp)
Vfifo_Dev& &*dev=filp-& private_
down(&dev-& sem);
if(filp-& f_mode&FMODE_READ)
dev-& readers--;
if(filp-& f_mode&FMODE_WRITE){
dev-& writers--;& & & &
wake_up_interruptible(&dev-& sem.wait);
if((dev-& readers+dev-& writers==0)&&(dev-& len==0)){& & & &
kfree(dev-& base);
dev-& base=NULL;
up(&dev-& sem);
MOD_DEC_USE_COUNT;
return& &0;
static& &ssize_t& &vfifo_read(struct& &file& &*filp,char& &*buf,size_t& &count,loff_t& &*f_pos)
Vfifo_Dev& &*dev=filp-& private_
ssize_t& &read=0;
if(f_pos!=&filp-& f_pos)& && & //****
return& &-ESPIPE;
if(down_interruptible(&dev-& sem))
return& &-ERESTARTSYS;
do_more_read:
while(dev-& len==0){
if(!dev-& writers){
& && && && && && && && &up(&dev-& sem);& & & &
& && && && && && && && &return& &-EAGAIN;
up(&dev-& sem);
& && && && && & if(filp-& f_flags&O_NONBLOCK)
return& &-EAGAIN;& & & &
& & printk( &%s& &reading:going& &to& &sleep\n &,current-& comm);
if(wait_event_interruptible(dev-& rdq,(dev-& len& 0)))
return& &-ERESTARTSYS;
printk( &%s& &has& &been& &waken& &up\n &,current-& comm);
if(down_interruptible(&dev-& sem))
return& &-ERESTARTSYS;& & & & }
while(count& 0&&dev-& len){
char& &*pipebuf=dev-& base+dev-&
& && && && &&&ssize_t& &chars=dev-& buffersize-dev-&
if(chars& count)& &chars=
if(chars& dev-& len)& &chars=dev-&
if(copy_to_user(buf,pipebuf,chars)){
up(&dev-& sem);
return& &-EFAULT;
dev-& start+=
dev-& start%=dev-&
dev-& len-=
&&if& &(!dev-& len)& &dev-& start=0;
& && && && && & if(count& &&&& &dev-& writers& &&&& &!(filp-& f_flags& &&& &O_NONBLOCK)){& && && && && &//****
up(&dev-& sem);
wake_up_interruptible(&dev-& wrq);
if(down_interruptible(&dev-& sem))
return& &-ERESTARTSYS;
goto& &do_more_
up(&dev-& sem);
wake_up_interruptible(&dev-& wrq);
& && && && && & printk( &%s& &did& &read& &%d& &bytes\n &,current-& comm,& &read);& && && &//****
static& &ssize_t& &vfifo_write(struct& &file& &*filp,const& &char& &*buf,size_t& &count,loff_t& &*f_pos)
Vfifo_Dev& &*dev=filp-& private_
ssize_t& &written=0;
if(f_pos!=&filp-& f_pos||count==0)
return& &-ESPIPE;
if(down_interruptible(&dev-& sem))
return& &-ERESTARTSYS;
do_more_write:
while(dev-& len==dev-& buffersize){
up(&dev-& sem);
if(filp-& f_flags&O_NONBLOCK)
return& &-EAGAIN;
printk( &%s& &writting:going& &to& &sleep\n &,current-& comm);& & & &
if(wait_event_interruptible(dev-& wrq,(dev-& len &dev-& buffersize)))
return& &-ERESTARTSYS;
printk( &%s& &has& &been& &waken& &up\n &,current-& comm);
if(down_interruptible(&dev-& sem))
return& &-ERESTARTSYS;
while(count& 0){
char& &*pipebuf=
& && && && && & dev-& base+(dev-& len+dev-& start)%dev-&
ssize_t& &chars=dev-& buffersize-(dev-& len+dev-& start);
if(chars &0)& &chars+=dev-&
if(chars!=0)& &{
if& &(chars& count)& &chars=& & & &
if& &(copy_from_user(pipebuf,buf,chars)){
up(&dev-& sem);
return& &-EFAULT;
dev-& len+=
if& &(count&&!(filp-& f_flags&O_NONBLOCK)){
up(&dev-& sem);
wait_up_interruptible(&dev-& rdq);& && && &//****& &???
if& &(down_interruptible(&dev-& sem))& & & &
return& &-ERESTARTSYS;
goto& &do_more_
up(&dev-& sem);
wake_up_interruptible(&dev-& rdq);& &&&//****& &&&???
printk( &%s& &did& &write& &%i& &bytes\n &,current-& comm,& &written);& && && &//****
unsigned& &int& &vfifo_poll(struct& &file& &*filp,poll_table& &*wait)
Vfifo_Dev& &*dev=filp-& private_
unsigned& &int& &mask=0;
poll_wait(filp,&dev-& rdq,wait);
poll_wait(filp,&dev-& wrq,wait);
if& &(dev-& len& 0)& &mask|=POLLIN|POLLRDNORM;
if& &(dev-& len!=dev-& buffersize)& &mask|=POLLOUT|POLLWRNORM;
static& &struct& &file_operations& &vfifo_fops={
read:& &&&vfifo_read,
write:& &vfifo_write,
poll:& &vfifo_poll,
& && && && && & open:& &vfifo_open,
release:vfifo_release,
static& &int& &__init& &vfifo_init_module(void)
int& &result,i;
SET_MODULE_OWNER(&vfifo_fops);
#ifdef& &CONFIG_DEVFS_FS& & & &
vfifo_devfs_dir=devfs_mk_dir(NULL, &vfifo &,NULL);
if(!vfifo_devfs_dir)
return& &-EBUSY;
result=devfs_register_chrdev(vfifo_major, &vfifo &,&vfifo_fops);
if& &(result &0){
printk(KERN_WARNING& &&vfifo:can 't& &get& &major& &%d\n &,vfifo_major);
if& &(vfifo_major==0)& & & &
vfifo_major=
vfifo_devices=kmalloc(vfifo_nr_devs*sizeof(Vfifo_Dev),GFP_KERNEL);
if& &(!vfifo_devices){
return& &-ENOMEM;
memset(vfifo_devices,0,vfifo_nr_devs*sizeof(Vfifo_Dev));
for& &(i=0;i &vfifo_nr_i++){
init_waitqueue_head(&vfifo_devices[i].rdq);
init_waitqueue_head(&vfifo_devices[i].wrq);
sema_init(&vfifo_devices[i].sem,1);
#ifdef& &CONFIG_DEVFS_FS
sprintf(vfifoname, &vfifo%d &,2*i+1);
vfifo_devices[i].w_handle=& & & && && && && && &
devfs_register(vfifo_devfs_dir,vfifoname,DEVFS_FL_NON,vfifo_major,2*i,S_IFCHR|S_IRUGO|S_IWUGO,&vfifo_fops,vfifo_devices+i);
& && && && && & sprintf(vfifoname, &vfifo%d &,2*i+1);
vfifo_devices[i].r_handle=& & & &
devfs_register(vfifo_devfs_dir,vfifoname,DEVFS_FL_NON,vfifo_major,2*i+1,S_IFCHR|S_IRUGO|S_IWUGO,&vfifo_fops,vfifo_devices+i);& & & &
if& &(!vfifo_devices[i].r_handle||!vfifo_devices[i].w_handle){
printk(KERN_WARNING& &&vfifo:& &can 't& &register& &vfifo& &device& &nr& &%i\n &,i);
#endif& && && && && && && && && && && &
#ifdef& &VFIFO_DEBUG
&&create_proc_read_entry( &vfifo &,0,NULL,vfifo_read_mem,NULL);
return& &0;
static& &void& &__exit& &vfifo_cleanup_module(void)
devfs_unregister_chrdev(vfifo_major, &vfifo &);
#ifdef& &VFIFO_DEBUG& & & &
remove_proc_entry( &vfifo &,NULL);& && && && && && && &
if& &(vfifo_devices){
for& &(i=0;i &vfifo_nr_i++){& && && && && &
if& &(vfifo_devices[i].base)
kfree(vfifo_devices[i].base);
devfs_unregister(vfifo_devices[i].r_handle);
devfs_unregister(vfifo_devices[i].w_handle);
kfree(vfifo_devices);
devfs_unregister(vfifo_devfs_dir);
module_init(vfifo_init_module);
module_exit(vfifo_cleanup_module);
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
在Ubuntu中的vi编辑器编译后、出现如下的错误:(我新手、完全看不懂啊~~~求助)
xianan@xianan-desktop:~$ gcc -c vfifo.c -D_KERNEL_-DMODULE -o2 -g -Wall
&command-line&: warning: missing whitespace after the macro name
vfifo.c:8:29: error: linux/config.h: No such file or directory
vfifo.c:9:29: error: linux/module.h: No such file or directory
vfifo.c:11:27: error: linux/slab.h: No such file or directory
vfifo.c:13:30: error: linux/proc_fs.h: No such file or directory
In file included from /usr/include/asm/fcntl.h:1,
& && && && && &&&from /usr/include/linux/fcntl.h:4,
& && && && && &&&from vfifo.c:16:
/usr/include/asm-generic/fcntl.h:96: error: expected specifier-qualifier-list before ‘pid_t’
vfifo.c:17:27: error: linux/init.h: No such file or directory
vfifo.c:19:28: error: asm/uaccess.h: No such file or directory
vfifo.c:20:27: error: asm/system.h: No such file or directory
vfifo.c:30:38: error: linux/devfs_fs_kernel.h: No such file or directory
vfifo.c:31: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘vfifo_devfs_dir’
vfifo.c:35: error: expected ‘)’ before string constant
vfifo.c:36: error: expected ‘)’ before string constant
vfifo.c:37: error: expected ‘)’ before string constant
vfifo.c:38: error: expected declaration specifiers or ‘...’ before string constant
vfifo.c:38: warning: data definition has no type or storage class
vfifo.c:38: warning: type defaults to ‘int’ in declaration of ‘MODULE_AUTHOR’
vfifo.c:41: error: expected specifier-qualifier-list before ‘wait_queue_head_t’
vfifo.c:55: warning: ‘struct file’ declared inside parameter list
vfifo.c:55: warning: its scope is only this definition or declaration, which is probably not what you want
vfifo.c:55: warning: ‘struct inode’ declared inside parameter list
vfifo.c: In function ‘vfifo_open’:
vfifo.c:58: warning: implicit declaration of function ‘MINOR’
vfifo.c:58: error: dereferencing pointer to incomplete type
vfifo.c:59: error: dereferencing pointer to incomplete type
vfifo.c:61: error: expected expression before ‘=’ token
vfifo.c:64: error: dereferencing pointer to incomplete type
vfifo.c:66: error: dereferencing pointer to incomplete type
vfifo.c:68: warning: implicit declaration of function ‘down_interruptible’
vfifo.c:68: error: ‘Vfifo_Dev’ has no member named ‘sem’
vfifo.c:69: error: ‘ERESTARTSYS’ undeclared (first use in this function)
vfifo.c:69: error: (Each undeclared identifier is reported only once
vfifo.c:69: error: for each function it appears in.)
vfifo.c:70: error: ‘Vfifo_Dev’ has no member named ‘base’
vfifo.c:71: error: ‘Vfifo_Dev’ has no member named ‘base’
vfifo.c:71: warning: implicit declaration of function ‘kmalloc’
vfifo.c:71: error: ‘GFP_KERNEL’ undeclared (first use in this function)
vfifo.c:72: error: ‘Vfifo_Dev’ has no member named ‘base’
vfifo.c:73: warning: implicit declaration of function ‘up’
vfifo.c:73: error: ‘Vfifo_Dev’ has no member named ‘sem’
vfifo.c:76: error: ‘Vfifo_Dev’ has no member named ‘buffersize’
vfifo.c:77: error: ‘Vfifo_Dev’ has no member named ‘len’
vfifo.c:77: error: ‘Vfifo_Dev’ has no member named ‘start’
vfifo.c:79: error: dereferencing pointer to incomplete type
vfifo.c:79: error: ‘fmode_t’ undeclared (first use in this function)
vfifo.c:79: error: expected ‘)’ before numeric constant
vfifo.c:80: error: ‘Vfifo_Dev’ has no member named ‘readers’
vfifo.c:81: error: dereferencing pointer to incomplete type
vfifo.c:81: error: expected ‘)’ before numeric constant
vfifo.c:81: error: ‘Vfifo_Dev’ has no member named ‘writers’
vfifo.c:82: error: dereferencing pointer to incomplete type
vfifo.c:83: error: ‘MOD_INC_USE_COUNT’ undeclared (first use in this function)
vfifo.c:84: error: ‘Vfifo_Dev’ has no member named ‘sem’
vfifo.c: At top level:
vfifo.c:89: warning: ‘struct file’ declared inside parameter list
vfifo.c:89: warning: ‘struct inode’ declared inside parameter list
vfifo.c: In function ‘vfifo_release’:
vfifo.c:91: error: dereferencing pointer to incomplete type
vfifo.c:92: warning: implicit declaration of function ‘down’
vfifo.c:92: error: ‘Vfifo_Dev’ has no member named ‘sem’
vfifo.c:93: error: dereferencing pointer to incomplete type
vfifo.c:93: error: ‘fmode_t’ undeclared (first use in this function)
vfifo.c:93: error: expected ‘)’ before numeric constant
vfifo.c:94: error: ‘Vfifo_Dev’ has no member named ‘readers’
vfifo.c:95: error: dereferencing pointer to incomplete type
vfifo.c:95: error: expected ‘)’ before numeric constant
vfifo.c:96: error: ‘Vfifo_Dev’ has no member named ‘writers’
vfifo.c:97: warning: implicit declaration of function ‘wake_up_interruptible’
vfifo.c:97: error: ‘Vfifo_Dev’ has no member named ‘sem’
vfifo.c:99: error: ‘Vfifo_Dev’ has no member named ‘readers’
vfifo.c:99: error: ‘Vfifo_Dev’ has no member named ‘writers’
vfifo.c:99: error: ‘Vfifo_Dev’ has no member named ‘len’
vfifo.c:100: warning: implicit declaration of function ‘kfree’
vfifo.c:100: error: ‘Vfifo_Dev’ has no member named ‘base’
vfifo.c:101: error: ‘Vfifo_Dev’ has no member named ‘base’
vfifo.c:103: error: ‘Vfifo_Dev’ has no member named ‘sem’
vfifo.c:104: error: ‘MOD_DEC_USE_COUNT’ undeclared (first use in this function)
vfifo.c: At top level:
vfifo.c:107: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘vfifo_read’
vfifo.c:162: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘vfifo_write’
vfifo.c:215: error: expected declaration specifiers or ‘...’ before ‘poll_table’
vfifo.c:215: warning: ‘struct file’ declared inside parameter list
vfifo.c: In function ‘vfifo_poll’:
vfifo.c:217: error: dereferencing pointer to incomplete type
vfifo.c:219: warning: implicit declaration of function ‘poll_wait’
vfifo.c:219: error: ‘Vfifo_Dev’ has no member named ‘rdq’
vfifo.c:219: error: ‘wait’ undeclared (first use in this function)
vfifo.c:220: error: ‘Vfifo_Dev’ has no member named ‘wrq’
vfifo.c:221: error: ‘Vfifo_Dev’ has no member named ‘len’
vfifo.c:222: error: ‘Vfifo_Dev’ has no member named ‘len’
vfifo.c:222: error: ‘Vfifo_Dev’ has no member named ‘buffersize’
vfifo.c: At top level:
vfifo.c:227: error: variable ‘vfifo_fops’ has initializer but incomplete type
vfifo.c:228: error: unknown field ‘read’ specified in initializer
vfifo.c:228: error: ‘vfifo_read’ undeclared here (not in a function)
vfifo.c:228: warning: excess elements in struct initializer
vfifo.c:228: warning: (near initialization for ‘vfifo_fops’)
vfifo.c:229: error: unknown field ‘write’ specified in initializer
vfifo.c:229: error: ‘vfifo_write’ undeclared here (not in a function)
vfifo.c:229: warning: excess elements in struct initializer
vfifo.c:229: warning: (near initialization for ‘vfifo_fops’)
vfifo.c:230: error: unknown field ‘poll’ specified in initializer
vfifo.c:230: warning: excess elements in struct initializer
vfifo.c:230: warning: (near initialization for ‘vfifo_fops’)
vfifo.c:231: error: unknown field ‘open’ specified in initializer
vfifo.c:231: warning: excess elements in struct initializer
vfifo.c:231: warning: (near initialization for ‘vfifo_fops’)
vfifo.c:232: error: unknown field ‘release’ specified in initializer
vfifo.c:232: warning: excess elements in struct initializer
vfifo.c:232: warning: (near initialization for ‘vfifo_fops’)
vfifo.c:236: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘vfifo_init_module’
vfifo.c:281: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘vfifo_cleanup_module’
vfifo.c:300: warning: data definition has no type or storage class
vfifo.c:300: warning: type defaults to ‘int’ in declaration of ‘module_init’
vfifo.c:300: warning: parameter names (without types) in function declaration
vfifo.c:301: warning: data definition has no type or storage class
vfifo.c:301: warning: type defaults to ‘int’ in declaration of ‘module_exit’
vfifo.c:301: warning: parameter names (without types) in function declaration
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
希望哪位高手帮我解决下、谢谢了。

我要回帖

更多关于 单片机嵌入式软件开发 的文章

 

随机推荐