文档库 最新最全的文档下载
当前位置:文档库 › LINUX字符设备驱动编写基本流程

LINUX字符设备驱动编写基本流程

LINUX字符设备驱动编写基本流程
LINUX字符设备驱动编写基本流程

---简介

Linux下的MISC简单字符设备驱动虽然使用简单,但却不灵活。

只能建立主设备号为10的设备文件。字符设备比较容易理解,同时也能够满足大多数简

单的硬件设备,字符设备通过文件系统中的名字来读取。这些名字就是文件系统中的特

殊文件或者称为设备文件、文件系统的简单结点,一般位于/dev/目录下使用ls进行查

看会显示以C开头证明这是字符设备文件crw--w---- 1 root tty 4, 0 4月 14 11:05 tty0。

第一个数字是主设备号,第二个数字是次设备号。

---分配和释放设备编号

1)在建立字符设备驱动时首先要获取设备号,为此目的的必要的函数是

register_chrdev_region,在linux/fs.h中声明:int register_chrdev_region(dev_t first, unsigned int count, char *name);first是你想

要分配的起始设备编号,first的次编号通常是0,count是你请求的连续设备编号的

总数。count如果太大会溢出到下一个主设备号中。name是设备的名字,他会出现在

/proc/devices 和sysfs中。操作成功返回0,如果失败会返回一个负的错误码。

2)如果明确知道设备号可用那么上一个方法可行,否则我们可以使用内核动态分配的设

备号int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,unsigned int count, char *name);dev是个只输出的参数,firstminor请求的第一个要用的次编号,

count和name的作用如上1)对于新驱动,最好的方法是进行动态分配

3)释放设备号,void unregister_chrdev_region(dev_t first unsigned int count);

---文件操作file_operations结构体,内部连接了多个设备具体操作函数。该变量内部

的函数指针指向驱动程序中的具体操作,没有对应动作的指针设置为NULL。

1)fops的第一个成员是struct module *owner 通常都是设置成THIS_MODULE。

linux/module.h中定义的宏。用来在他的操作还在被使用时阻止模块被卸载。

2)loff_t (*llseek) (struct file *, loff_t, int);该方法用以改变文件中的当前读/

写位置

返回新位置。

3)ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);该函数用

以从设备文件

中读取数据,读取成功返回读取的字节数。

4)ssize_t (*write) (struct file *, const char __user *,size_t , loff_t *);该函数用以向设备

写入数据,如果成功返回写入的字节数。

5)int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);ioctl系统调用提供

发出设备特定命令的方法。

6)int (*open) (struct inode *, struct file *);设备文件进行的第一个操作,打开设备文件。

7)int (*release) (struct inode *, struct file *);释放文件结构函数指针。

一般初始化该结构体如下:

struct file_operations fops = {

.owner = THIS_MODULE, .llseek = xxx_llseek, .read = xxx_read, .write = xxx_write,

.ioctl = xxx_ioctl, .open = xxx_open, .release = xxx_release };

PS:以上的文件操作函数指针并不是全部,只是介绍了几个常用的操作。

---文件结构

struct file定义在linux/fs.h中,是设备驱动中第二个最重要的数据结构,此处的file 和

用户空间程序中的FILE指针没有关系。前者位于内核空间,后者位于用户控件。

文件结构代表一个打开的文件。(他不特定给设备驱动;系统中每个打开的文件

有一个关联的struct file在内核空间)。它由内核在open时创建,并可以传递给文件件

操作函数,文件关闭之后,内核释放数据结构。

1)mode_t f_mode。确定文件读写模式

2)loff_t f_ops。当前读写位置

3)unsigned int f_flags 。文件标志,O_RDONLY、O_NONBLOCK,

4)struct file_operations *f_op。关联文件相关操作

5)void *private_data。open系统调用设置该指针NULL,指向分配的数据。

6)struct dentry *f_dentry。关联到文件的目录入口dentry结构。

---inode结构

inode结构由内核在内部用来表示文件。它和代表打开文件描述符的文件结构是不

同的。inode结构包含大量关于文件的信息。作为通用规则,这个结构只有两个成

员对驱动代码有作用。

dev_t i_rdev。对于代表设备文件的节点,这个成员包含实际的设备编号。

struct cdev *i_cdev。内核内部结构,代表字符设备。

---字符设备注册

在内核调用你的设备操作前,你编写分配并注册一个或几个struct cdev.

struct cdev *my_cdev = cdev_alloc(); my_cdev-;ops = &my_fops;

或者定义成static均可。

对定义的cdev变量进行初始化,可以使用专门的函数,或者使用如上的方法。

cdev_init( my_cdev, &my_fops); 其实上边的两行代码就是做了这个函数的工作。最后告诉内核该cdev。

cdev_add(struct cdev *dev, dev_t num, unsigned int count);

/*上述总结,到此关于设备文件相关的结构数据以及如何注册销毁等操作相关的

函数基本上都已经介绍完毕。主要的还是要设计具体操作的函数来实现具体的

逻辑操作*/

以下代码整理、摘录自《Android深度探索HAL与驱动开发-李宁》LED驱动篇

#include

#include

#include

#include

#include

