• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      從數(shù)據(jù)關(guān)聯(lián)的角度剖析字符設(shè)備驅(qū)動(dòng)中的初始化函數(shù)

      2019-05-24 14:12:12劉海秋馬慧敏江朝暉
      電腦知識(shí)與技術(shù) 2019年7期
      關(guān)鍵詞:嵌入式系統(tǒng)

      劉海秋 馬慧敏 江朝暉

      摘要:嵌入式系統(tǒng)的應(yīng)用覆蓋了消費(fèi)類(lèi)電子、智能家居、汽車(chē)電子等諸多領(lǐng)域,字符設(shè)備驅(qū)動(dòng)是嵌入式系統(tǒng)課程教學(xué)中的重點(diǎn)和難點(diǎn)內(nèi)容,其中初始化函數(shù)作為向Linux內(nèi)核加載驅(qū)動(dòng)程序的入口函數(shù),實(shí)現(xiàn)了字符設(shè)備、設(shè)備文件和設(shè)備驅(qū)動(dòng)之間的相互關(guān)聯(lián)。介紹了有關(guān)初始化函數(shù)的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)體,深入剖析了關(guān)鍵數(shù)據(jù)結(jié)構(gòu)體之間的信息傳遞模式和關(guān)系建立方法,并給出了初始化函數(shù)的典型代碼結(jié)構(gòu)。本研究有助于電子信息工程等相關(guān)專(zhuān)業(yè)的學(xué)生對(duì)字符設(shè)備驅(qū)動(dòng)程序中初始化函數(shù)的理解,提高學(xué)生在嵌入式系統(tǒng)應(yīng)用開(kāi)發(fā)中的實(shí)踐能力。

      關(guān)鍵詞:嵌入式系統(tǒng);字符設(shè)備驅(qū)動(dòng);初始化函數(shù);數(shù)據(jù)關(guān)聯(lián)

      中圖分類(lèi)號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A

      文章編號(hào):1009-3044(2019)07-0013-04

      Abstract:Embedded systems have been applied to many fields, such as consumer electronics, intelligent households and automotive electronics. Character device drivers are the key and difficult contents in embedded systems teaching. Initialization functions, as entries into the Linux kernel, implement the correlation between character devices, device files and device drivers. In this study, pivotal data structures associated with initialization functions are first introduced, and information transfer mode and the relation establishment method between the pivotal data structures are then analyzed, finally, the typical code structures of initialization functions are present. This study is expected to help students in electronic information engineering and other related majors understand the initialization function in the character device drivers and improve their practical abilities in the application and development of embedded systems.

      Key words:Embedded systems;Character device drivers;Initialization functions;Data association

      1 引言

      近年來(lái),嵌入式系統(tǒng)廣泛應(yīng)用于消費(fèi)類(lèi)電子、智能家居、汽車(chē)電子、醫(yī)療電子等諸多領(lǐng)域[1],幾乎人手一部的智能手機(jī)是嵌入式系統(tǒng)的一項(xiàng)典型應(yīng)用,嵌入式系統(tǒng)電子產(chǎn)品正在改變?nèi)藗兩詈凸ぷ鞣绞剑瑫r(shí),也激發(fā)了社會(huì)對(duì)嵌入式系統(tǒng)開(kāi)發(fā)高級(jí)人才的強(qiáng)烈需求[2-5]。為此,各大高校的電子信息工程、自動(dòng)控制、通信工程等相關(guān)專(zhuān)業(yè)相繼開(kāi)設(shè)了“嵌入式系統(tǒng)”課程,以培養(yǎng)學(xué)生掌握嵌入式系統(tǒng)開(kāi)發(fā)技術(shù),適應(yīng)社會(huì)對(duì)嵌入式人才的需求[6-8]。

      字符設(shè)備驅(qū)動(dòng)囊括了硬件架構(gòu)、操作系統(tǒng)、文件系統(tǒng)以及編程語(yǔ)言等相關(guān)知識(shí)點(diǎn),具有極強(qiáng)的綜合性、應(yīng)用性和工程性[9],是嵌入式系統(tǒng)教學(xué)的重點(diǎn)和難點(diǎn)內(nèi)容。初始化函數(shù)作為向內(nèi)核加載驅(qū)動(dòng)程序的入口函數(shù),實(shí)現(xiàn)了關(guān)聯(lián)字符設(shè)備、設(shè)備文件和設(shè)備驅(qū)動(dòng)等重要功能[10],是學(xué)習(xí)字符設(shè)備的驅(qū)動(dòng)程序的入門(mén)知識(shí)。文章從關(guān)鍵數(shù)據(jù)結(jié)構(gòu)之間信息傳遞模式的角度,剖析了字符設(shè)備驅(qū)動(dòng)中的初始化函數(shù)的工作機(jī)理,期望有助于學(xué)生正確梳理字符設(shè)備、設(shè)備文件和設(shè)備驅(qū)動(dòng)三者之間的內(nèi)在關(guān)聯(lián),掌握初始化函數(shù)的代碼結(jié)構(gòu),并應(yīng)用于課程實(shí)踐中。

      2 字符設(shè)備驅(qū)動(dòng)的典型結(jié)構(gòu)介紹

      一方面,加載后的驅(qū)動(dòng)程序以獨(dú)立模塊的形式存在于Linux內(nèi)核中,字符設(shè)備驅(qū)動(dòng)遵循模塊的代碼結(jié)構(gòu)。另一方面,Linux內(nèi)核抽象了對(duì)硬件的處理,在應(yīng)用層,對(duì)設(shè)備的操作處理與普通文件相同,只需調(diào)用內(nèi)核提供的開(kāi)關(guān)、讀寫(xiě)等系統(tǒng)函數(shù),便可以實(shí)現(xiàn)相應(yīng)操作;與普通文件不同的是,在內(nèi)核層,將有關(guān)文件操作的開(kāi)關(guān)、讀寫(xiě)等函數(shù)封裝到file_operation結(jié)構(gòu)體中,而函數(shù)的具體實(shí)現(xiàn)由驅(qū)動(dòng)程序完成,因此,字符設(shè)備驅(qū)動(dòng)程序除了包含模塊必需的代碼之外,還包括file_operation結(jié)構(gòu)體中相關(guān)等函數(shù)的具體實(shí)現(xiàn)。

      綜合以上兩方面,字符設(shè)備驅(qū)動(dòng)的典型代碼結(jié)構(gòu)如下:

      static int xxx_open() //打開(kāi)

      static int xxx_release()//關(guān)閉

      static ssize_t xxx_read()//讀

      static ssize_t xxx_write()//寫(xiě)

      static int _init xxx_init( )//初始化函數(shù)

      static void _exit xxx_exit( ) //退出函數(shù)

      module_init( xxx_init ) //入口設(shè)置

      module_exit( xxx_exit ) //出口設(shè)置

      3 初始化函數(shù)中數(shù)據(jù)關(guān)聯(lián)的建立

      3.1 關(guān)鍵數(shù)據(jù)結(jié)構(gòu)體的介紹

      字符設(shè)備驅(qū)動(dòng)程序通常涉及三個(gè)關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)體:cdev、inode和file_operations結(jié)構(gòu)體,實(shí)現(xiàn)該三個(gè)結(jié)構(gòu)體之間關(guān)聯(lián)的正確建立是字符設(shè)備驅(qū)動(dòng)程序中初始化函數(shù)的基本任務(wù)。

      3.1.1 cdev結(jié)構(gòu)體

      Linux內(nèi)核提供了cdev結(jié)構(gòu)體,實(shí)現(xiàn)對(duì)字符設(shè)備的抽象。cdev結(jié)構(gòu)體中包含了字符設(shè)備的設(shè)備號(hào)、文件操作函數(shù)指針等關(guān)鍵信息。cdev結(jié)構(gòu)體的關(guān)鍵成員如下:

      struct cdev {

      const struct file_operations *ops; // 文件操作結(jié)構(gòu)體

      dev_t dev; //設(shè)備號(hào)

      unsigned int count; //設(shè)備數(shù)目

      };

      在字符設(shè)備初始化函數(shù)中,需要完成cdev結(jié)構(gòu)體的初始化、關(guān)聯(lián)cdev與該設(shè)備對(duì)應(yīng)的文件操作函數(shù)、將cdev結(jié)構(gòu)體插入到內(nèi)核中的字符設(shè)備列表中。

      3.1.2 inode結(jié)構(gòu)體

      Linux內(nèi)核提供了inode結(jié)構(gòu)體,封裝與文件操作有關(guān)的信息,inode結(jié)構(gòu)體的關(guān)鍵成員如下:

      struct inode {

      dev_t i_rdev;//設(shè)備文件的設(shè)備號(hào)

      struct cdev *i_cdev;//字符設(shè)備cdev結(jié)構(gòu)體指針

      };

      其中的設(shè)備號(hào)i_rdev和指向cdev結(jié)構(gòu)體的指針*i_cdev是與字符設(shè)備驅(qū)動(dòng)開(kāi)發(fā)關(guān)系最大的兩個(gè)成員。

      3.1.3 file_operations結(jié)構(gòu)體

      file_operations結(jié)構(gòu)體集合了大量的成員函數(shù),用以實(shí)現(xiàn)文件的開(kāi)關(guān)、讀寫(xiě)等操作,其中與字符設(shè)備驅(qū)動(dòng)密切相關(guān)的函數(shù)包括:

      struct file_operations {

      ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//從設(shè)備中讀取數(shù)據(jù)

      ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向設(shè)備發(fā)送數(shù)據(jù)

      int (*open) (struct inode *, struct file *); //打開(kāi)

      int (*release) (struct inode *, struct file *); //關(guān)閉

      };

      在應(yīng)用中,根據(jù)需要選取一部分成員函數(shù)進(jìn)行實(shí)現(xiàn)即可,成員函數(shù)的具體實(shí)現(xiàn)是設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的核心內(nèi)容。

      3.2 數(shù)據(jù)結(jié)構(gòu)體之間關(guān)聯(lián)的分析

      字符設(shè)備涉及三個(gè)基本概念:設(shè)備、設(shè)備文件和驅(qū)動(dòng)程序,三者之間通過(guò)設(shè)備號(hào)關(guān)聯(lián),如圖1所示。當(dāng)應(yīng)用程序訪(fǎng)問(wèn)設(shè)備文件時(shí),內(nèi)核根據(jù)文件名確定相應(yīng)的設(shè)備號(hào),找到對(duì)應(yīng)的驅(qū)動(dòng)程序,執(zhí)行驅(qū)動(dòng)程序中的函數(shù),當(dāng)函數(shù)中涉及控制具體設(shè)備時(shí),內(nèi)核根據(jù)設(shè)備號(hào)找到相關(guān)的字符設(shè)備,實(shí)現(xiàn)設(shè)備的控制。實(shí)際上,內(nèi)核是通過(guò)設(shè)備號(hào)關(guān)聯(lián)設(shè)備、設(shè)備文件以及驅(qū)動(dòng)程序的。

      為了實(shí)現(xiàn)設(shè)備、設(shè)備文件和驅(qū)動(dòng)程序三者之間的關(guān)聯(lián),在驅(qū)動(dòng)程序開(kāi)發(fā)過(guò)程中需要完成以下六個(gè)步驟,如圖2所示。

      3.2.1 申請(qǐng)?jiān)O(shè)備號(hào)并關(guān)聯(lián)設(shè)備號(hào)和驅(qū)動(dòng)程序

      設(shè)備號(hào)分為主設(shè)備號(hào)和次設(shè)備號(hào),主設(shè)備號(hào)用以區(qū)分設(shè)備類(lèi)型,次設(shè)備號(hào)用以區(qū)分同一類(lèi)型設(shè)備中的不同個(gè)體。通過(guò)設(shè)備類(lèi)型和設(shè)備號(hào)能夠?qū)υO(shè)備進(jìn)行唯一標(biāo)示。因此,必須為每個(gè)設(shè)備向內(nèi)核申請(qǐng)獨(dú)立的設(shè)備號(hào)。

      此外,對(duì)設(shè)備的具體操作由相應(yīng)的驅(qū)動(dòng)程序?qū)崿F(xiàn),Linux內(nèi)核通過(guò)設(shè)備號(hào)正確地找到對(duì)應(yīng)的驅(qū)動(dòng)程序,是順利完成設(shè)備操作的首要前提。因此,需要將驅(qū)動(dòng)程序與設(shè)備號(hào)相互關(guān)聯(lián)。

      3.2.2 創(chuàng)建字符設(shè)備cdev

      Linux內(nèi)核采用cdev結(jié)構(gòu)體來(lái)表征一個(gè)字符設(shè)備,當(dāng)添加新的字符設(shè)備之后,需要為新加的字符設(shè)備創(chuàng)建cdev結(jié)構(gòu)體,該結(jié)構(gòu)體中包含了設(shè)備號(hào)和操作函數(shù)指針。

      3.2.3 關(guān)聯(lián)字符設(shè)備cdev與設(shè)備號(hào)并將字符設(shè)備插入字符設(shè)備列表中

      Linux內(nèi)核中存在字符設(shè)備列表,如圖2所示,當(dāng)內(nèi)核訪(fǎng)問(wèn)某設(shè)備時(shí),以設(shè)備號(hào)為索引遍歷設(shè)備列表,確定相應(yīng)的表項(xiàng),表項(xiàng)中保存了該設(shè)備的指針。因此,若要字符設(shè)備能夠被內(nèi)核訪(fǎng)問(wèn),必須將字符設(shè)備的cdev結(jié)構(gòu)體與設(shè)備號(hào)相關(guān)聯(lián),并以設(shè)備號(hào)為索引,將該字符設(shè)備的指針保存到字符設(shè)備列表相應(yīng)的表項(xiàng)中。

      3.2.4 關(guān)聯(lián)字符設(shè)備cdev和file_operation結(jié)構(gòu)體

      Linux內(nèi)核為每個(gè)設(shè)備文件分配了表征文件屬性的inode結(jié)構(gòu)體和文件操作結(jié)構(gòu)體file_operations。當(dāng)內(nèi)核對(duì)設(shè)備進(jìn)行操作時(shí),需要訪(fǎng)問(wèn)相應(yīng)的file_operation結(jié)構(gòu)體,為了使內(nèi)核正確地找到file_operation結(jié)構(gòu)體,必須將字符設(shè)備的cdev和file_operation相互關(guān)聯(lián)。

      3.2.5 關(guān)聯(lián)file_operation中的成員函數(shù)和驅(qū)動(dòng)程序中的函數(shù)

      對(duì)字符設(shè)備的操作主要采用file_operation結(jié)構(gòu)體中的open、release、read等成員函數(shù),這些函數(shù)在驅(qū)動(dòng)程序中實(shí)現(xiàn)。當(dāng)應(yīng)用程序調(diào)用file_operation結(jié)構(gòu)體中的成員函數(shù)時(shí),實(shí)際上調(diào)用的是驅(qū)動(dòng)程序中的相關(guān)函數(shù)。因此,必須將file_operation結(jié)構(gòu)體中的成員函數(shù)和驅(qū)動(dòng)程序中的函數(shù)相互關(guān)聯(lián)。

      3.2.6 創(chuàng)建設(shè)備文件并關(guān)聯(lián)設(shè)備文件和設(shè)備號(hào)

      Linux內(nèi)核將設(shè)備抽象成文件的形式,使應(yīng)用程序?qū)υO(shè)備的訪(fǎng)問(wèn)如同訪(fǎng)問(wèn)普通文件,因此,需要?jiǎng)?chuàng)建設(shè)備文件。此外,為了使應(yīng)用程序訪(fǎng)問(wèn)設(shè)備文件時(shí),內(nèi)核能夠根據(jù)設(shè)備文件名正確地找到與之對(duì)應(yīng)的設(shè)備以及其驅(qū)動(dòng)程序,必須將設(shè)備文件和能夠唯一標(biāo)示設(shè)備的設(shè)備號(hào)關(guān)聯(lián)起來(lái)。

      3.3 數(shù)據(jù)結(jié)構(gòu)體之間關(guān)聯(lián)的建立

      3.3.1 申請(qǐng)?jiān)O(shè)備號(hào)并關(guān)聯(lián)設(shè)備號(hào)和驅(qū)動(dòng)程序的實(shí)現(xiàn)

      通過(guò)向內(nèi)核注冊(cè)驅(qū)動(dòng)程序,實(shí)現(xiàn)設(shè)備號(hào)的申請(qǐng),以及設(shè)備號(hào)與驅(qū)動(dòng)程序之間的相互關(guān)聯(lián)。設(shè)備號(hào)的分配方式分為兩種:靜態(tài)分配和動(dòng)態(tài)分配,靜態(tài)分配是由用戶(hù)指定主設(shè)備號(hào),由內(nèi)核檢查設(shè)備號(hào)的可用性,可用則返回零,不可用則返回負(fù)數(shù)。動(dòng)態(tài)分配是由內(nèi)核根據(jù)設(shè)備號(hào)的實(shí)用情況,為設(shè)備分配空閑的設(shè)備號(hào)。

      Linux內(nèi)核提供的用于靜態(tài)分配設(shè)備號(hào)的注冊(cè)函數(shù)為:

      register_chrdev_region(dev_t first, unsigned int count, char *name)

      參數(shù)說(shuō)明如下:first : 需用戶(hù)指定的主設(shè)備號(hào); count:次設(shè)備號(hào)的個(gè)數(shù);name:相關(guān)聯(lián)的驅(qū)動(dòng)名稱(chēng)。返回值說(shuō)明如下: 成功:返回值為0;失敗:返回值小于0。

      Linux內(nèi)核提供的用于動(dòng)態(tài)分配設(shè)備號(hào)的注冊(cè)函數(shù)為:

      int alloc_chrdev_region (dev_t dev, unsigned int baseminor, unsigned int count, char name)

      參數(shù)說(shuō)明如下:dev:輸出型參數(shù),獲得分配到的設(shè)備號(hào);baseminor :次設(shè)備號(hào)的基準(zhǔn);其余參數(shù)同上。返回值說(shuō)明如下: 成功:分配得到的設(shè)備號(hào)由dev帶出來(lái);失?。悍祷刂敌∮?。

      當(dāng)用戶(hù)不需要某個(gè)設(shè)備時(shí),可以注銷(xiāo)設(shè)備驅(qū)動(dòng)程序,Linux內(nèi)核提供的注銷(xiāo)函數(shù)如下:

      unregister_chrdev_region (dev_t first, unsigned int count)

      參數(shù)說(shuō)明同上。

      3.3.2 創(chuàng)建字符設(shè)備cdev結(jié)構(gòu)體的實(shí)現(xiàn)

      用戶(hù)可以采用如下語(yǔ)句定義一個(gè)字符設(shè)備my_cdev結(jié)構(gòu)體對(duì)象,之后Linux內(nèi)核會(huì)為該結(jié)構(gòu)體分配存儲(chǔ)空間,完成字符設(shè)備my_cdev的創(chuàng)建。

      struct cdev my_cdev

      3.3.3 關(guān)聯(lián)字符設(shè)備cdev與設(shè)備號(hào)的實(shí)現(xiàn)

      Linux內(nèi)核提供了cdev_add函數(shù),通過(guò)將設(shè)備號(hào)賦值給cdev結(jié)構(gòu)體中的dev成員,實(shí)現(xiàn)字符設(shè)備cdev與設(shè)備號(hào)之間的相互關(guān)聯(lián),利用設(shè)備號(hào)索引字符設(shè)備列表中的表項(xiàng),并將存儲(chǔ)字符設(shè)備cdev結(jié)構(gòu)體的地址賦給該表項(xiàng),以便于內(nèi)核通過(guò)設(shè)備號(hào)正確地找到字符設(shè)備cdev結(jié)構(gòu)體。

      cdev_add函數(shù)的定義為:

      cdev_add (cdev *, dev_t, count)

      參數(shù)說(shuō)明如下:dev_t:設(shè)備號(hào);cdev * :字符設(shè)備結(jié)構(gòu)體的指針;count : 設(shè)備號(hào)的個(gè)數(shù)。返回值說(shuō)明如下:成功:返回值為0;失?。悍祷刂敌∮?。

      該函數(shù)以?xún)?nèi)核分配的設(shè)備號(hào)為輸入?yún)?shù),因此,在字符設(shè)備驅(qū)動(dòng)程序的初始化函數(shù)中,該函數(shù)必須位于注冊(cè)函數(shù)的后面。

      3.3.4 關(guān)聯(lián)字符設(shè)備的cdev結(jié)構(gòu)體和file_operation結(jié)構(gòu)體的實(shí)現(xiàn)

      Linux內(nèi)核提供了cdev_init函數(shù),通過(guò)將存儲(chǔ)文件操作結(jié)構(gòu)體file_operations的地址賦給字符設(shè)備cdev結(jié)構(gòu)體中的ofp成員,實(shí)現(xiàn)字符設(shè)備cdev和文件操作file_operation的相互關(guān)聯(lián),以便于Linux內(nèi)核正確地找到與字符設(shè)備cdev對(duì)應(yīng)的file_operation。

      該函數(shù)的定義為:

      cdev_init (cdev *, file_operations *)

      參數(shù)說(shuō)明如下:cdev*: 字符設(shè)備結(jié)構(gòu)體的指針;file_operations*: 文件操作函數(shù)的指針。

      3.4.5 關(guān)聯(lián)file_operation結(jié)構(gòu)體中的成員函數(shù)和驅(qū)動(dòng)程序中函數(shù)的實(shí)現(xiàn)

      通過(guò)在驅(qū)動(dòng)程序中添加填充函數(shù),明確file_operation結(jié)構(gòu)體中的成員函數(shù)和驅(qū)動(dòng)程序中函數(shù)之間的對(duì)應(yīng)關(guān)系,進(jìn)而實(shí)現(xiàn)兩者的關(guān)聯(lián)。

      填充函數(shù)的代碼結(jié)構(gòu)如下:

      file_operations xxx_ops =

      { .open = xxx_ open,

      .release = xxx_ release,

      .read = xxx_read,

      .write = xxx_write,

      . ioctl = xxx_ioctl,

      …}

      該填充函數(shù)以驅(qū)動(dòng)程序中的xxx_open、xxx_release、xxx_read等函數(shù)為參數(shù),因此,在字符設(shè)備驅(qū)動(dòng)程序中,填充函數(shù)必須位于上訴函數(shù)定義的后面。

      3.3.6 創(chuàng)建設(shè)備文件并關(guān)聯(lián)設(shè)備文件和設(shè)備號(hào)的實(shí)現(xiàn)

      Linux內(nèi)核提供了mknod命令,為指定類(lèi)型的設(shè)備創(chuàng)建設(shè)備文件,并將設(shè)備文件與設(shè)備號(hào)相互關(guān)聯(lián),以便于應(yīng)用程序訪(fǎng)問(wèn)設(shè)備文件時(shí),內(nèi)核能夠根據(jù)設(shè)備文件名正確地找到與之對(duì)應(yīng)的設(shè)備號(hào),進(jìn)而確定該設(shè)備的驅(qū)動(dòng)程序。

      mknod命令的具體格式如下:

      mknod /dev/xxx c M m

      參數(shù)說(shuō)明如下:/dev/xxx:創(chuàng)建的設(shè)備文件;c:字符設(shè)備類(lèi)型;M:主設(shè)備號(hào);m:次設(shè)備號(hào)。

      值得注意的是,當(dāng)驅(qū)動(dòng)程序的初始化函數(shù)中采用動(dòng)態(tài)分配設(shè)備號(hào)時(shí),每次驅(qū)動(dòng)程序加載內(nèi)核分配的設(shè)備號(hào)可能不同,為了在運(yùn)用mknod命令時(shí),輸入正確的設(shè)備號(hào),必須在成功加載了字符設(shè)備驅(qū)動(dòng)程序之后,采用cat命令查看所加載的字符設(shè)備的主、次設(shè)備號(hào),而后才能運(yùn)用mknod上述命令創(chuàng)建設(shè)備文件。

      4 初始化函數(shù)的典型結(jié)構(gòu)

      綜合上述數(shù)據(jù)結(jié)構(gòu)體之間關(guān)聯(lián)的建立方法,形成如下所示的字符設(shè)備驅(qū)動(dòng)程序中初始化函數(shù)的典型結(jié)構(gòu)。

      static int major = 250; //主設(shè)備號(hào)

      static int minor = 0; //次設(shè)備號(hào)

      static dev_t devno; //設(shè)備號(hào)

      static struct cdev mycdev; //創(chuàng)建1個(gè)字符設(shè)備

      static int _init xxx_init(void) //初始化函數(shù)

      {

      int ret;

      devno = MKDEV(major,minor); // 由主設(shè)備號(hào)和次設(shè)備號(hào)構(gòu)成設(shè)備號(hào)

      ret = register_chrdev_region(devno, 1, "xxx"); //注冊(cè)驅(qū)動(dòng)程序

      cdev_init(&mycdev,&xxx_ops); //將設(shè)備和file_operation關(guān)聯(lián)

      ret = cdev_add(&mycdev,devno,1);//向內(nèi)核添加mycdev

      return 0;

      }

      static void _exit xxx_exit (void) //退出函數(shù)

      {

      cdev_del(&mycdev); //從內(nèi)核中移除mycdev

      unregister_chrdev_region(devno,1); // 注銷(xiāo)驅(qū)動(dòng)程序

      }

      module_init( xxx_init ) //入口函數(shù)設(shè)置

      module_exit( xxx_exit ) //出口函數(shù)設(shè)置

      Linux內(nèi)核為加載模塊提供了insmod命令,加載后的驅(qū)動(dòng)從所設(shè)置的入口函數(shù)開(kāi)始執(zhí)行,通常將初始化函數(shù)設(shè)置為入口函數(shù),從而實(shí)現(xiàn)了向內(nèi)核申請(qǐng)?jiān)O(shè)備號(hào)、關(guān)聯(lián)設(shè)備號(hào)和驅(qū)動(dòng)程序等一系列功能。

      5 結(jié)論

      字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)是電子信息工程等專(zhuān)業(yè)課程“嵌入式系統(tǒng)”的重要內(nèi)容,是嵌入式系統(tǒng)開(kāi)發(fā)的必備技術(shù),其中的初始化函數(shù)涉及設(shè)備、文件系統(tǒng)、Linux內(nèi)核等多個(gè)知識(shí)點(diǎn),是字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)中的難點(diǎn)。文章從數(shù)據(jù)關(guān)聯(lián)的角度,深入剖析了關(guān)鍵數(shù)據(jù)結(jié)構(gòu)體之間的信息傳遞模式和關(guān)系建立方法,并給出了典型的代碼結(jié)構(gòu)。文章研究結(jié)果有助于電子信息工程等相關(guān)專(zhuān)業(yè)的學(xué)生對(duì)字符設(shè)備驅(qū)動(dòng)初始化函數(shù)的理解,提高學(xué)生在綜合實(shí)驗(yàn)、畢業(yè)設(shè)計(jì)等應(yīng)用開(kāi)發(fā)中的實(shí)踐能力。

      參考文獻(xiàn):

      [1] 朱銘琳.嵌入式系統(tǒng)開(kāi)發(fā)課程教學(xué)改革[J]. 信息與電腦(理論版),2017(19):231-233.

      [2] 黎芳芳,柴明鋼,劉先鋒. 以創(chuàng)新應(yīng)用能力為核心嵌入式系統(tǒng)教學(xué)的改進(jìn)探索[J]. 時(shí)代教育,2017(19):52.

      [3] 杜欽生, 唐伎玲. 應(yīng)用型大學(xué)嵌入式系統(tǒng)人才培養(yǎng)模式研究[J]. 長(zhǎng)春大學(xué)學(xué)報(bào), 2012, 22(2):214-216.

      [4] 謝斌, 任克強(qiáng), 鐘文濤. 嵌入式系統(tǒng)應(yīng)用型人才培養(yǎng)模式的探討[J]. 江西理工大學(xué)學(xué)報(bào), 2010, 31(2):93-95.

      [5] 張曉東, 盧濤, 曹毅. 應(yīng)用型嵌入式系統(tǒng)人才培養(yǎng)模式改革與探索[J]. 中國(guó)輕工教育, 2017(2):56-58.

      [6] 李文生,鄧春健,呂燚. 案例驅(qū)動(dòng)的嵌入式系統(tǒng)教學(xué)改革探索[J]. 計(jì)算機(jī)教育,2011(2):22-25.

      [7] 郭國(guó)法, 宮瑤, 張開(kāi)生. 嵌入式課程遞階教學(xué)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦知識(shí)與技術(shù), 2015(11).

      [8] 李巖,王小玉,孫永春. 嵌入式系統(tǒng)教學(xué)研究[J]. 電氣電子教學(xué)學(xué)報(bào),2006(3):45-47+90.

      [9] 周菁. 嵌入式Linux設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)探討[J]. 電腦編程技巧與維護(hù), 2016(4):47-48.

      [10] 陳文智. 嵌入式系統(tǒng)原理與設(shè)計(jì)[M]. 清華大學(xué)出版社, 2011.

      【通聯(lián)編輯:王力】

      猜你喜歡
      嵌入式系統(tǒng)
      Teaching Research on IoT and—Embedded System of Software Engineering
      基于Xilinx口袋實(shí)驗(yàn)室的組合邏輯電路設(shè)計(jì)實(shí)驗(yàn)
      面向應(yīng)用的智能專(zhuān)業(yè)嵌入式系統(tǒng)教學(xué)
      基于物聯(lián)網(wǎng)的遠(yuǎn)程紅外控制器
      嵌入式系統(tǒng)軟件開(kāi)發(fā)技術(shù)探析
      基于A(yíng)VR單片機(jī)的SPI接口設(shè)計(jì)與實(shí)現(xiàn)
      辦公自動(dòng)化系統(tǒng)的設(shè)計(jì)
      嵌入式系統(tǒng)在醫(yī)療器械中的應(yīng)用分析
      基于物聯(lián)網(wǎng)項(xiàng)目驅(qū)動(dòng)的嵌入式系統(tǒng)教學(xué)改革的研究與實(shí)踐
      嵌入式系統(tǒng)課程“中斷、異常與事件”教學(xué)實(shí)踐及啟示
      牟定县| 塘沽区| 银川市| 章丘市| 法库县| 永昌县| 和政县| 酒泉市| 长治市| 冕宁县| 博客| 清徐县| 长汀县| 泽州县| 昌吉市| 易门县| 皮山县| 出国| 罗定市| 洪湖市| 墨竹工卡县| 沈阳市| 绍兴县| 阿拉善左旗| 宝鸡市| 延寿县| 静安区| 会泽县| 兴业县| 潼南县| 偏关县| 牙克石市| 上高县| 崇阳县| 松桃| 慈溪市| 分宜县| 天津市| 焦作市| 蕉岭县| 阿图什市|