版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 一、 課程設(shè)計(jì)目的</b></p><p> Linux 系統(tǒng)的開(kāi)源性使其在嵌入式系統(tǒng)的開(kāi)發(fā)中得到了越來(lái)越廣泛的應(yīng)用,但其本身并沒(méi)有對(duì)種類繁多的硬件設(shè)備都提供現(xiàn)成的驅(qū)動(dòng)程序,特別是由于工程應(yīng)用中的靈活性,其驅(qū)動(dòng)程序更是難以統(tǒng)一,這時(shí)就需開(kāi)發(fā)一套適合于自己產(chǎn)品的設(shè)備驅(qū)動(dòng)。對(duì)用戶而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供了一致的接口,一般來(lái)說(shuō)是把設(shè)
2、備映射為一個(gè)特殊的設(shè)備文件,用戶程序可以像對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作。</p><p> 通過(guò)這次課程設(shè)計(jì)可以了解linux的模塊機(jī)制,懂得如何加載模塊和卸載模塊,進(jìn)一步熟悉模塊的相關(guān)操作。加深對(duì)驅(qū)動(dòng)程序定義和設(shè)計(jì)的了解,了解linux驅(qū)動(dòng)的編寫(xiě)過(guò)程,提高自己的動(dòng)手能力。</p><p> 二、 課程設(shè)計(jì)內(nèi)容與要求</p><p><b>
3、字符設(shè)備驅(qū)動(dòng)程序 </b></p><p> 1、設(shè)計(jì)目的:掌握設(shè)備驅(qū)動(dòng)程序的編寫(xiě)、編譯和裝載、卸載方法,了解設(shè)備文件的創(chuàng)建,并知道如何編寫(xiě)測(cè)試程序測(cè)試自己的驅(qū)動(dòng)程序是否能夠正常工作 </p><p><b> 2、設(shè)計(jì)要求: </b></p><p> 1) 編寫(xiě)一個(gè)簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)程序,該字符設(shè)備包括打開(kāi)、讀、寫(xiě)、I\O
4、控制與釋放五個(gè)基本操作。 </p><p> 2) 編寫(xiě)一個(gè)測(cè)試程序,測(cè)試字符設(shè)備驅(qū)動(dòng)程序的正確性。 </p><p> 3) 要求在實(shí)驗(yàn)報(bào)告中列出Linux內(nèi)核的版本與內(nèi)核模塊加載過(guò)程。</p><p> 三、 系統(tǒng)分析與設(shè)計(jì) </p><p><b> 1、系統(tǒng)分析</b></p><p&
5、gt; 系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下的功能:</p><p> 1、對(duì)設(shè)備初始化和釋放;</p><p> 2、把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)
6、據(jù);</p><p> 3、讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);</p><p> 4、檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。</p><p> 字符設(shè)備提供給應(yīng)用程序的是一個(gè)流控制接口,主要包括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等。在系統(tǒng)中添加
7、一個(gè)字符設(shè)備驅(qū)動(dòng)程序,實(shí)際上就是給上述操作添加對(duì)應(yīng)的代碼。對(duì)于字符設(shè)備和塊設(shè)備,L i n u x內(nèi)核對(duì)這些操作進(jìn)行了統(tǒng)一的抽象,把它們定義在結(jié)構(gòu)體fi le_operations中。</p><p><b> 2、系統(tǒng)設(shè)計(jì):</b></p><p><b> 2.1、模塊設(shè)計(jì):</b></p><p><b&g
8、t; 2.2數(shù)據(jù)結(jié)構(gòu)說(shuō)明</b></p><p> 字符設(shè)備驅(qū)動(dòng)主要應(yīng)用了三種數(shù)據(jù)結(jié)構(gòu):①file_operations結(jié)構(gòu),這是設(shè)備驅(qū)動(dòng)程序所提供的一組用一個(gè)結(jié)構(gòu)向系統(tǒng)進(jìn)行說(shuō)明的入口點(diǎn);②file結(jié)構(gòu),主要用于與文件系統(tǒng)對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序。代表一個(gè)打開(kāi)的文件,它由內(nèi)核在open時(shí)創(chuàng)建,并傳遞給在該文件上進(jìn)行操作的所有函數(shù),直到碰到最后的close函數(shù)。在文件的所有實(shí)例都被關(guān)閉之后,內(nèi)核會(huì)釋放這個(gè)
9、數(shù)據(jù)結(jié)構(gòu);③ inode結(jié)構(gòu),提供了關(guān)于特殊設(shè)備文件/dev/mydev的信息。</p><p> 各個(gè)結(jié)構(gòu)的定義如下:</p><p> ?。?)file_operations結(jié)構(gòu):</p><p> static const struct file_operations my_fops ={</p><p> .owner = TH
10、IS_MODULE,</p><p> .llseek = my_llseek,</p><p> .read = my_read,</p><p> .write = my_write,</p><p> .open = my_open,</p><p> .release = my_release,<
11、;/p><p> .unlocked_ioctl = ioctl,</p><p><b> };</b></p><p> (2)file結(jié)構(gòu):</p><p><b> 1)讀</b></p><p> static ssize_t my_read(struct f
12、ile *filp, char __user *buf, size_t size, loff_t *ppos) </p><p><b> 2)寫(xiě)</b></p><p> static ssize_t my_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
13、</p><p> 3)seek文件定位</p><p> static loff_t my_llseek(struct file *filp, loff_t offset, int whence)</p><p><b> 4)I\O控制</b></p><p> static int ioctl (struc
14、t file *file, unsigned int cmd, unsigned long arg)</p><p> ?。?)inode結(jié)構(gòu):</p><p><b> 1) 打開(kāi)</b></p><p> int my_open(struct inode *inode, struct file *filp)</p><
15、;p><b> 2) 釋放</b></p><p> int my_release(struct inode *inode, struct file *filp)</p><p> 2.3、算法流程圖:</p><p> 四、系統(tǒng)測(cè)試與調(diào)試分析</p><p><b> 4.1 系統(tǒng)測(cè)試<
16、/b></p><p> 4.1.1啟動(dòng)超級(jí)管理員模式并輸入密碼</p><p> 命令:sudo su</p><p> 4.1.2對(duì)源程序進(jìn)行編譯</p><p><b> 命令:make</b></p><p> 4.1.3加載驅(qū)動(dòng)程序并查看</p><p
17、> 命令:insmod lydev.ko和lsmod</p><p> 4.1.4顯示主設(shè)備號(hào)</p><p> 命令:cat /proc/devices</p><p> 4.1.5創(chuàng)建節(jié)點(diǎn)并查看</p><p> 命令:mknod /dev/lydev 55 0和cd /dev</p><p>
18、4.1.6編譯測(cè)試程序</p><p> 命令:gcc –o t test.c</p><p> 4.1.7運(yùn)行測(cè)試函數(shù)</p><p><b> 命令:./t</b></p><p> 4.1.8進(jìn)行打開(kāi)設(shè)備操作</p><p><b> 命令:1</b><
19、/p><p> 4.1.9進(jìn)行寫(xiě)操作并輸入hello</p><p><b> 命令:2</b></p><p> 4.1.10進(jìn)行讀操作</p><p><b> 命令:3</b></p><p> 4.1.11進(jìn)行I/O控制</p><p>
20、<b> 命令:4</b></p><p> 4.1.12進(jìn)行釋放設(shè)備操作</p><p><b> 命令:5</b></p><p> 4.1.13進(jìn)行退出操作</p><p><b> 命令:6</b></p><p> 4.1.14卸載
21、驅(qū)動(dòng)程序</p><p> 命令:rmmod lydev</p><p> 4.1.15查看日志</p><p><b> 命令:dmesg</b></p><p> 4.1.16刪除節(jié)點(diǎn)并查看</p><p> 命令:rm lydev和ls</p><p>&l
22、t;b> 4.2調(diào)試分析</b></p><p> 最開(kāi)始的時(shí)候沒(méi)有啟用sudo模式,導(dǎo)致很多命令不能執(zhí)行,啟用模式的時(shí)候需要輸入密碼,但是輸入密碼的時(shí)候是不顯示東西的以為出錯(cuò),查閱資料之后才知道是應(yīng)有的現(xiàn)象。</p><p> 程序測(cè)試一遍之后再次測(cè)試很多命令不能執(zhí)行,原因是第一次測(cè)試之后產(chǎn)生的各種文件沒(méi)有刪除,再次測(cè)試會(huì)顯示已存在。</p><
23、;p> 有一次測(cè)試程序,不能卸載驅(qū)動(dòng),用lsmod查看有兩個(gè)進(jìn)程使用,后來(lái)強(qiáng)制關(guān)機(jī)才能正常使用,原因不明,以后要加強(qiáng)學(xué)習(xí)。</p><p><b> 五、程序清單</b></p><p><b> 1.主程序</b></p><p> #include <linux/module.h></p
24、><p> #include <linux/types.h></p><p> #include <linux/fs.h></p><p> #include <linux/errno.h></p><p> #include <linux/mm.h></p><p>
25、; #include <linux/sched.h></p><p> #include <linux/init.h></p><p> #include <linux/cdev.h></p><p> #include <linux/slab.h></p><p> #include
26、 <asm/io.h></p><p> #include <asm/system.h></p><p> #include <asm/uaccess.h></p><p> #include "lydev.h"</p><p> #define SCULL_IOC_MAGIC
27、'k'</p><p> #define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)</p><p> #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)</p><p> #define SCULL_IOCSQSET _IOW(SCULL_IOC_M
28、AGIC, 2, int)</p><p> #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)</p><p> #define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)</p><p> #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MA
29、GIC, 5, int)</p><p> #define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)</p><p> #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC, 7)</p><p> #define SCULL_IOCQQSET _IO(SCULL_IOC_M
30、AGIC, 8)</p><p> #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)</p><p> #define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)</p><p> #define SCULL_IOCHQUANTUM _IO(SCUL
31、L_IOC_MAGIC, 11)</p><p> #define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)</p><p> #define SCULL_IOC_MAXNR 14</p><p> static int ly_major = 55;</p><p> module_param(l
32、y_major, int, S_IRUGO);</p><p> struct ly_dev *ly_devp; /*設(shè)備結(jié)構(gòu)體指針*/</p><p> struct cdev cdev;</p><p> static int ioctl (struct file *file, unsigned int cmd, unsigned long arg);
33、</p><p> /*文件打開(kāi)函數(shù)*/</p><p> int ly_open(struct inode *inode, struct file *filp)</p><p><b> {</b></p><p> struct ly_dev *dev;</p><p> /*獲取次
34、設(shè)備號(hào)*/</p><p> int num = MINOR(inode->i_rdev);</p><p> if (num >= MYDEV_NR_DEVS)</p><p> return -ENODEV;</p><p> dev = &ly_devp[num];</p><p>
35、 /*將設(shè)備描述結(jié)構(gòu)指針賦值給文件私有數(shù)據(jù)指針*/</p><p> filp->private_data = dev;</p><p><b> return 0;</b></p><p><b> }</b></p><p> /*文件釋放函數(shù)*/</p><p
36、> int ly_release(struct inode *inode, struct file *filp)</p><p><b> {</b></p><p><b> return 0;</b></p><p><b> }</b></p><p>&l
37、t;b> /*讀函數(shù)*/</b></p><p> static ssize_t ly_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)</p><p><b> {</b></p><p> unsigned long p = *
38、ppos;</p><p> unsigned int count = size;</p><p> int ret = 0;</p><p> struct ly_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/</p><p> /*判斷讀位置是否有效*/</p><
39、;p> if (p >= MYDEV_SIZE)</p><p><b> return 0;</b></p><p> if (count > MYDEV_SIZE - p)</p><p> count = MYDEV_SIZE - p;</p><p> /*讀數(shù)據(jù)到用戶空間*/<
40、/p><p> if (copy_to_user(buf, (void*)(dev->data + p), count))</p><p><b> {</b></p><p> ret = - EFAULT;</p><p><b> }</b></p><p>
41、<b> else</b></p><p><b> {</b></p><p> *ppos += count;</p><p> ret = count; </p><p> printk(KERN_INFO "read %d bytes(s) from %lx\n"
42、;, count, p);</p><p><b> }</b></p><p> return ret;</p><p><b> }</b></p><p><b> /*寫(xiě)函數(shù)*/</b></p><p> static ssize_t
43、ly_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)</p><p><b> {</b></p><p> unsigned long p = *ppos;</p><p> unsigned int count = size;<
44、;/p><p> int ret = 0;</p><p> struct ly_dev *dev = filp->private_data; /*獲得設(shè)備結(jié)構(gòu)體指針*/</p><p> /*分析和獲取有效的寫(xiě)長(zhǎng)度*/</p><p> if (p >= MYDEV_SIZE)</p><p><
45、;b> return 0;</b></p><p> if (count > MYDEV_SIZE - p)</p><p> count = MYDEV_SIZE - p;</p><p> /*從用戶空間寫(xiě)入數(shù)據(jù)*/</p><p> if (copy_from_user(dev->data + p
46、, buf, count))</p><p> ret = - EFAULT;</p><p><b> else</b></p><p><b> {</b></p><p> *ppos += count;</p><p> ret = count;</p
47、><p> printk(KERN_INFO "written %d bytes(s) from %lx\n", count, p);</p><p><b> }</b></p><p> return ret;</p><p><b> }</b></p>
48、<p> /*I\O控制函數(shù)*/</p><p> static int ioctl (struct file *file, unsigned int cmd, unsigned long arg)</p><p><b> {</b></p><p> if(_IOC_TYPE(cmd)!=SCULL_IOC_MAGIC)&
49、lt;/p><p><b> {</b></p><p> return -EFAULT;</p><p><b> }</b></p><p> if(_IOC_NR(cmd)>SCULL_IOC_MAXNR)</p><p><b> {</b
50、></p><p> return -EFAULT;</p><p><b> }</b></p><p> switch(cmd)</p><p><b> {</b></p><p> case SCULL_IOCRESET:</p><
51、;p> printk("SCULL_IOCRESET + %lx",arg);</p><p><b> break;</b></p><p> case SCULL_IOCSQUANTUM: /* Set: arg points to the value */</p><p> printk("SC
52、ULL_IOCSQUANTUM + %lx",arg);</p><p><b> break;</b></p><p> case SCULL_IOCTQUANTUM: /* Tell: arg is the value */</p><p> printk("SCULL_IOCTQUANTUM + %lx"
53、;,arg);</p><p><b> break;</b></p><p> case SCULL_IOCGQUANTUM: /* Get: arg is pointer to result */</p><p> printk("SCULL_IOCGQUANTUM + %lx",arg);</p>
54、<p><b> break;</b></p><p> case SCULL_IOCQQUANTUM: /* Query: return it (it's positive) */</p><p> printk("SCULL_IOCQQUANTUM + %lx",arg);</p><p><
55、;b> break;</b></p><p> case SCULL_IOCXQUANTUM: /* eXchange: use arg as pointer */</p><p> printk("SCULL_IOCXQUANTUM + %lx",arg);</p><p><b> break;</b
56、></p><p> case SCULL_IOCHQUANTUM: /* sHift: like Tell + Query */</p><p> printk("SCULL_IOCHQUANTUM + %lx",arg);</p><p><b> break;</b></p><p>
57、;<b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> /* seek文件定位函數(shù) */</p><p> static loff_t ly_llseek(struct file *filp
58、, loff_t offset, int whence)</p><p><b> {</b></p><p> loff_t newpos;</p><p> switch(whence) {</p><p> case 0: /* SEEK_SET */</p><p> newpo
59、s = offset;</p><p><b> break;</b></p><p> case 1: /* SEEK_CUR */</p><p> newpos = filp->f_pos + offset;</p><p><b> break;</b></p>
60、<p> case 2: /* SEEK_END */</p><p> newpos = MYDEV_SIZE -1 + offset;</p><p><b> break;</b></p><p> default: /* can't happen */</p><p> return
61、-EINVAL;</p><p><b> }</b></p><p> if ((newpos<0) || (newpos>MYDEV_SIZE))</p><p> return -EINVAL; </p><p> filp->f_pos = newpos;</p><
62、p> return newpos;</p><p><b> }</b></p><p> /*文件操作結(jié)構(gòu)體*/</p><p> static const struct file_operations ly_fops =</p><p><b> {</b></p>
63、<p> .owner = THIS_MODULE,</p><p> .llseek = ly_llseek,</p><p> .read = ly_read,</p><p> .write = ly_write,</p><p> .open = ly_open,</p><p> .r
64、elease = ly_release,</p><p> .unlocked_ioctl = ioctl,</p><p><b> };</b></p><p> /*設(shè)備驅(qū)動(dòng)模塊加載函數(shù)*/</p><p> static int lydev_init(void)</p><p>&
65、lt;b> {</b></p><p> int result;</p><p><b> int i;</b></p><p> dev_t devno = MKDEV(ly_major, 0);</p><p> /* 靜態(tài)申請(qǐng)?jiān)O(shè)備號(hào)*/</p><p> if
66、(ly_major)</p><p> result = register_chrdev_region(devno, 2, "lydev");</p><p> else /* 動(dòng)態(tài)分配設(shè)備號(hào) */</p><p><b> {</b></p><p> result = alloc_chrd
67、ev_region(&devno, 0, 2, "lydev");</p><p> ly_major = MAJOR(devno);</p><p><b> }</b></p><p> if (result < 0)</p><p> return result;</
68、p><p> /*初始化cdev結(jié)構(gòu)*/</p><p> cdev_init(&cdev, &ly_fops);</p><p> cdev.owner = THIS_MODULE;</p><p> cdev.ops = &ly_fops;</p><p> /* 注冊(cè)字符設(shè)備 */&
69、lt;/p><p> cdev_add(&cdev, MKDEV(ly_major, 0), MYDEV_NR_DEVS);</p><p> /* 為設(shè)備描述結(jié)構(gòu)分配內(nèi)存*/</p><p> ly_devp = kmalloc(MYDEV_NR_DEVS * sizeof(struct ly_dev), GFP_KERNEL);</p>
70、<p> if (!ly_devp) /*申請(qǐng)失敗*/</p><p><b> {</b></p><p> result = - ENOMEM;</p><p> goto fail_malloc;</p><p><b> }</b></p><p>
71、; memset(ly_devp, 0, sizeof(struct ly_dev));</p><p> /*為設(shè)備分配內(nèi)存*/</p><p> for (i=0; i < MYDEV_NR_DEVS; i++)</p><p><b> {</b></p><p> ly_devp[i].size
72、= MYDEV_SIZE;</p><p> ly_devp[i].data = kmalloc(MYDEV_SIZE, GFP_KERNEL);</p><p> memset(ly_devp[i].data, 0, MYDEV_SIZE);</p><p><b> }</b></p><p> printk
73、("模塊加載成功!\n");</p><p><b> return 0;</b></p><p> fail_malloc:</p><p> unregister_chrdev_region(devno, 1);</p><p> return result;</p><
74、;p><b> }</b></p><p> /*模塊卸載函數(shù)*/</p><p> static void lydev_exit(void)</p><p><b> {</b></p><p> cdev_del(&cdev); /*注銷設(shè)備*/</p>&
75、lt;p> kfree(ly_devp); /*釋放設(shè)備結(jié)構(gòu)體內(nèi)存*/ unregister_chrdev_region(MKDEV(ly_major, 0), 2); /*釋放設(shè)備號(hào)*/</p><p> printk("模塊卸載成功!\n");</p><p><b> }</b></p><p> MO
76、DULE_LICENSE("GPL");</p><p> module_init(lydev_init);</p><p> module_exit(lydev_exit);</p><p><b> 2.測(cè)試程序</b></p><p> #include <stdio.h>&
77、lt;/p><p> #include<sys/types.h></p><p> #include<unistd.h></p><p> #include<fcntl.h></p><p> #include<linux/rtc.h></p><p> #incl
78、ude<linux/ioctl.h></p><p> #include <string.h></p><p> #include <stdlib.h></p><p> #define MAXBUF 20</p><p> #define SCULL_IOC_MAGIC 'k'&l
79、t;/p><p> #define SCULL_IOCRESET _IO(SCULL_IOC_MAGIC, 0)</p><p> #define SCULL_IOCSQUANTUM _IOW(SCULL_IOC_MAGIC, 1, int)</p><p> #define SCULL_IOCSQSET _IOW(SCULL_IOC_MAGIC, 2, int)
80、</p><p> #define SCULL_IOCTQUANTUM _IO(SCULL_IOC_MAGIC, 3)</p><p> #define SCULL_IOCTQSET _IO(SCULL_IOC_MAGIC, 4)</p><p> #define SCULL_IOCGQUANTUM _IOR(SCULL_IOC_MAGIC, 5, int)&
81、lt;/p><p> #define SCULL_IOCGQSET _IOR(SCULL_IOC_MAGIC, 6, int)</p><p> #define SCULL_IOCQQUANTUM _IO(SCULL_IOC_MAGIC, 7)</p><p> #define SCULL_IOCQQSET _IO(SCULL_IOC_MAGIC, 8)</
82、p><p> #define SCULL_IOCXQUANTUM _IOWR(SCULL_IOC_MAGIC, 9, int)</p><p> #define SCULL_IOCXQSET _IOWR(SCULL_IOC_MAGIC,10, int)</p><p> #define SCULL_IOCHQUANTUM _IO(SCULL_IOC_MAGIC,
83、11)</p><p> #define SCULL_IOCHQSET _IO(SCULL_IOC_MAGIC, 12)</p><p> #define SCULL_IOC_MAXNR 14</p><p> int main()</p><p><b> {</b></p><p>
84、 int testdev;</p><p> int i,flag = 1,t,len = -1;</p><p><b> char sel;</b></p><p> char buf[MAXBUF],tmp[MAXBUF];</p><p> printf("1、打開(kāi)設(shè)備\n2、寫(xiě)操作\n3、讀操
85、作\n4、I/O控制\n5、釋放設(shè)備\n6、退出\n");</p><p> while(1) {</p><p> printf("請(qǐng)輸入要執(zhí)行的操作:");</p><p> sel = getchar();</p><p> getchar();</p><p> swit
86、ch(sel) { </p><p> case '1':testdev = open("/dev/lydev",O_RDWR);</p><p> if ( testdev < 0 ) {</p><p> printf("設(shè)備打開(kāi)失敗 \n");</p><p>&
87、lt;b> break;</b></p><p><b> }</b></p><p><b> flag = 0;</b></p><p> printf("設(shè)備打開(kāi)成功!\n"</p><p><b> break; </b>
88、;</p><p> /*case '2':if (flag) {</p><p> printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b> break;</b></p><p><b> }</b></p><p>
89、 printf("請(qǐng)輸入寫(xiě)入的字符串:");</p><p> gets(tmp);</p><p> len = strlen(tmp);</p><p> printf("len = %d\n",len);</p><p> t = write(testdev,tmp,len);</p
90、><p> if (t < 0) {</p><p> printf("寫(xiě)操作失?。n");</p><p><b> break;</b></p><p><b> }</b></p><p> printf("%s字符串寫(xiě)入成功
91、!\n",tmp);</p><p><b> break;</b></p><p> case '3':if (flag) {</p><p> printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b> break;</b></
92、p><p><b> }</b></p><p> if (len < 0) {</p><p> printf("請(qǐng)先進(jìn)行寫(xiě)操作!\n");</p><p><b> break;</b></p><p><b> }</b&
93、gt;</p><p> t = read(testdev,buf,len);</p><p> if (t < 0) {</p><p> printf("讀操作失??!\n");</p><p><b> break;</b></p><p><b>
94、 }</b></p><p> printf("讀操作成功!結(jié)果為:%s\n",buf);</p><p><b> break;*/</b></p><p> case '2':if (flag) {</p><p> printf("請(qǐng)先打開(kāi)設(shè)備!\
95、n");</p><p><b> continue;</b></p><p><b> }</b></p><p> printf("請(qǐng)輸入要寫(xiě)入的字符串:");</p><p> gets(tmp);</p><p> len =
96、sizeof(tmp);//strlen(tmp);</p><p> t = write(testdev,tmp,len);</p><p> if(t < 0) {</p><p> perror("寫(xiě)操作失??!\n");</p><p><b> exit(-1);</b><
97、/p><p><b> }</b></p><p> printf("字符串:%s寫(xiě)入成功!\n",tmp);</p><p><b> break;</b></p><p> case '3':if (flag) {</p><p>
98、 printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b> continue;</b></p><p><b> }</b></p><p> lseek(testdev,0,SEEK_SET);</p><p> t = read(testdev,buf,l
99、en);</p><p> if(t < 0) {</p><p> perror("讀操作失??!\n");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> printf(&qu
100、ot;讀操作成功!結(jié)果為:%s\n",buf);</p><p><b> break;</b></p><p> case '4':if (flag) {</p><p> printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b> break;&
101、lt;/b></p><p><b> }</b></p><p> t = ioctl(testdev,SCULL_IOCTQUANTUM,3);</p><p> if(t < 0) {</p><p> printf("IO控制失敗\n");</p><p
102、><b> } else {</b></p><p> printf("IO控制成功\n");</p><p><b> }</b></p><p><b> break;</b></p><p> case '5':if (
103、flag) {</p><p> printf("請(qǐng)先打開(kāi)設(shè)備!\n");</p><p><b> break;</b></p><p><b> }</b></p><p> //release(testdev);</p><p> clos
104、e(testdev);</p><p> printf("設(shè)備釋放成功!\n");</p><p><b> flag = 1;</b></p><p><b> break;</b></p><p> case '6':close(testdev);&l
105、t;/p><p><b> exit(0);</b></p><p> default:printf("輸入有誤!\n");</p><p><b> break;</b></p><p><b> }</b></p><p>&
106、lt;b> }</b></p><p><b> }</b></p><p><b> 六、體會(huì)與自我評(píng)價(jià)</b></p><p> 在這次課程設(shè)計(jì)之前從沒(méi)有接觸過(guò)Linux系統(tǒng),Linux系統(tǒng)這個(gè)詞作為計(jì)算機(jī)系的學(xué)生都不會(huì)陌生,多多少少也知道些它的歷史,知道它是開(kāi)放的免費(fèi)的操作系統(tǒng),支持開(kāi)源軟件
107、的開(kāi)發(fā),但是,Linux系統(tǒng)到底是怎樣的一個(gè)系統(tǒng),甚至對(duì)它的界面都從未見(jiàn)過(guò)。這次課程設(shè)計(jì)使我接觸并了解了Linux系統(tǒng),見(jiàn)識(shí)了它的界面以及種種與Windos系統(tǒng)不同之處,增長(zhǎng)了見(jiàn)識(shí)。</p><p> 驅(qū)動(dòng)相較于Linux系統(tǒng)是更加熟悉的一個(gè)名詞,每次重裝系統(tǒng)都要安裝各種各樣的驅(qū)動(dòng),不然計(jì)算機(jī)就不能正常運(yùn)行,各個(gè)硬件就不能發(fā)揮作用,通過(guò)這次課程設(shè)計(jì),對(duì)Linux系統(tǒng)的驅(qū)動(dòng)有了比較深入的認(rèn)識(shí):。Linux下的設(shè)備
108、驅(qū)動(dòng)程序分為字符設(shè)備驅(qū)動(dòng)、快設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序。驅(qū)動(dòng)程序在硬件和軟件之間起紐帶的作用,用戶進(jìn)程是通過(guò)設(shè)備文件來(lái)與實(shí)際的硬件打交道.每個(gè)設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還塊設(shè)備。另外每個(gè)文件都有兩個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序,第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同的硬件設(shè)備。</p><p> 這次的課程設(shè)計(jì)提高了自己的自我學(xué)習(xí)能力和交流能力,Linux系統(tǒng)是以前學(xué)
109、習(xí)從未接觸到的東西,為了完成設(shè)計(jì),需要自己查詢各種資料,并且與同學(xué)交流學(xué)習(xí)心得,討論程序運(yùn)行的細(xì)節(jié),完善自己的程序。</p><p> 這次課程設(shè)計(jì)使我反省很多,無(wú)論Linux還是驅(qū)動(dòng)程序都是掛在嘴邊的東西,但是對(duì)于這些自己并沒(méi)有進(jìn)行過(guò)深入的了解,導(dǎo)致這次課程設(shè)計(jì)一切都要從頭開(kāi)始,進(jìn)行的并不順利,以后對(duì)于一些經(jīng)常提起,在將來(lái)有可能用的到的東西要未雨綢繆,先做了解,將來(lái)的時(shí)候才能輕松應(yīng)對(duì),事半功倍。</p&
110、gt;<p><b> 七、參考文獻(xiàn)</b></p><p> [1] 湯子瀛 編著,《計(jì)算機(jī)操作系統(tǒng)(修訂版)》,西安電子科技大學(xué)出版社,2001年</p><p> [2] Alessandro Rubini.Linux設(shè)備驅(qū)動(dòng)程序[M].魏永明,耿兵,鐘書(shū)毅,譯.北京:中國(guó)電力出版社,2006.</p><p> [
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 字符設(shè)備驅(qū)動(dòng)程序課程設(shè)計(jì)報(bào)告
- linux字符設(shè)備驅(qū)動(dòng)-畢業(yè)論文
- linux字符設(shè)備驅(qū)動(dòng)程序編寫(xiě)基本流程
- linux課程設(shè)計(jì)報(bào)告
- linux課程設(shè)計(jì)---linux操作系統(tǒng)u盤驅(qū)動(dòng)設(shè)計(jì)分析報(bào)告
- 課程設(shè)計(jì)報(bào)告----通用示波器顯示字符
- linux課程設(shè)計(jì)報(bào)告--linux操作系統(tǒng)應(yīng)用
- linux程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告-- linux c 程序設(shè)計(jì)
- 課程設(shè)計(jì)報(bào)告--六進(jìn)制字符發(fā)生器
- c++課程設(shè)計(jì)報(bào)告--字符串處理
- linux課程設(shè)計(jì)論文
- linux課程設(shè)計(jì)論文
- linux課程設(shè)計(jì)76359
- linux課程設(shè)計(jì)76359
- 微機(jī)原理課程設(shè)計(jì)報(bào)告-字符串分類統(tǒng)計(jì)
- 課程設(shè)計(jì)--字符串類
- 課程設(shè)計(jì)--- 字符串排序
- linux內(nèi)核裁剪課程設(shè)計(jì)
- 單片機(jī)字符點(diǎn)陣課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論