#include

#include

#deifne DEVICE_NAME s3c6410_leds

#define DEVICE_COUNT 1

#define S3C6410_LEDS_MAJOR 0

#define S3C6410_LEDS_MINOR 234

#define PARAM_SIZE 3

static int major = S3C6410_LEDS_MAJOR;

static int minor = S3C6410_LEDS_MINOR;

static dev_t dev_number;

static int leds_state = 1;

static char *params[] = {string1,string2,string3};

static iint param_size = PARAM_SIZE;

static struct class *leds_class = NULL;

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

{

switch (cmd)

{

unsigned tmp;

case 0:

case 1:

if (arg ; 4)

return -EINVAL;

tmp = ioread32 (S3C64XX_GPMDAT);

if (cmd == 1)

tmp &= (~(1 << arg));

else

tmp |= (1 << arg);

iowrite32 (tmp, S3C64XX_GPMDAT);

return 0;

default : return -EINVAL;

}

}

static ssize_t s3c6410_leds_write (struct file *file, const char __user *buf, size_t count, loff_t *ppos)

{

unsigned tmp = count;

unsigned long i = 0;

memset(mem, 0, 4);

if (count ; 4)

tmp = 4;

if (copy_from_user (mem, buf, tmp) )

return -EFAULT;

else{

for( i=0; i<4; i++)

{

tmp = ioread32(S3C64XX_GPMDAT);

if (mem[i] == '1')

tmp &= (~(1 << i));

else

tmp |= (1 << i);

iowrite32(tmp, S3C64XX_GPMDAT);

}

return count;

}

}

static struct file_operations dev_fops =

{.owner = THIS_MODULE, .unlocked_ioctl = s3c6410_leds_ioctl, .write = s3c6410_leds_write};

static struct cdev leds_cdev;

static int leds_create_device(void)

{

int ret = 0;

int err = 0;

cdev_init (&leds_cdev, &dev_fops);

leds_cdev.owner = THIS_MODULE;

if (major ; 0)

{

dev_number = MKDEV(major,minor);

err = register_chrdev_region(dev_number, DEVICE_COUNT, DEVICE_NAME);

if (err < 0)

{

printk(KERN_WANRING register_chrdev_region errorn);

return err

}

}

else{

err = alloc_chrdev_region(&leds_cdev.dev, 10, DEVICE_COUNT, DEVICE_NAME); if(err < 0)

{

printk (KERN_WARNING alloc_chrdev_region errorn);

return err;

}

major = MAJOR(leds_cdev.dev);

major = MINOR(leds_cdev.dev);

dev_number = leds_cdev.dev;

}

ret = cdev_add(&leds_cdev,dev_number, DEVICE_COUNT);

leds_class = class_create (THIS_MODULE, DEVICE_NAME);

device_create (leds_class, NULL, dev_number, NULL, DEVICE_NAME); return ret;

}

static void leds_init_gpm(int leds_default){

int tmp = 0;

tmp = ioread32(S3C64XX_GPMCON);

tmp &= (~0xffff);

tmp |= 0x1111;

iowrite32(tmp,S3C64XX_GPMCON);

tmp = ioread32(S3C64XX_GPMPUD);

tmp &= (~0XFF);

tmp |= 0xaa;

iowrite32(tmp,S3C64XX_GPMPUD);

tmp = ioread32(S3C64XX_GPMDAT);

tmp &= (~0xf);

tmp |= leds_default;

iowrite32(tmp, S3C64XX_GPMDAT);

}

static leds_init( void)

{

int ret;

ret = leds_create_device();

leds_init_gpm (~leds_state);

printk(DEVICE_NAMEtinitializedn);

return ret;

}

static void leds_destroy_device(void)

{

device_destroy(leds_class, dev_number);

if(leds_class)

class_destroy(leds_class);

unregister_chrdev_region(dev_number, DEVICE_NAME); }

static void leds_exit(void)

{

leds_destroy_device();

printk(DEVICE_NAMEtexitn);

}

module_init(leds_init);

module_exit(leds_exit);

module_param(leds_state, int, S_IRUGO|S_IWUSR);

module_param_array(params, charp, ?m_size, S_IRUGO|S_IWUSR); MODULE_LICENSE(GPL);

MODULE_AUTHOR(lining);

一步一步教你如何看图纸-太经典!

一步一步教你如何看图纸,太经典! ①首先仔细阅读设计说明:了解建筑物的概况、位置、标高、材料要求、质量标准、施工注意事项以及一些特殊的技术要求,在思想上形成一个初步印象; ②接着要看平面图:了解房屋的平面形状、开间、进深、柱网尺寸,各种房间的安排和交通布置,以及门窗位置,对建筑物形成一个平面概念,为看立面图、剖面图打好基础; ③看立面图:以了解建筑物的朝向、层数和层高的变化,以及门窗、外装饰的要求等; ④看剖面图:以大体了解剖面部分的各部位标高变化和室内情况; ⑤最后看结构图:以了解平面图、立面图、剖面图等建筑图与结构图之间的关系,加深对整个工程的理解; ⑥另外,详细阅读所指的大样图或节点图:必须根据平面图、立面图、剖面图等中的索引符号,详细阅读所指的大样图或节点图,做到粗细结合,大小交圈。 只有循序渐进,才能理解设计意图,看懂设计图纸,也就是说一般应做到“先看说明后看图;顺序最好为平、立、剖;查对节点和大样;建筑结构对照读”,这样才能收到事半功倍的效果。二、记住尺寸建筑工程虽然各式各样,但都是通过各部分尺寸的改变而出现各种不同的造型和效果。俗话

