劉海秋 馬慧敏 江朝暉
摘要:嵌入式系統(tǒng)的應(yīng)用覆蓋了消費(fèi)類電子、智能家居、汽車電子等諸多領(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)專業(yè)的學(xué)生對字符設(shè)備驅(qū)動(dòng)程序中初始化函數(shù)的理解,提高學(xué)生在嵌入式系統(tǒng)應(yīng)用開發(fā)中的實(shí)踐能力。
關(guān)鍵詞:嵌入式系統(tǒng);字符設(shè)備驅(qū)動(dòng);初始化函數(shù);數(shù)據(jù)關(guān)聯(lián)
中圖分類號(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 引言
近年來,嵌入式系統(tǒng)廣泛應(yīng)用于消費(fèi)類電子、智能家居、汽車電子、醫(yī)療電子等諸多領(lǐng)域[1],幾乎人手一部的智能手機(jī)是嵌入式系統(tǒng)的一項(xiàng)典型應(yīng)用,嵌入式系統(tǒng)電子產(chǎn)品正在改變?nèi)藗兩詈凸ぷ鞣绞剑瑫r(shí),也激發(fā)了社會(huì)對嵌入式系統(tǒng)開發(fā)高級(jí)人才的強(qiáng)烈需求[2-5]。為此,各大高校的電子信息工程、自動(dòng)控制、通信工程等相關(guān)專業(yè)相繼開設(shè)了“嵌入式系統(tǒng)”課程,以培養(yǎng)學(xué)生掌握嵌入式系統(tǒng)開發(fā)技術(shù),適應(yīng)社會(huì)對嵌入式人才的需求[6-8]。
字符設(shè)備驅(qū)動(dòng)囊括了硬件架構(gòu)、操作系統(tǒng)、文件系統(tǒng)以及編程語言等相關(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)程序的入門知識(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)核抽象了對硬件的處理,在應(yīng)用層,對設(shè)備的操作處理與普通文件相同,只需調(diào)用內(nèi)核提供的開關(guān)、讀寫等系統(tǒng)函數(shù),便可以實(shí)現(xiàn)相應(yīng)操作;與普通文件不同的是,在內(nèi)核層,將有關(guān)文件操作的開關(guān)、讀寫等函數(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() //打開
static int xxx_release()//關(guān)閉
static ssize_t xxx_read()//讀
static ssize_t xxx_write()//寫
…
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)對字符設(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è)備對應(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)開發(fā)關(guān)系最大的兩個(gè)成員。
3.1.3 file_operations結(jié)構(gòu)體
file_operations結(jié)構(gòu)體集合了大量的成員函數(shù),用以實(shí)現(xiàn)文件的開關(guān)、讀寫等操作,其中與字符設(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 *); //打開
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)程序,三者之間通過設(shè)備號(hào)關(guān)聯(lián),如圖1所示。當(dāng)應(yīng)用程序訪問設(shè)備文件時(shí),內(nèi)核根據(jù)文件名確定相應(yīng)的設(shè)備號(hào),找到對應(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)核是通過設(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)程序開發(fā)過程中需要完成以下六個(gè)步驟,如圖2所示。
3.2.1 申請?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è)備類型,次設(shè)備號(hào)用以區(qū)分同一類型設(shè)備中的不同個(gè)體。通過設(shè)備類型和設(shè)備號(hào)能夠?qū)υO(shè)備進(jìn)行唯一標(biāo)示。因此,必須為每個(gè)設(shè)備向內(nèi)核申請獨(dú)立的設(shè)備號(hào)。
此外,對設(shè)備的具體操作由相應(yīng)的驅(qū)動(dòng)程序?qū)崿F(xiàn),Linux內(nèi)核通過設(shè)備號(hào)正確地找到對應(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)體來表征一個(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)核訪問某設(shè)備時(shí),以設(shè)備號(hào)為索引遍歷設(shè)備列表,確定相應(yīng)的表項(xiàng),表項(xiàng)中保存了該設(shè)備的指針。因此,若要字符設(shè)備能夠被內(nèi)核訪問,必須將字符設(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)核對設(shè)備進(jìn)行操作時(shí),需要訪問相應(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ù)
對字符設(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è)備的訪問如同訪問普通文件,因此,需要?jiǎng)?chuàng)建設(shè)備文件。此外,為了使應(yīng)用程序訪問設(shè)備文件時(shí),內(nèi)核能夠根據(jù)設(shè)備文件名正確地找到與之對應(yīng)的設(shè)備以及其驅(qū)動(dòng)程序,必須將設(shè)備文件和能夠唯一標(biāo)示設(shè)備的設(shè)備號(hào)關(guān)聯(lián)起來。
3.3 數(shù)據(jù)結(jié)構(gòu)體之間關(guān)聯(lián)的建立
3.3.1 申請?jiān)O(shè)備號(hào)并關(guān)聯(lián)設(shè)備號(hào)和驅(qū)動(dòng)程序的實(shí)現(xiàn)
通過向內(nèi)核注冊驅(qū)動(dòng)程序,實(shí)現(xiàn)設(shè)備號(hào)的申請,以及設(shè)備號(hào)與驅(qū)動(dòng)程序之間的相互關(guān)聯(lián)。設(shè)備號(hào)的分配方式分為兩種:靜態(tài)分配和動(dòng)態(tài)分配,靜態(tài)分配是由用戶指定主設(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)的注冊函數(shù)為:
register_chrdev_region(dev_t first, unsigned int count, char *name)
參數(shù)說明如下:first : 需用戶指定的主設(shè)備號(hào); count:次設(shè)備號(hào)的個(gè)數(shù);name:相關(guān)聯(lián)的驅(qū)動(dòng)名稱。返回值說明如下: 成功:返回值為0;失?。悍祷刂敌∮?。
Linux內(nèi)核提供的用于動(dòng)態(tài)分配設(shè)備號(hào)的注冊函數(shù)為:
int alloc_chrdev_region (dev_t dev, unsigned int baseminor, unsigned int count, char name)
參數(shù)說明如下:dev:輸出型參數(shù),獲得分配到的設(shè)備號(hào);baseminor :次設(shè)備號(hào)的基準(zhǔn);其余參數(shù)同上。返回值說明如下: 成功:分配得到的設(shè)備號(hào)由dev帶出來;失?。悍祷刂敌∮?。
當(dāng)用戶不需要某個(gè)設(shè)備時(shí),可以注銷設(shè)備驅(qū)動(dòng)程序,Linux內(nèi)核提供的注銷函數(shù)如下:
unregister_chrdev_region (dev_t first, unsigned int count)
參數(shù)說明同上。
3.3.2 創(chuàng)建字符設(shè)備cdev結(jié)構(gòu)體的實(shí)現(xiàn)
用戶可以采用如下語句定義一個(gè)字符設(shè)備my_cdev結(jié)構(gòu)體對象,之后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ù),通過將設(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)核通過設(shè)備號(hào)正確地找到字符設(shè)備cdev結(jié)構(gòu)體。
cdev_add函數(shù)的定義為:
cdev_add (cdev *, dev_t, count)
參數(shù)說明如下:dev_t:設(shè)備號(hào);cdev * :字符設(shè)備結(jié)構(gòu)體的指針;count : 設(shè)備號(hào)的個(gè)數(shù)。返回值說明如下:成功:返回值為0;失?。悍祷刂敌∮?。
該函數(shù)以內(nèi)核分配的設(shè)備號(hào)為輸入?yún)?shù),因此,在字符設(shè)備驅(qū)動(dòng)程序的初始化函數(shù)中,該函數(shù)必須位于注冊函數(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ù),通過將存儲(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對應(yīng)的file_operation。
該函數(shù)的定義為:
cdev_init (cdev *, file_operations *)
參數(shù)說明如下: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)
通過在驅(qū)動(dòng)程序中添加填充函數(shù),明確file_operation結(jié)構(gòu)體中的成員函數(shù)和驅(qū)動(dòng)程序中函數(shù)之間的對應(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命令,為指定類型的設(shè)備創(chuàng)建設(shè)備文件,并將設(shè)備文件與設(shè)備號(hào)相互關(guān)聯(lián),以便于應(yīng)用程序訪問設(shè)備文件時(shí),內(nèi)核能夠根據(jù)設(shè)備文件名正確地找到與之對應(yīng)的設(shè)備號(hào),進(jìn)而確定該設(shè)備的驅(qū)動(dòng)程序。
mknod命令的具體格式如下:
mknod /dev/xxx c M m
參數(shù)說明如下:/dev/xxx:創(chuàng)建的設(shè)備文件;c:字符設(shè)備類型;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"); //注冊驅(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); // 注銷驅(qū)動(dòng)程序
}
module_init( xxx_init ) //入口函數(shù)設(shè)置
module_exit( xxx_exit ) //出口函數(shù)設(shè)置
Linux內(nèi)核為加載模塊提供了insmod命令,加載后的驅(qū)動(dòng)從所設(shè)置的入口函數(shù)開始執(zhí)行,通常將初始化函數(shù)設(shè)置為入口函數(shù),從而實(shí)現(xiàn)了向內(nèi)核申請?jiān)O(shè)備號(hào)、關(guān)聯(lián)設(shè)備號(hào)和驅(qū)動(dòng)程序等一系列功能。
5 結(jié)論
字符設(shè)備驅(qū)動(dòng)設(shè)計(jì)是電子信息工程等專業(yè)課程“嵌入式系統(tǒng)”的重要內(nèi)容,是嵌入式系統(tǒng)開發(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)專業(yè)的學(xué)生對字符設(shè)備驅(qū)動(dòng)初始化函數(shù)的理解,提高學(xué)生在綜合實(shí)驗(yàn)、畢業(yè)設(shè)計(jì)等應(yīng)用開發(fā)中的實(shí)踐能力。
參考文獻(xiàn):
[1] 朱銘琳.嵌入式系統(tǒng)開發(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]. 長春大學(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]. 中國輕工教育, 2017(2):56-58.
[6] 李文生,鄧春健,呂燚. 案例驅(qū)動(dòng)的嵌入式系統(tǒng)教學(xué)改革探索[J]. 計(jì)算機(jī)教育,2011(2):22-25.
[7] 郭國法, 宮瑤, 張開生. 嵌入式課程遞階教學(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)編輯:王力】