说:“没有规矩,不成方圆”,图上如果没有长、宽、高、直径等具体尺寸,施工人员就没法按图施工。 但是图纸上的尺寸很多,作为具体的和操作人员来说,不需要,也不可能将图上所有的尺寸都记住。但是,对建筑物的一些主要尺寸,主要构配件的规格、型号、位置、数量等,则是必须牢牢记住的。这样可以加深对设计图纸的理解,有利于施工操作,减少或避免施工错误。一般来说,作为要牢记以下一些尺寸:开间进深要记牢,长宽尺寸莫忘掉;纵横轴线心中记,层高总高很重要;结构尺寸要记住,构件型号别错了;基础尺寸是关键,结构强度不能少;梁柱断面记牢靠,门窗洞口要留好。三、弄清关系看图时必须弄清每张图纸之间的相互关系。因为一张图纸无法详细表达一项工程各部位的具体尺寸、做法和要求。必须用很多张图纸,从不同的方面表达某一个部位的做法和要求,这些不同部位的做法和要求,就是一个完整的建筑物的全貌。所以在一份施工图纸的各张图纸之间,都有着密切的联系。 在看图时,必须以平面图中的轴线编号、位置为基准,做到:“手中有图纸,心中有轴线,千头又万绪,处处不离线”。这就是的基本基础以及标准。 图纸之间的主要关系,一般来说主要是:轴线是基准,编号要相吻;标高要交圈,高低要相等;剖面看位置,详图详索引;如用标准图,引出线标明;要求和做法,快把说明拿;

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)

如何快速看懂施工图,只需三招

如何快速看懂施工图,只需三招 2014-09-12筑龙造价 一、识图 1、先看现场平面布置图,了解工程概况及周围建筑对本工程的影响。 2、再看施工组织,大概了解工程的具体施工情况。 3、看施工结构图和建筑图,两图结合看,整体了解工程概况。 4、详细看施工图结合结构施工图集查看做法,建筑施工图结合建筑施工做法图集。 5、结构图从轴线尺寸看,查看剪力墙、柱、梁、板等配筋是否有无前后出入,结构是否与建筑图相符。梁、板等原位标高是否正确,卫生间板面是否标注详细,沉降缝处的结构处理是否合适,楼梯的做法是否详细,各种洞口的详细做法。 6、建筑图看每层的布置是否合理,非承重墙及承重墙的布置是否合理,梁、柱等布置是否美观,位置、尺寸与结构图是否一致,各种洞口有无遗漏。 7、建筑做法是否合理,防水材料,涂料,瓷砖等。 二、建筑图纸符号大全 在建筑设计图中: l表示是梁、ll表示是连续梁、ql表示圈梁、jl表示基础梁、tl表示是梯梁、dl表示是地梁、z表示柱、gz表示构造柱、kz表示框架柱,m表示是门、c表示是窗。@表示钢筋间距Φ表示钢筋型号。 1、正规的建筑设计,要有设计者签名,建筑图纸负责人签名,审定者签名,校对人签名,并加盖出图章,注册执业章。

2、建筑设计图纸中,长度一般以mm为,有加以说明的除外;看图时注意结合“建筑用料说明”与其他图纸进行综合。“建筑用料说明”中,在各小项的前面有打上“√”的,为该设计所采用的做法。没有打勾的,非该设计所采用的做法。 3、如在建筑设计图中:“c20钢筋砼jl(240400)配4φ16络φ6@200箍。”解读为:强度为c的钢筋混凝土结构的基础梁,宽240mm,高400mm,配4条直径16厘(16mm)螺纹的主钢筋,每间隔200mm箍一个直径6厘的钢筋长方形环络。(长方形环络长约340--350mm,宽约180mm--190mm)。 4、如在建筑设计图中:“c20砼小柱(240240)配4φ12箍]6@200。”其中,“]6@200”为不规范标注,应为“φ6@200”。解读为:强度为c20的钢筋混凝土结构的小梁,截面为长240mm,宽240mm,配4条直径12厘(12mm)螺纹的主钢筋,每间隔200mm箍一个直径6厘钢筋的长方形络。小柱高度看该工程所标示的层高减去圈梁的高度后加上板面的厚度,因为圈梁与板面是浇筑在一起。 5、如在建筑设计图中:m5水泥砂浆砌mu10贝灰砂砖。“m5”表示水泥砂浆的强度等级,“mu10”表示贝灰砂砖的强度等级。mu10代表贝灰砂砖的抗压强度平均值≥10mpa。 6、ql表示圈梁,圈梁的做法,通常用于砖混房屋建筑结构(混合结构),即先砌墙,后用钢筋混凝土浇筑圈梁及板面。 7、框架结构的做法,即先浇筑柱体,大梁、小梁、板面等。待拆掉模板后再砌墙体。 8、根据质监的要求,可以要求承建方提供钢筋(每批次)的合格证,水泥(每批次)的合格证,mu10贝灰砂砖(每批次)的合格证,水泥砼的测试合格证。 三、建筑图纸审查要点 工程开工之前,需识图、审图,再进行图纸会审工作。如果有识图、审图经验,掌握一些要点,则事半功倍。现谈谈本人的识图、审图经验,供参考。 识图、审图的程序是:熟悉拟建工程的功能、熟悉、审查工程平面尺寸、熟悉、审查工程立面尺寸、检查施工图中容易出错的部位有无出错、检查有无改进的地方。 (一)熟悉拟建工程的功能

linux驱动程序的编写

linux驱动程序的编写 一、实验目的 1.掌握linux驱动程序的编写方法 2.掌握驱动程序动态模块的调试方法 3.掌握驱动程序填加到内核的方法 二、实验内容 1. 学习linux驱动程序的编写流程 2. 学习驱动程序动态模块的调试方法 3. 学习驱动程序填加到内核的流程 三、实验设备 PentiumII以上的PC机,LINUX操作系统,EL-ARM860实验箱 四、linux的驱动程序的编写 嵌入式应用对成本和实时性比较敏感,而对linux的应用主要体现在对硬件的驱动程序的编写和上层应用程序的开发上。 嵌入式linux驱动程序的基本结构和标准Linux的结构基本一致,也支持模块化模式,所以,大部分驱动程序编成模块化形式,而且,要求可以在不同的体系结构上安装。linux是可以支持模块化模式的,但由于嵌入式应用是针对具体的应用,所以,一般不采用该模式,而是把驱动程序直接编译进内核之中。但是这种模式是调试驱动模块的极佳方法。 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。同时,设备驱动程序是内核的一部分,它完成以下的功能:对设备初始化和释放;把数据从内核传送到硬件和从硬件读取数据;读取应用程序传送给设备文件的数据和回送应用程序请求的数据;检测和处理设备出现的错误。在linux操作系统下有字符设备和块设备,网络设备三类主要的设备文件类型。 字符设备和块设备的主要区别是:在对字符设备发出读写请求时,实际的硬件I/O一般就紧接着发生了;块设备利用一块系统内存作为缓冲区,当用户进程对设备请求满足用户要求时,就返回请求的数据。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。 1 字符设备驱动结构 Linux字符设备驱动的关键数据结构是cdev和file_operations结构体。

字符设备基础

Linux 字符设备基础 字符设备驱动程序在系统中的位置 操作系统内核需要访问两类主要设备,简单的字符设备,如打印机,键盘等;块设备,如软盘、硬盘等。与此对应,有两类设备驱动程序。分别称为字符设备驱动程序和块设备驱动程序。两者的主要差异是:与字符设备有关的系统调用几乎直接和驱动程序的内部功能结合在一起。而读写块设备则主要和快速缓冲存储区打交道。只有需要完成实际的输入/输出时,才用到块设备驱动程序。见下图: Linux 设备驱动程序的主要功能有: ● 对设备进行初始化; ● 使设备投入运行和退出服务; ● 从设备接收数据并将它们送到内核; ● 将数据从内核送到设备; ● 检测和处理设备出现的错误。 当引导系统时,内核调用每一个驱动程序的初始化函数。它的任务之一是将这一设备驱动程序使用的主设备号通知内核。同时,初始化函数还将驱动程序中的函数地址结构的指针送给内核。 内核中有两X 表。一X 表用于字符设备驱动程序,另一X 用于块设备驱动程序。这两X 表用来保存指向file_operations 结构的指针, 设备驱动程序内部的函数地址就保

存在这一结构中。内核用主设备号作为索引访问file_operations结构,因而能访问驱动程序内的子程序。 从开机到驱动程序的载入 系统启动过程中可能出现几种不同的方式检测设备硬件。首先机器硬件启动时BIOS会检测一部分必要的设备,如内存、显示器、键盘和硬盘等等。机器会把检测到的信息存放在特定的位置,如CMOS数据区。而另外某些设备会由设备驱动程序进行检测。 1 开机 2 引导部分(linux/config.h,arch/i386/boot/bootsect.S) 3 实模式下的系统初始化(arch/i386/boot/setup.S) 4 保护模式下的核心初始化 5 启动核心(init/main.c) init函数中函数调用关系如下: main.c init() filesystems.c sys_setup() genhd.c device_setup() mem.c chr_dev_init() 至此,驱动程序驻入内存。 设备驱动程序基本数据结构: struct device_struct 系统启动过程中要登记的块设备和字符设备管理表的定义在文件fs/devices.c中:struct device_struct { const char * name; struct file_operations * fops; }; static struct device_struct chrdevs[MAX_CHRDEV]; static struct device_struct blkdevs[MAX_BLKDEV]; 其实块设备表和字符设备表使用了相同的数据结构。在某些系统中,这些设备表也称作设备开关表,不同的是它们直接定义了一组函数指针进行对设备的管理。而这里系统用文件操作(file_operations)代替了那组开关。文件操作是文件系统与设备驱动程序之间的接口,系统特殊文件在建立的时候并没有把两者对应起来,只是把设备的缺省文件结构和i节点结构赋给设备文件,而真正的对应定义在系统启动之后,当设备被打开时时才进行的。 操作blkdev_open和chrdev_open定义在文件devices.c中,它们的基本功能是当设备文件初次打开时,根据该文件的i节点信息找到设备真正的文件操作接口,然后更新原来的设

如何快速看懂熟悉复杂施工图纸

如何快速看懂熟悉复杂施工图纸 关键词:识图步骤、识图技巧。 (1)循序渐进拿到一份图纸后,先看什么图,后看什么图,应该有主有次,一般是按如下顺序进行: ①首先仔细阅读设计说明,了解建筑物的概况、位置、标高、材料要求、质量标准、施工注意事项以及一些特殊的技术要求,在思想上形成一个初步印象; ②接着要看平面图,了解房屋的平面形状、开间、进深、柱网尺寸,各种房间的安排和交通布置,以及门窗位置,对建筑物形成一个平面概念,为看立面图、剖面图打好基础; ③看立面图,以了解建筑物的朝向、层数和层高的变化,以及门窗、外装饰的要求等; ④看剖面图,以大体了解剖面部分的各部位标高变化和室内情况; ⑤最后看结构图,以了解平面图、立面图、剖面图等建筑图与结构图之间的关系,加深对整个工程的理解; ⑥另外,还必须根据平面图、立面图、剖面图等中的索引符号,详细阅读所指的大样图或节点图,做到粗细结合,大小交圈。 只有循序渐进,才能理解设计意图,看懂设计图纸,也就是说一般应做到“先看说明后看图;顺序最好为平、立、剖;查对节点和大样;建筑结构对照读”,这样才能收到事半功倍的效果。 (2)作为要记住尺寸建筑工程虽然各式各样,但都是通过各部分尺寸的改变而出现各种不同的造型和效果。俗话说:“没有规矩,不成方圆”,图上如果没有长、宽、高、直径等具体尺寸,施工人员就没法按图施工。 但是图纸上的尺寸很多,作为具体的和操作人员来说,不需要,也不可能将图上所有的尺寸都记住。但是,对建筑物的一些主要尺寸,主要构配件的规格、型号、位置、数量等,则是必须牢牢记住的。这样可以加深对设计图纸的理解,有利于施工操作,减少或避免施工错误。

一个简单的演示用的Linux字符设备驱动程序.

实现如下的功能: --字符设备驱动程序的结构及驱动程序需要实现的系统调用 --可以使用cat命令或者自编的readtest命令读出"设备"里的内容 --以8139网卡为例,演示了I/O端口和I/O内存的使用 本文中的大部分内容在Linux Device Driver这本书中都可以找到, 这本书是Linux驱动开发者的唯一圣经。 ================================================== ===== 先来看看整个驱动程序的入口,是char8139_init(这个函数 如果不指定MODULE_LICENSE("GPL", 在模块插入内核的 时候会出错,因为将非"GPL"的模块插入内核就沾污了内核的 "GPL"属性。 module_init(char8139_init; module_exit(char8139_exit; MODULE_LICENSE("GPL"; MODULE_AUTHOR("ypixunil"; MODULE_DESCRIPTION("Wierd char device driver for Realtek 8139 NIC"; 接着往下看char8139_init( static int __init char8139_init(void {

int result; PDBG("hello. init.\n"; /* register our char device */ result=register_chrdev(char8139_major, "char8139", &char8139_fops; if(result<0 { PDBG("Cannot allocate major device number!\n"; return result; } /* register_chrdev( will assign a major device number and return if it called * with "major" parameter set to 0 */ if(char8139_major == 0 char8139_major=result; /* allocate some kernel memory we need */ buffer=(unsigned char*(kmalloc(CHAR8139_BUFFER_SIZE, GFP_KERNEL; if(!buffer { PDBG("Cannot allocate memory!\n"; result= -ENOMEM;

如何快速学会看图纸

图纸,有很多份!系统图,平面图等我们看平面施工图的时候就要结合其他的图纸看!比如图纸中有些我们不知道的图形符号!那我们就要结合图例来看了 图片来自:千秋了的百度相册 排水给水图的一下图纸标法! 室内工程应标注相对标高;室外工程宜标注绝对标高,当无绝对标高资料时,可标注相对标高,但应总图专业一致。 2、压力管道应标注中心标高;重力流管道和沟渠宜标注管(沟)内底标高。标高单位以m 计时,可注写到小数点后第二位。

3、标高的标注方法应符合下列规定: (1)平面图中,管道标高应按下图中的方式标注;平面图中的管道标高方法 管径的单位应为mm。 管径的表达方式应符合下列规定: 水煤气输送钢管(镀锌或非镀锌)、铸铁管等管材,管径宜以工程直径DX壁厚表示; 无缝钢管、焊接钢管(直缝或螺旋缝)等管材,管径宜以外径DX壁厚表示; 钢管、薄壁不锈钢管等管材,管径宜以公称Dw表示;)建筑给水排水塑料管材,管径宜以外径dn表示; 钢筋混凝土(或混凝土)管,管径宜以内径d表示; 复合管、结构壁塑料管等管材,管径应按产品标准的方法表示; 当设计中均采用公称直径DN表示管径时,应有公称直径DN与相应产品规格对照表。 管径的标注方法应符合下列规定: 下图中可以看出信息有第一“DN32,是代表32管。DN15代表15管子 还可以看出图中的管子离地高等等而图中的JL代表的是什么呢就要查下文档或者图例了!

我这边的文档算蛮全的! ?

而我们看到的图纸中很多的图形那代表的是什么意思呢?做久水电的人一看就知道!但是如果你不知道或你是新手,没有关系!我们看下图例,而图纸怎么看怎么安装这些呢!我们在水电施工视频教程全套里详细讲解! 而我们水电图纸,图纸中的图例大全一书呢!我们的视频里也包括这本图例大全的!这套视频全套总功共包括了17本电子书,和十篇文档!我们看下下面的给排水图例

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 *);

LINUX字符设备驱动编写基本流程

---简介 Linux下的MISC简单字符设备驱动虽然使用简单,但却不灵活。 只能建立主设备号为10的设备文件。字符设备比较容易理解,同时也能够满足大多数简 单的硬件设备,字符设备通过文件系统中的名字来读取。这些名字就是文件系统中的特 殊文件或者称为设备文件、文件系统的简单结点,一般位于/dev/目录下使用ls进行查 看会显示以C开头证明这是字符设备文件crw--w---- 1 root tty 4, 0 4月 14 11:05 tty0。 第一个数字是主设备号,第二个数字是次设备号。 ---分配和释放设备编号 1)在建立字符设备驱动时首先要获取设备号,为此目的的必要的函数是 register_chrdev_region,在linux/fs.h中声明:int register_chrdev_region(dev_t first, unsigned int count, char *name);first是你想 要分配的起始设备编号,first的次编号通常是0,count是你请求的连续设备编号的 总数。count如果太大会溢出到下一个主设备号中。name是设备的名字,他会出现在 /proc/devices 和sysfs中。操作成功返回0,如果失败会返回一个负的错误码。 2)如果明确知道设备号可用那么上一个方法可行,否则我们可以使用内核动态分配的设 备号int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,unsigned int count, char *name);dev是个只输出的参数,firstminor请求的第一个要用的次编号, count和name的作用如上1)对于新驱动,最好的方法是进行动态分配 3)释放设备号,void unregister_chrdev_region(dev_t first unsigned int count); ---文件操作file_operations结构体,内部连接了多个设备具体操作函数。该变量内部 的函数指针指向驱动程序中的具体操作,没有对应动作的指针设置为NULL。 1)fops的第一个成员是struct module *owner 通常都是设置成THIS_MODULE。 linux/module.h中定义的宏。用来在他的操作还在被使用时阻止模块被卸载。 2)loff_t (*llseek) (struct file *, loff_t, int);该方法用以改变文件中的当前读/ 写位置 返回新位置。 3)ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);该函数用 以从设备文件 中读取数据,读取成功返回读取的字节数。

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、系统设计: 、模块设计:

建筑识图快速方法

建筑识图快速方法文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

1 (一) 1.先看现场平面布置图,了解工程概况及周围建筑对本工程的影响。 2.再看施工组织,大概了解工程的具体施工情况。 3.看施工结构图和建筑图,两图结合看,整体了解工程概况。 4.详细看施工图结合结构施工图集查看做法,建筑施工图结合建筑施工做法图集。 5.结构图从轴线尺寸看,查看剪力墙、柱、梁、板等配筋是否有无前后出入,结构是否与建筑图相符。梁、板等原位标高是否正确,卫生间板面是否标注详细,沉降缝处的结构处理是否合适,楼梯的做法是否详细,各种洞口的详细做法。 6.建筑图看每层的布置是否合理,非承重墙及承重墙的布置是否合理,梁、柱等布置是否美观,位置、尺寸与结构图是否一致,各种洞口有无遗漏。 7.建筑做法是否合理,防水材料,涂料,瓷砖等(二)建筑图纸符号大全 在建筑设计图中,l表示是梁、ll表示是连续梁、ql表示圈梁、jl表示基础梁、tl表示是梯梁、dl表示是地梁,z表示柱、gz表示构造柱、kz表示框架柱,m表示是门、c表示是窗。@表示钢筋间距Φ表示钢筋型号, 正规的建筑设计,要有设计者签名,建筑图纸负责人签名,审定者签名,校对人签名,并加盖出图章,注册执业章。 2、建筑设计图纸中,长度一般以mm为单位,有加以说明的除外;看图时注意结合“建筑用料说明”与其他图纸进行综合。“建筑用料说明”中,在各小项的前面有打 上“√”的,为该设计所采用的做法。没有打勾的,非该设计所采用的做法。 3、如在建筑设计图中:“c20钢筋砼jl(240400)配4φ16络φ6@200箍。”解读为:强度为c的钢筋混凝土结构的基础梁,宽240mm,高400mm,配4条直径16厘

一个简单字符设备驱动实例

如何编写Linux设备驱动程序 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便。本文是在编写一块多媒体卡编制的驱动程序后的总结,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。 以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正. 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能: 1)对设备初始化和释放; 2)把数据从内核传送到硬件和从硬件读取数据; 3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据; 4)检测和处理设备出现的错误。 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备

生活与哲学知识结构框架图(一目了然,快速记忆)

《生活与哲学》知识框架图(复习神器,一目了然,快速记忆) (1)哲学是一门给人智慧,使人聪明的学问。(注意:此处不能改成科学,只能是学问) 一.含义: (2)哲学是系统化理论化的世界观。(或关于世界观的学说) (3)哲学是对自然、社会和思维知识的概括与总结。(注意:具体科学包括自然科学、社会科学和思维科学,之间关系不能等同) 二.产生:(1)产生于人们实践活动中;(1)源于人们对世界的追问和对实践的反思 三.哲学的功能:指导人们正确的认识世界和改造世界(注意:哲学有正确与错误之分。只有正确的哲学才能让人们正确的认识与改造世界) (1)哲学与世界观:A 区别:a 、含义不同:世界观是人们对整个世界及人与世界关系的总的看法及根本观点 b 、世界观人从都有,哲学并非人人都有; c 、世界观是不自觉的、不系统的,哲学是系统化、理论化的。 四.哲学、世界观、方法论的关系: B:联系:哲学是对世界观进行系统化、理论化而形成的思想体系。(世界观和哲学一样有正确与错误之分) (2)世界观与方法论:一般来说,世界观决定方法论,方法论体现世界观。有什么样的世界观就有什么样的方法论。 (注意:在解题时时要注意世界观与方法论对应正确) 五.哲学同具体科学关系:1.区别:具体科学揭示某一具体领域的规律和奥秘(强调具体); 哲学则对具体科学进行新的概括和总结,从中抽象出最一般的本质和最普遍的规律(强调抽象、一般)。 2.联系:(1)具体科学是哲学的基础,具体科学的进步推动着哲学的发展。 (2)哲学为具体科学提供世界观和方法论的指导。 六.哲学基本问题:1.是什么:(思维与存在关系问题)具体包括:(1)思维和存在何者为本原的问题。(以此划分唯物主义与唯心主义) (2)思维和存在有没有同一性问题。(思维能否正确认识存在的问题)(以此划分可知论与不可知论) 2.为什么:(1)思维与存在的关系问题,首先是人们在生活和实践活动中遇到的和无法回避的基本问题。 (2)思维与存在的关系问题,是一切哲学都不能回避的问题。它贯彻哲学始终。 1.唯物主义:(1)基本观点:物质是本原,意识是派生的;先有物质后有意识;物质决定意识。 (2)三种基本形态:古代朴素唯物主义、近代形而上学唯物主义、辩证唯物主义 七.哲学两大派别:2.唯心主义:(1)基本观点:意识是本原;先有意识后有物质;意识决定物质 (2)两种基本形态:主观唯心主义和客观唯心主义 主观唯心主义(把人的主观精神,如人的目的、意志等夸大为万物的本原,认为人的主观精神,决定客观事物乃至整个世界) 客观唯心主义(把客观精神,如上帝、鬼神、理念等看作世界的主宰与本原,它决定着客观事物的存在和发展)。 哲 学

linux 驱动程序开发

1 什么是驱动 a)裸板驱动 b)有系统驱动linux 将驱动封装了一套框架(每个驱动) c)大量和硬件无关的代码已写好只需要编程实现和硬件相关的代码 d)难点:框架的理解代码的理解 e)需要三方面的知识: i.硬件相关的知识 1.电路原理图 2.芯片的数据手册 3.总线协议rs232 i2c等 ii.内核的知识 1.内核驱动属于内核的一部分,它运行在内核态需要对内核知识有了解 2.内存管理 3.解决竞争状态(如上锁) 4.。。。 iii.驱动框架的知识 1.内核中已经实现了大量硬件驱动完成了驱动的框架编程只需要根据硬 件进行添加 2 搭建linux驱动开发工具 a)安装交叉编译环境 i.arm-linux-gcc uboot PATH b)移植uboot c)移植内核 d)制作根文件系统然后通过nfs方式让开发板可以加载 3 内核驱动开发的基本知识 a)如何学驱动编程? i.最好的老师就是内核源码(没有man 功能) 1.要是用某个函数就去查看某个函数的定义注释 2.查看内核中其他模块儿时如何使用该函数的 3.专业书籍: a)内核开发:linux内核的设计与实现机械工程出版社 b)驱动开发:圣经级别的-LDD3:LINUX DEVICE c)操作性别叫强的:精通linux设备驱动程序开发

关于linux内核: 1)linux内核中所使用的函数都是自身实现的它肯定不会调用c库中的函数 2)linux中代码绝大多数代码时gun c语言完成的不是标准c语言可以理解为标c的扩展版和少部分汇编 需要注意的问题: 1)内核态不能做浮点数运算 2)用户空间的每个进程都有独立的0-3G的虚拟空间 多个进程共享同一个内核 内核使用的地址空间为3G-4G 3)每个线程有独立的栈空间 4 写一个最简单的内核模块儿(因为驱动时内核的一个模块套路都一样) a)几个宏 i.__FUNCTION__:展开为所在函数的名称 ii.__LINE__:展开为printk所在的行号 iii.__DATE__:展开为编译程序的日期 b)通用头文件 i.#include ii.#include c)没有main函数 然后写一个makefile 其中:obj -m +=helloworld.o -m表示生成模块儿 make -C 内核路径编译对象路径modules(固定表示模块儿) 例子:make -C /home/changjian/dirver/kernel M=$(PWD) modules 报错:如taints kernel(污染内核)因为写的驱动没有声明license 因为linux为开源所以写的驱动也必须声明为开源可以在程序里加入:MODULE_LICENSE(“GPL”);声明为开源 模块儿驱动开发 1、模块儿参数 a)内核中安装模块时也可以传递参数 i.insmod xx.ko var=123 b)模块参数的使用方法 i.首先在模块中定义全局变量 ii.然后使用module_param 或者module_param_array来修饰该变量 这样一个普通的全局变量就变成可以安装模块时传递参数的模块参数 module_param(name,type,perm) name:变量名称 type: name的类型(不包括数组) perm:权限类型rwxr-x 等类型内核做了相关的宏定义形如efine S_IRWXG 表示r w x g(同组) module_param_array(name,type,nump,perm)将某个数组声明为模块 参数

Linux设备驱动程序说明介绍

Linux设备驱动程序简介 Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel 中的函数,有些常用的操作要自己来编写,而且调试也不方便。本人这几周来为实验室自行研制的一块多媒体卡编制了驱动程序,获得了一些经验,愿与Linux fans共享,有不当之处,请予指正。 以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux A-Z,还有清华BBS上的有关device driver的一些资料. 这些资料有的已经过时,有的还有一些错误,我依据自己的试验结果进行了修正. 一、Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作.设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放. 2.把数据从内核传送到硬件和从硬件读取数据. 3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据. 4.检测和处理设备出现的错误. 在Linux操作系统下有两类主要的设备文件类型,一种是字符设备,另一种是块设备.字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作.块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待. 已经提到,用户进程是通过设备文件来与实际的硬件打交道.每个设备文件都都有其文件属性(c/b),表示是字符设备还蔤强樯璞?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们.设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序. 最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度.也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作.如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck. 读/写时,它首先察看缓冲区的内容,如果缓冲区的数据 如何编写Linux操作系统下的设备驱动程序 二、实例剖析 我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理.把下面的C代码输入机器,你就会获得一个真正的设备驱动程序.不过我的kernel是2.0.34,在低版本的kernel上可能会出现问题,我还没测试过. [code]#define __NO_VERSION__

如何快速看懂图纸

如何看懂建筑施工图 首先自己要多多努力,有这样一个决心一定要看懂图纸. 其实图纸并不是什么难的东西,多与现场接触,多对照图纸你会收益很多 图纸就是平立剖,结合着看。其实建筑图的个层平面也是剖出来的,剖的位置是窗台以上。你要记住小到线条的识别、符号代表的意义,大到图纸的组织、构件的拆装等,。 要做预算的话,就不光是识图了,设计的知识比较多了,钢筋,水泥,构件,材料,施工方法,机械等等。 ----多问:实践中,多拿图纸与实际施工来比照,不懂多问。做到不耻下问(向有经验的人,知道的人问),然后参照实物自己研究。 --多请教:经常请教高人师傅们,做到脚勤,手勤,嘴勤一定会对自己大有帮助的. ---多看看相关建筑书籍,,做到理论和实践相结合:最好找份图纸自己钻研的看,如果旁边有高人的话,把从图纸中看到的问题记下来,再请教高人.然后再看图纸,再请教高人.如此反复.在此过程中要经常去施工现场一线去看实际的东西,做到大脑中有整体的概念性的东西,如果看不懂就问工人,工人一般都会乐意告诉.前者为理论,后者为实践.做到理论和实践相结合,我想是最快看懂图纸的方法. 知识的积累是需要过程的。给你三个建议: 一、多看图纸,看不懂的地方记录下来,不要想当然。然后通过请教师傅或者查资料解决问题。 二、多看图集,如果不知道看什么样的图集,图纸上应该有很多是引用图集的地方,你就先看图纸上提到的图集。 三、把解决的问题都记录下来,因为好记性不如烂笔头,过后还可以复查。 要想快速学会识图,注意以下几点: 1.弄明白制图原理,这在制图识图教材上都有,认真理解和认真想象; 2.拿一份稍微简单一点的建筑施工图纸对照施工现场去比较,看看实物与图纸的关系; 3.对照图纸和实物看看已经有的预算是怎么编制的,包括内容、顺序、方法和定额选用等等 4.在此阶段多吃一些苦,多请教一些有经验的人; 5.学会识图只是编制和审核预算工作的第一步,接下来还要学习定额构成及规则,工程造价原理、建筑材料和构件等知识,只要努力,你一定会较快的进入角色,何况你在计算机应用及预算软件应用方面还有优势呢,祝你成功。

相关文档
相关文档 最新文档