欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      基于嵌入式Linux的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)

      時(shí)間:2019-05-14 23:02:46下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫寫幫文庫(kù)小編為你整理了多篇相關(guān)的《基于嵌入式Linux的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫(kù)還可以找到更多《基于嵌入式Linux的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)》。

      第一篇:基于嵌入式Linux的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)

      基于嵌入式Linux的設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)

      Linux為是一個(gè)成熟而穩(wěn)定的操作系統(tǒng)。將Linux植入嵌入式設(shè)備具有眾多的優(yōu)點(diǎn),包括可剪裁和容易移植等,所以Linux操作系統(tǒng)在嵌入式領(lǐng)域獲得了廣泛的應(yīng)用。嵌入式Linux一直是嵌入式領(lǐng)域的研究熱點(diǎn),與PC架構(gòu)不同,嵌入式系統(tǒng)的硬件具有多樣性和差異性,嵌入式系統(tǒng)的開發(fā)需要對(duì)特定系統(tǒng)進(jìn)行硬件設(shè)計(jì),同時(shí)還要針對(duì)這些硬件來編寫驅(qū)動(dòng)程序。Linux內(nèi)核就是通過驅(qū)動(dòng)程序來同外圍設(shè)備打交道的,系統(tǒng)設(shè)計(jì)人員必須為每個(gè)設(shè)備編寫驅(qū)動(dòng)程序,否則設(shè)備無法在操作系統(tǒng)下正常工作。設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)的基本概念與模型

      設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核與機(jī)器硬件之間的接口,它為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),在應(yīng)用程序看來,硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作,設(shè)計(jì)驅(qū)動(dòng)程序是內(nèi)核的一部分,可以實(shí)現(xiàn)以下功能:

      對(duì)設(shè)備初始化和釋放;

      把數(shù)據(jù)從內(nèi)核傳送到硬件,以及從硬件讀取數(shù)據(jù);

      讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù),以及回送應(yīng)用程序請(qǐng)求的數(shù)據(jù);

      檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。

      前面已經(jīng)提到驅(qū)動(dòng)程序的作用,而編寫驅(qū)動(dòng)程序就是構(gòu)造一系列可供應(yīng)用程序調(diào)動(dòng)的函數(shù)(包括open、release、read、write、llseek、ioctl等)。在用戶自己的驅(qū)動(dòng)程序中,首先要根據(jù)驅(qū)動(dòng)程序的功能,實(shí)現(xiàn)file_operations結(jié)構(gòu)中的函數(shù),不需要的函數(shù)接口可以直接在file_operations結(jié)構(gòu)中初始化為NULL;file_operations變量會(huì)在驅(qū)動(dòng)程序初始化時(shí)注冊(cè)到系統(tǒng)內(nèi)部。當(dāng)操作系統(tǒng)對(duì)設(shè)備操作時(shí),會(huì)調(diào)用驅(qū)動(dòng)程序注冊(cè)的file_operations結(jié)構(gòu)中的函數(shù)指針。

      以下是嵌入式linux2.4設(shè)備驅(qū)動(dòng)程序的最簡(jiǎn)模型。

      具體實(shí)現(xiàn)前面定義的函數(shù)時(shí),需注意下面幾點(diǎn):

      1)在test_init函數(shù)中要通過調(diào)用register_chrdev()函數(shù)來向內(nèi)核注冊(cè)字符設(shè)備驅(qū)動(dòng)程序。如果是塊設(shè)備,則還需調(diào)用mmmap()進(jìn)行地址空間的映射,再調(diào)用register_blkdev()函數(shù)來向內(nèi)核注冊(cè)塊設(shè)備驅(qū)動(dòng)程序,在Linux系統(tǒng)中,對(duì)中斷的處理是屬于系統(tǒng)核心部分,因而如果設(shè)備與系統(tǒng)之間以中斷方式進(jìn)行數(shù)據(jù)交換,則必須把該設(shè)備的驅(qū)動(dòng)程序作為系統(tǒng)核心的一部分,也就是說設(shè)備驅(qū)動(dòng)程序要通過調(diào)用request_irq()函數(shù)來申請(qǐng)中斷,通過free_irq()函數(shù)來釋放中斷(在test_cleanup中實(shí)現(xiàn))。

      2)open()函數(shù)和release()函數(shù)的具體實(shí)現(xiàn)有著一定的對(duì)應(yīng)性,在open()函數(shù)中主要是執(zhí)行打開設(shè)備時(shí)的一些初始化代碼,如果該驅(qū)動(dòng)程序需要管理多個(gè)設(shè)備,那么還要獲取從設(shè)備號(hào),根據(jù)從設(shè)備號(hào)來判斷需要操作的設(shè)備,其中,從設(shè)備號(hào)可通過調(diào)用函數(shù)MINOR(inode->i_rdev)來獲得,然后再調(diào)用宏MOD_INC_USE_COUNT來使得驅(qū)動(dòng)程序使用計(jì)數(shù)器加1,而在release()函數(shù)中則要進(jìn)行相反的處理。即調(diào)用宏MOD_DEC_USE_COUNT來減小驅(qū)動(dòng)程序使用計(jì)數(shù)器。

      3)歸根到底,驅(qū)動(dòng)函數(shù)的實(shí)現(xiàn)就是調(diào)用內(nèi)核所支持的函數(shù)(包括內(nèi)核提供的API和用戶自己定義的寄存器操作函數(shù))來完成對(duì)設(shè)備的操作,雖然嵌入式系統(tǒng)設(shè)備的種類眾多,不同設(shè)備操作的具體實(shí)現(xiàn)方法不可能相同,但是Linux操作系統(tǒng)提供了一系列特殊API,為開發(fā)內(nèi)核驅(qū)動(dòng)程序帶來了很大的方便,調(diào)用這些API時(shí)需要注意的是:通常情況下,應(yīng)用程序是通過內(nèi)核接口訪問驅(qū)動(dòng)程序的(這是驅(qū)動(dòng)程序的主要使用方式),因此驅(qū)動(dòng)程序需要與應(yīng)用程序交換數(shù)據(jù),但是操作系統(tǒng)內(nèi)核和驅(qū)動(dòng)程序在內(nèi)核空間中運(yùn)行,而用戶程序在用戶空間中運(yùn)行,用戶程序不能訪問內(nèi)核空間,操作系統(tǒng)內(nèi)核和驅(qū)動(dòng)程序也不能使用指針或memcpy()等常規(guī)的C庫(kù)函與用戶空間傳輸數(shù)據(jù),造成這種狀況的主要原因是linux操作系統(tǒng)使用了虛擬內(nèi)存機(jī)制,使用了虛擬內(nèi)存機(jī)制后,用戶空間的內(nèi)存可能被換出,當(dāng)內(nèi)核使用用戶空間指針時(shí),對(duì)應(yīng)的頁面可能已經(jīng)不在內(nèi)存中了,因此在使用調(diào)用函數(shù)時(shí)要注意:設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用malloc()和free(),而調(diào)用kmalloc()和kfree();用于內(nèi)核空間與用戶空間進(jìn)行數(shù)據(jù)拷貝的函數(shù)主要有access_ok()(檢查某內(nèi)存空間是否有權(quán)訪問),copy_to_user()和put_usr()(內(nèi)核函數(shù)向用戶空間傳輸數(shù)據(jù)),copy_from_user()和get_user()(用戶空間向內(nèi)核空間傳輸數(shù)據(jù));關(guān)于內(nèi)核空間與I/O空間的數(shù)據(jù)交換,不同體系結(jié)構(gòu)的處理器對(duì)I/O的處理方式也不同,x86系列處理器中,I/O與內(nèi)存完成不同,它是分開編址的,訪問它要使用專用的指令;而對(duì)ARM體系結(jié)構(gòu)的處理器來說,則是不區(qū)分I/O和內(nèi)存,統(tǒng)一編址的,可以使用同樣的指令訪問,在驅(qū)動(dòng)程序中可以使用一系列函數(shù)來訪問I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。

      Linux2.6與2.4內(nèi)核驅(qū)動(dòng)程序的區(qū)別

      為了徹底防止對(duì)正在被使用的內(nèi)核模塊進(jìn)行錯(cuò)誤操作,linux2.6內(nèi)核在加載和導(dǎo)出內(nèi)核模塊方面都較2.4內(nèi)核有所改進(jìn),避免了用戶執(zhí)行將導(dǎo)致系統(tǒng)崩潰的操作(例如強(qiáng)制刪除模塊等)。同時(shí),當(dāng)驅(qū)動(dòng)程序需要在多個(gè)文件中包含 頭文件時(shí),不必定義宏來檢查內(nèi)核的版本。與2.4內(nèi)核相比,2.6內(nèi)核在可擴(kuò)展性、吞吐率等方面有較大提升,其新特性主要包括:使用了新的調(diào)度器算法;內(nèi)核搶占功能顯著地降低了用戶交互式應(yīng)用程序;多媒體應(yīng)用程序等類似應(yīng)用程序的延遲;改進(jìn)了線程模型以及對(duì)NPTL的支持,顯著改善了虛擬內(nèi)存在一定成程度負(fù)載下的性能;能夠支持更多的文件系統(tǒng);引進(jìn)了內(nèi)存池技術(shù);支持更多的系統(tǒng)設(shè)備,在2.4內(nèi)核中有約束大型系統(tǒng)的限制,其支持的每一類設(shè)備的最大數(shù)量為256,而2.6內(nèi)核則徹底打破了這些限制,可以支持4095種主要的設(shè)備類型,且每個(gè)單獨(dú)的類型又可以支持超過一百萬個(gè)的子設(shè)備;支持反向映射機(jī)制(reverse mapping),內(nèi)存管理器為每一個(gè)物理頁建立一個(gè)鏈表,包含指向當(dāng)前映射頁中每個(gè)進(jìn)程的頁表?xiàng)l目的指針。該鏈表叫PTE鏈,它極大的提高了找到那些映射某個(gè)頁的進(jìn)程的速度。

      Linux操作系統(tǒng)的設(shè)備驅(qū)動(dòng)程序是在內(nèi)核空間運(yùn)行的程序,其中涉及很多內(nèi)核的操作,隨著Linux內(nèi)核版本的升級(jí),驅(qū)動(dòng)程序的開發(fā)必然也要作出相應(yīng)的修改,總之,在linux2.6內(nèi)核上編寫設(shè)備驅(qū)動(dòng)程序時(shí)具體要注意以下幾個(gè)方面:

      1)Linux2.6內(nèi)核驅(qū)動(dòng)程序必須由MODULE_LICENSE(“Dual BSD/GPL”)語句來定義許可證,而不能再用2.4內(nèi)核的MODULE_LICENSE(“GPL”)。否則,在編譯時(shí)會(huì)出現(xiàn)警告提示。

      2)Linux2.6內(nèi)核驅(qū)動(dòng)程序可以用int try_module_get(&module)來加載模塊,用module_put()函數(shù)來卸載模塊,而以前2.4內(nèi)核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT則可不用。

      3)前面給出的字符型設(shè)備驅(qū)動(dòng)程序模型中結(jié)構(gòu)體file_operations的定義要采用下面的形式。這是因?yàn)樵贚inux內(nèi)核中對(duì)結(jié)構(gòu)體的定義形式發(fā)生了變化,不再支持原來的定義形式。

      4)就字符型設(shè)備而言,test_open()函數(shù)中向內(nèi)核注冊(cè)設(shè)備的調(diào)用函數(shù)register_chrdev()可以升級(jí)為int register_chrdev_region(dev_t from,unsigned count,char * name),如果要?jiǎng)討B(tài)申請(qǐng)主設(shè)備號(hào)可調(diào)用函數(shù)int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)來完成;原來的注冊(cè)函數(shù)還可以用,只是不能注冊(cè)設(shè)備號(hào)大于256的設(shè)備,同理,對(duì)于塊設(shè)備和網(wǎng)絡(luò)設(shè)備的注冊(cè)函數(shù)也有著相對(duì)應(yīng)的代替函數(shù)。

      5)在聲明驅(qū)動(dòng)程序是否要導(dǎo)出符號(hào)表方面有著很大的變化。當(dāng)驅(qū)動(dòng)程序模塊裝入內(nèi)核后,它所導(dǎo)出的任何符號(hào)都會(huì)變成公共符合表的一部分,在/proc/ksyms中可以看到這些新增加的符號(hào)。通常情況之下,模塊只需實(shí)現(xiàn)自己的功能,不必導(dǎo)出任何符號(hào),然而,如果有其他模塊需要使用模塊導(dǎo)出的符號(hào)時(shí),就必須導(dǎo)出符號(hào),只有顯示的導(dǎo)出符號(hào)才能被其他模塊使用,Linux2.6內(nèi)核中默認(rèn)不導(dǎo)出所有的符號(hào),不必使用EXPORT_NO_SYMBOLS宏來定義;而在2.4內(nèi)核中恰恰相反,它默認(rèn)導(dǎo)出所有的符號(hào),除非使用EXPORT_NO_SYMBOLS,因此在上面給出的范例中可以省略去該定義語句。

      6)Linx內(nèi)核統(tǒng)一了很多設(shè)備類型,同時(shí)也支持更大的系統(tǒng)和更多的設(shè)備,原來Linux2.4內(nèi)核中的變量kdev_t已經(jīng)被廢除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主設(shè)備號(hào)和20位次設(shè)備號(hào)。調(diào)用函數(shù)為unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。

      所有的內(nèi)存分配函數(shù)不再包含在頭文件 中,而是包含在 中,而原來的 已經(jīng)不存在。所以當(dāng)在驅(qū)動(dòng)程序中要用到函數(shù)kmalloc()或kfree()等內(nèi)存分配函數(shù)時(shí),就必須要定義頭文件 而不是。同時(shí),前面提到的申請(qǐng)內(nèi)存和釋放內(nèi)存函數(shù)的具體參數(shù)也有了一定的改變,包括:分配標(biāo)志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配標(biāo)志等,使得內(nèi)存操作更加方便。

      8)因?yàn)閮?nèi)核中有些地方的內(nèi)存分配是不允許失敗的,所以為了確保這種情況下得成功分配,linux2.6版本內(nèi)核中開發(fā)了一種稱為“內(nèi)存池”的抽象。內(nèi)存池其實(shí)相當(dāng)于后備的高速緩存,以便在緊急狀態(tài)下使用。要使用內(nèi)存池的處理函數(shù)時(shí),必須包含頭文件。內(nèi)存池處理函數(shù)主要有以下幾個(gè):mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();

      另外值得一提的是:2.6內(nèi)核為了區(qū)別以.o為擴(kuò)展名的常規(guī)對(duì)象文件,將內(nèi)核模塊的擴(kuò)展名改為.ko,所以驅(qū)動(dòng)程序最后是被編譯為ko后綴的可加載模塊,在應(yīng)用程序中加載驅(qū)動(dòng)程序模塊時(shí)要注意。結(jié)語

      驅(qū)動(dòng)程序的開發(fā)作為嵌入式linux系統(tǒng)開發(fā)過程當(dāng)中最重要的環(huán)節(jié)之一,與硬件特性和操作系統(tǒng)的內(nèi)核有著緊密的聯(lián)系。隨著linux內(nèi)核版本的升級(jí),內(nèi)核驅(qū)動(dòng)程序必然要作出相應(yīng)的改進(jìn),相信隨著嵌入式Linux系統(tǒng)在各個(gè)領(lǐng)域中的廣泛應(yīng)用,具有可搶占實(shí)時(shí)性的Linux2.6內(nèi)核必定會(huì)在嵌入式領(lǐng)域大顯身手。本文會(huì)對(duì)廣大的驅(qū)動(dòng)程序開發(fā)人員有一定的幫助。

      第二篇:基于嵌入式Linux的IPMI驅(qū)動(dòng)程序設(shè)計(jì)

      基于嵌入式Linux的IPMI驅(qū)動(dòng)程序設(shè)計(jì)

      2012-04-28

      丁四華,張志政,東南大學(xué)

      摘 要:針對(duì)Linux內(nèi)核下通用IPMI協(xié)議實(shí)現(xiàn)部分過于復(fù)雜、繁瑣、占用過多內(nèi)存資源,不利于某些簡(jiǎn)單嵌入式應(yīng)用場(chǎng)合的不足,提出了通過在FPGA邏輯模擬I2C通道的HOST單板與IPMC子卡的硬件環(huán)境上,采用經(jīng)過簡(jiǎn)化的IPMI請(qǐng)求/應(yīng)答消息格式,借助專業(yè)Linux的I2C核心框架,實(shí)現(xiàn)了相應(yīng)的IPMI驅(qū)動(dòng)程序功能,方便了管理員監(jiān)測(cè)、管理、診斷系統(tǒng)狀態(tài),并根據(jù)系統(tǒng)崩潰時(shí)的狀態(tài),來及時(shí)恢復(fù)系統(tǒng)。本文詳細(xì)描述了簡(jiǎn)化的IPMI協(xié)議原理,以及基于Linux內(nèi)核I2C核心框架的IPMI驅(qū)動(dòng)的各功能模塊的設(shè)計(jì)原理,并詳細(xì)描述了IPMI驅(qū)動(dòng)功能模塊的數(shù)據(jù)收發(fā)流程。研究結(jié)果表明,改進(jìn)的簡(jiǎn)化IPMI驅(qū)動(dòng)功能模塊有效的降低了系統(tǒng)的復(fù)雜度、節(jié)省了內(nèi)存資源,達(dá)到了精簡(jiǎn)嵌入式應(yīng)用系統(tǒng)的目的。關(guān)鍵詞:Linux;IPMI協(xié)議;FPGA;IPMC子卡;I2C總線 1.引言

      IPMI(Intelligent Platform Management Interface)是一種無代理的智能平臺(tái)管理接口,是由Intel 等公司推出的一個(gè)重要的開放標(biāo)準(zhǔn)。IPMI定義了管理員如何監(jiān)測(cè)系統(tǒng)硬件狀態(tài),控制系統(tǒng)組件和檢索重要系統(tǒng)事件的日志以進(jìn)行遠(yuǎn)程管理和恢復(fù)。

      近年來,廣泛采用IPMI協(xié)議來監(jiān)測(cè)硬件系統(tǒng)的狀況,例如溫度、風(fēng)扇、電壓和硬件錯(cuò)誤(存儲(chǔ)、網(wǎng)絡(luò)等)和機(jī)箱防盜,刀片支持等。由于IPMI可以獨(dú)立于操作系統(tǒng)之外,即使操作系統(tǒng)已經(jīng)暫停或服務(wù)器已經(jīng)關(guān)閉,管理員照樣可以監(jiān)測(cè)、管理、診斷和恢復(fù)系統(tǒng)。

      針對(duì)Linux 內(nèi)核自帶的IPMI驅(qū)動(dòng)過于復(fù)雜、繁瑣、占用過多內(nèi)存資源的不足,本文根據(jù)ATCA(Advanced Telecom Computing Architecture)方案設(shè)計(jì),采用簡(jiǎn)化的IPMI協(xié)議來管理ATCA機(jī)框內(nèi)各硬件單板的物理地址與狀態(tài)。ATCA平臺(tái)的HOST單板通過I2C總線接口同IPMC(Intelligent Platform Management Controller)子卡通信,從而獲得啟動(dòng)所需的單板物理地址等消息, HOST 單板和IPMC子卡之間采用IPMI協(xié)議進(jìn)行通信。本文討論了該方案在Linux 下IPMI 驅(qū)動(dòng)程序功能的設(shè)計(jì)。2.IPMI 協(xié)議原理

      HOST單板和IPMC子卡之間的硬件接口通過I2C總線來通信,軟件上采用IPMI協(xié)議。HOST單板不能直接獲取單板的相關(guān)物理信息,必須要通過IPMI 協(xié)議從IPMC子卡上獲取。

      下面描述IPMI 協(xié)議設(shè)計(jì)要點(diǎn)。

      (1)IPMI協(xié)議采用Request/Response 的模式,我們通常把IPMI的請(qǐng)求消息稱為命令,通過采用Request/Response 模式可使IPMI消息在不同的傳輸通道上傳送,在我們的系統(tǒng)中,采用了I2C總線作為物理上面的傳輸通道進(jìn)行消息的傳送,上面?zhèn)鬏數(shù)南⒌母袷桨凑誌PMI協(xié)議規(guī)定的消息格式。

      (2)IPMI命令是一個(gè)功能命令的集合,通過IPMI消息中的Network Function字段來表示,這些命令集合中包括了與事件相關(guān)的一些命令集合。通過在命令集合里面不同的字段的不同含義來代表該條消息的具體請(qǐng)求。

      (3)IPMI中所有的請(qǐng)求消息中都包括一個(gè)網(wǎng)絡(luò)功能(Network Function),命令(command),以及可選的數(shù)據(jù)(data)字段。IPMI的響應(yīng)消息和IPMI的請(qǐng)求消息采用同樣的消息格式。IPMI消息分為請(qǐng)求和應(yīng)答兩種消息,具體的消息格式如下所示:

      圖1 IPMI請(qǐng)求消息格式

      圖2 IPMI應(yīng)答消息格式

      在IPMI消息中,一次請(qǐng)求消息的最大長(zhǎng)度不能超過32Bytes,如圖1中所示,在這最長(zhǎng)的32個(gè)BYTES的消息結(jié)構(gòu)中,包括了接收該消息的地址(Responser Address),自身的地址(Requester Address),消息中的NetFn/LUN字段總共是一個(gè)BYTE,前面6個(gè)bits表示的是NetFn,后面的2個(gè)bits表示的請(qǐng)求方的LUN,Seq/Lun字段與NetFn/LUN字段相似,只不過前面的6個(gè)bits表示的是序列號(hào),command字段用來表示具體的命令,data字段中存放的是具體的數(shù)據(jù),最大長(zhǎng)度不能超過25bytes,除了上面的三個(gè)字段外,還有兩個(gè)校驗(yàn)和字段,分別用來對(duì)消息頭和消息體來進(jìn)行校驗(yàn)。

      應(yīng)答消息(參見圖2)和請(qǐng)求消息在結(jié)構(gòu)上面相同,在回應(yīng)請(qǐng)求的應(yīng)答消息中用該將請(qǐng)求的地址和響應(yīng)的地址字段相互調(diào)換,序列號(hào)保持不變,NetFn字段加1,LUN填寫的是將請(qǐng)求消息中的字段互換。例如在HOST通過IPMC獲取32bits的物理信息,HOST按照請(qǐng)求的消息格式發(fā)送一條請(qǐng)求到IPMC,IPMC收到后,按照響應(yīng)的消息的格式發(fā)送應(yīng)答到HOST,并將物理信息放到應(yīng)答消息的DATA字段中,HOST接收到回應(yīng)后就可以從DATA字段中直接獲取到相關(guān)的數(shù)據(jù)信息。3.Linux下的IPMI驅(qū)動(dòng)設(shè)計(jì)

      Linux下IPMI模塊驅(qū)動(dòng)采用分層設(shè)計(jì),詳細(xì)設(shè)計(jì)說明見各以下各小節(jié)。3.1 Linux下的IPMI驅(qū)動(dòng)架構(gòu)

      Linux下IPMI模塊驅(qū)動(dòng)分為兩部分,一部分為I2C驅(qū)動(dòng)模塊,位于Linux內(nèi)核態(tài),為IPMI驅(qū)動(dòng)提供底層Linux 硬件驅(qū)動(dòng);另一部分為BSP子系統(tǒng)PMI接口封裝層,位于Linux用戶態(tài),為上層應(yīng)用提供IPMI模塊初始化、消息發(fā)送、消息接收接口。模塊位置參見圖3。

      圖3 Linux下的IPMI驅(qū)動(dòng)架構(gòu)

      3.2 硬件環(huán)境描述

      I2C總線是PHILIPS(飛利浦)公司推出的兩線式串行總線,用于連接微控制器及其外圍設(shè)備,具有簡(jiǎn)單、高效等特點(diǎn)。由于其接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片引腳的數(shù)量,降低了互聯(lián)成本,特別適用于嵌入式產(chǎn)品。

      HOST單板通過FPGA(Field Programable Gate Array)邏輯模擬的I2C模塊與IPMC子卡通過FPGA邏輯模擬的I2C模塊通信,該I2C模塊目前只支持主發(fā),從收功能。參見圖4。另外,在該條I2C總線上,可以同時(shí)掛接其它的I2C設(shè)備,例如,溫度監(jiān)控器等。

      圖4 HOST單板與IPMC子卡通信圖示

      3.3 Linux I2C驅(qū)動(dòng)模塊設(shè)計(jì)

      Linux下IPMI軟件模塊代碼在整個(gè)Linux系統(tǒng)中屬于字符設(shè)備驅(qū)動(dòng),按照模塊主要功能來劃分,整個(gè)驅(qū)動(dòng)大體可以分為以下五個(gè)模塊:

      (1)I2C核心框架功能實(shí)現(xiàn)子模塊;(2)FPGA邏輯模擬I2C設(shè)備驅(qū)動(dòng)子模塊;

      (3)FPGA邏輯模擬I2C適配器驅(qū)動(dòng)子模塊;

      (4)I2C設(shè)備方法子模塊;

      (5)IPMI用戶態(tài)接口封裝子模塊。3.3.1 I2C核心框架功能實(shí)現(xiàn)子模塊

      該模塊提供了核心數(shù)據(jù)結(jié)構(gòu)的定義、I2C適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷管理,I2C通信方法上層的、與具體適配器無關(guān)的代碼、檢測(cè)設(shè)備地址的上層代碼等。

      內(nèi)核中I2C 相關(guān)代碼可以分為三個(gè)層次(參見圖5):

      (1)I2C core框架:提供了核心數(shù)據(jù)結(jié)構(gòu)的定義和相關(guān)接口函數(shù),用來實(shí)現(xiàn)I2C適配器驅(qū)動(dòng)和設(shè)備驅(qū)動(dòng)的注冊(cè)、注銷管理,以及I2C通信方法上層的、與具體適配器無關(guān)的代碼,為系統(tǒng)中每個(gè)I2C總線增加相應(yīng)的讀寫方法。

      (2)I2C總線適配器驅(qū)動(dòng):定義描述具體I2C總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)在具體I2C適配器上的I2C總線通信方法,并由i2c_algorithm數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。

      (3)I2C設(shè)備驅(qū)動(dòng):定義描述具體設(shè)備的i2c_client和可能的私有數(shù)據(jù)結(jié)構(gòu)、借助I2C core提供的函數(shù)接口完成設(shè)備在內(nèi)核的注冊(cè),并實(shí)現(xiàn)具體的功能,包括read, write以及ioctl等對(duì)用戶層操作的接口。

      總體而言,Linux中I2C總線的驅(qū)動(dòng)分為兩個(gè)部分:總線驅(qū)動(dòng)(BUS)和設(shè)備驅(qū)動(dòng)(DEVICE)。I2C core與I2C總線適配器驅(qū)動(dòng)完成了硬件上的主機(jī)總線驅(qū)動(dòng)(BUS),而I2C driver則實(shí)現(xiàn)了從機(jī)設(shè)備驅(qū)動(dòng)。在設(shè)計(jì)中,I2C core提供的接口是統(tǒng)一的,不需要修改,我們只需要實(shí)現(xiàn)特定I2C總線適配器驅(qū)動(dòng)和I2C設(shè)備驅(qū)動(dòng),這樣大大提高了系統(tǒng)的可移植性。

      圖5 Linux內(nèi)核I2C框架模塊關(guān)系圖示

      3.3.2 FPGA 邏輯模擬I2C 設(shè)備驅(qū)動(dòng)子模塊

      該模塊描述具體設(shè)備的i2c_client和可能的私有數(shù)據(jù)結(jié)構(gòu)、借助I2C框架的i2c_probe函數(shù)實(shí)現(xiàn)注冊(cè)設(shè)備的attach_adapter方法、提供設(shè)備可能使用的地址范圍、以及設(shè)備地址檢測(cè)成功后創(chuàng)建i2c_client數(shù)據(jù)結(jié)構(gòu)的回調(diào)函數(shù)。這部分功能主要由bsp_ipmi_drv.c文件來描述。3.3.3 FPGA邏輯模擬I2C適配器驅(qū)動(dòng)子模塊

      FPGA模擬I2C適配器驅(qū)動(dòng)子模塊,定義描述具體I2C總線適配器的i2c_adapter數(shù)據(jù)結(jié)構(gòu)、實(shí)現(xiàn)在具體I2C 適配器上的I2C總線通信方法,并由i2c_algorithm 數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述。這部分功能主要由bsp_ipmi_adap.c文件來描述。

      3.3.4 I2C設(shè)備方法子模塊

      該模塊提供創(chuàng)建I2C適配器的/dev/ipmi/%d 設(shè)備節(jié)點(diǎn),提供IPMI設(shè)備訪問方法(read & write, open & release, ioctl)等,這部分功能主要由bsp_ipmi_devintf.c文件來描述。3.3.5 IPMI用戶態(tài)接口封裝子模塊 該模塊主要實(shí)現(xiàn)I2C通信從設(shè)備的選取、I2C設(shè)備方法系統(tǒng)調(diào)用的封裝,和IPMI消息封裝、數(shù)據(jù)收發(fā)的格式化等操作。這部分功能主要由bsp_ipmi_api.c文件來描述。

      3.3.6 采用I2C框架的IPMI驅(qū)動(dòng)的數(shù)據(jù)收發(fā)流程

      IPMI模塊驅(qū)動(dòng)采用內(nèi)核I2C核心框架,HOST單板IPMI模塊驅(qū)動(dòng)的數(shù)據(jù)收發(fā)流程分為四個(gè)層次(參見圖6)

      數(shù)據(jù)發(fā)送流程:

      (1)上層用戶調(diào)用Linux用戶態(tài)IPMI消息發(fā)送函數(shù)BSP_IpmiSend()函數(shù)向IPMC子卡發(fā)送消息;

      (2)BSP_IpmiSend()函數(shù)通過write系統(tǒng)調(diào)用切換到Linux內(nèi)核態(tài),調(diào)用I2C設(shè)備接口驅(qū)動(dòng)層的write方法實(shí)現(xiàn)ipmcdev_write()函數(shù);

      (3)ipmcdev_write()函數(shù)通過調(diào)用I2C核心層i2c_master_send()函數(shù)來發(fā)送消息;

      (4)i2c_master_send()函數(shù)最后調(diào)用具體I2C適配器驅(qū)動(dòng)層的i2c_ipmc_xfer()函數(shù)來操作I2C總線,該函數(shù)受到I2C框架總線鎖的保護(hù),任何時(shí)刻只能由一個(gè)進(jìn)程訪問,符合硬件I2C總線的實(shí)際情況。

      (5)i2c_ipmc_xfer()函數(shù)根據(jù)入?yún)⒄{(diào)用ipmc_write()函數(shù)來向I2C 硬件設(shè)備發(fā)送數(shù)據(jù)。

      數(shù)據(jù)接收流程:

      (1)上層用戶調(diào)用Linux用戶態(tài)IPMI消息接收函數(shù)BSP_IpmiRecv()函數(shù)接收來自IPMC子卡的消息;

      (2)BSP_ IpmiRecv()函數(shù)通過read系統(tǒng)調(diào)用切換到Linux內(nèi)核態(tài),調(diào)用I2C設(shè)備接口驅(qū)動(dòng)層的read方法實(shí)現(xiàn)ipmcdev_read()函數(shù);

      (3)ipmcdev_read()函數(shù)通過調(diào)用I2C核心層i2c_master_recv()函數(shù)來接收消息;

      (4)i2c_master_read()函數(shù)最后調(diào)用具體I2C適配器驅(qū)動(dòng)層的i2c_ipmc_xfer()函數(shù)來操作I2C總線,該函數(shù)受到I2C框架總線鎖的保護(hù),任何時(shí)刻只能由一個(gè)進(jìn)程訪問,符合硬件I2C總線的實(shí)際情況。

      (5)i2c_ipmc_xfer()函數(shù)根據(jù)入?yún)⒄{(diào)用ipmc_read()函數(shù)來阻塞接收來自I2C硬件設(shè)備的數(shù)據(jù)。

      圖6 IPMI模塊采用I2C核心框架的數(shù)據(jù)收發(fā)流程

      4.總結(jié)

      本文主要介紹了簡(jiǎn)化的嵌入式Linux的IPMI驅(qū)動(dòng)程序設(shè)計(jì)。通過全文可以看出,基于FPGA邏輯模擬I2C通道的HOST 單板與IPMC 子卡的硬件環(huán)境,借助Linux內(nèi)核穩(wěn)定而又專業(yè)的I2C核心框架,使得設(shè)計(jì)和實(shí)現(xiàn)基于I2C核心框架的簡(jiǎn)化IPMI驅(qū)動(dòng)變得非常容易。同時(shí)本文詳細(xì)描述了IPMI協(xié)議的原理和簡(jiǎn)化后的消息格式。通過該驅(qū)動(dòng),管理員可以方便的監(jiān)測(cè)、管理、診斷系統(tǒng)狀態(tài),并恢復(fù)系統(tǒng)??傊?,改進(jìn)的簡(jiǎn)化IPMI驅(qū)動(dòng)功能模塊有效的降低了系統(tǒng)的復(fù)雜度、節(jié)省了內(nèi)存資源,達(dá)到了精簡(jiǎn)嵌入式應(yīng)用系統(tǒng)的目的。

      第三篇:嵌入式linu學(xué)習(xí)心得

      嵌入式Linux學(xué)習(xí)心得

      1、Linux命令

      ls:查看目錄-l以列表方式查看;ls –l 與ll的功能一樣 pwd: 查看當(dāng)前的目錄

      cd:改變當(dāng)前操作目錄cd /直接跳到根目錄 cd..回到上一級(jí)目錄 cat: 打印顯示當(dāng)前文件的內(nèi)容信息

      mkdir:創(chuàng)建目錄

      fdisk: 查看硬盤分區(qū)信息,-l以列表方式查看

      ->代表是鏈接文件,類似window下的快捷方式。

      cp: 復(fù)制命令,例子cp 文件名 /home/dir/

      mv: 移動(dòng)或改名,如mv sonf.confsonf.txt(改名)移動(dòng):mv sonf.conf / rm:刪除命令,如rm –f test.c;如刪除目錄rm –fr d

      man:查看某個(gè)命令的幫助,man 命令

      2、各系統(tǒng)目錄的功能

      drw—r—w--:d代表是目錄,drw代表當(dāng)前用戶的權(quán)限,r代表組用戶的權(quán)限,w代表其它用戶的權(quán)限。x代表有執(zhí)行權(quán)限。

      /boot/gruff.conf: 啟動(dòng)引導(dǎo)程序

      /dev:brw—rw--:b代表是塊設(shè)備。Linux設(shè)備有三種,塊設(shè)備(b開頭)、字符設(shè)備(c開頭)、網(wǎng)絡(luò)設(shè)備。had代表第一個(gè)硬盤,hdb代表第二個(gè)硬盤。Hdb2代表第二塊硬盤的第二個(gè)分區(qū)。3,67代表主設(shè)備為3,從設(shè)備為67./etc:存放的是系統(tǒng)的配置文件。Inittab文件存放不同啟動(dòng)方式下必須啟動(dòng)的進(jìn)程。Inittab文件中有6個(gè)啟動(dòng)level,wait中對(duì)應(yīng)著6個(gè)level的目錄,respawn代表當(dāng)一個(gè)進(jìn)程被意外終止了,但會(huì)自動(dòng)啟動(dòng)的進(jìn)程,如守護(hù)進(jìn)程。rc.d目錄中存放了一個(gè)rc.sysinit文件,里面存放系統(tǒng)初始化配置信息。/etc還有一個(gè)vsftpd里面存放tcp、ftp的配置。

      /home : 用戶目錄,存放用戶的文件,/lib:存放庫(kù)文件,后綴為so的文件代表動(dòng)態(tài)鏈接庫(kù)。

      /lost+found:系統(tǒng)意外終止,存放一些可以找回的文件。

      /mnt:掛載外部設(shè)備,如掛載光驅(qū):mount –t /dev/cdrom/mnt/cdrom,如

      果在雙系統(tǒng)中,要查看windows中D盤的文件,首先應(yīng)該將D盤的文件映射過來,mount –t /dev/hda2/mnt/windows/d

      /opt:用戶安裝的應(yīng)用程序

      /proc:是系統(tǒng)運(yùn)行的映射,比較重要。里面的文件數(shù)字代表進(jìn)程號(hào)。每個(gè)進(jìn)程號(hào)目錄下包含進(jìn)程的基本信息。還有其他信息,如cpuinfo等,內(nèi)核支持的文件系統(tǒng)filesystem等。系統(tǒng)支持的中斷interrupts,iomen代表內(nèi)存分配情況。ioport存放IO端口號(hào)。還有分區(qū)信息,modole信息,狀態(tài)信息,版本信息

      對(duì)于Linux的設(shè)備驅(qū)動(dòng)程序,有兩種加載模式,一種是直接加載進(jìn)linux內(nèi)核,一種是以模塊的方式加載到內(nèi)核。

      /sbin: 系統(tǒng)管理的一些工具。如poweroff關(guān)機(jī)工具。

      /usr: 安裝系統(tǒng)時(shí)很多文件放在此目錄下面,包含一些更新等,include包含的頭文件,lib 是Linux的庫(kù)文件,src包含Linux2.4的內(nèi)核源碼

      /var:存放是臨時(shí)變量

      3、

      第四篇:嵌入式程序設(shè)計(jì)課程設(shè)計(jì)

      課程設(shè)計(jì)

      課 程 名嵌入式軟件開發(fā)技術(shù)

      題 目 基于嵌入式Linux的溫度監(jiān)測(cè)系統(tǒng)的

      設(shè)計(jì)與實(shí)現(xiàn)

      專 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)(嵌入式系統(tǒng)方向)班 級(jí) 13計(jì)算機(jī)嵌入式系統(tǒng)班 學(xué) 號(hào) 學(xué)生姓名

      2016年6月

      摘要

      溫度是個(gè)很普遍而又非常重要的參數(shù),在日常生活、工農(nóng)業(yè)生產(chǎn)以及科研領(lǐng)域都有著廣泛的應(yīng)用。因此,研制能夠準(zhǔn)確地測(cè)量和記錄這個(gè)參數(shù)值的系統(tǒng)具有十分重要的意義。

      基于ARM的嵌入式溫度監(jiān)測(cè)系統(tǒng)是采用嵌入式Linux作為操作系統(tǒng),針對(duì)以S5PV210為處理器的開發(fā)板設(shè)計(jì)的一個(gè)嵌入式溫度監(jiān)測(cè)系統(tǒng)。論文在分析了Linux設(shè)備驅(qū)動(dòng)程序的基本工作原理基礎(chǔ)上,討論了開發(fā)中經(jīng)常會(huì)碰到的中斷處理、擁塞處理、I/O端口,并在此基礎(chǔ)上實(shí)現(xiàn)了基于S5PV210嵌入式處理器的開、讀、寫、關(guān)外部RAM的字符設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)。結(jié)合高精度溫度傳感器DS18B20,實(shí)現(xiàn)溫度的正確采集,并通過以太網(wǎng)絡(luò)將數(shù)據(jù)上傳給上位機(jī)客戶端。

      論文首先介紹了通信網(wǎng)絡(luò)中各種設(shè)備特性、總線結(jié)構(gòu)及傳輸技術(shù),然后根據(jù)單片機(jī)與PC機(jī)之間的串行通信原理,用ubantu完成溫度監(jiān)測(cè)系統(tǒng)的軟件設(shè)計(jì)與實(shí)現(xiàn),為用戶提供一個(gè)友好的人機(jī)界面,對(duì)監(jiān)測(cè)系統(tǒng)進(jìn)行控制并顯示采集后的數(shù)據(jù)。本系統(tǒng)還通過多線程實(shí)現(xiàn)了多個(gè)客戶端與服務(wù)器的通信。

      關(guān)鍵詞:S5PV210;嵌入式Linux操作系統(tǒng);DS18B20;網(wǎng)絡(luò)編程

      I

      Abstract

      Temperature is a very common and very important parameter, in daily life, industrial and agricultural production and scientific research fields have a wide range of applications.Therefore, it is very important to develop a system that can accurately measure and record the value of this parameter.The temperature monitoring system of base on the ARM is use of embedded Linux as the operating system for the processor to S5PV210 development board designed for an embedded temperature monitoring system.Based on the analysis of the basic working principle based on the Linux device drivers discussed development often encounter interrupt handling, congestion handling, I / O ports, and on this basis to achieve the embedded processor based on open S5PV210 reading, writing, characters off the external RAM device driver and network drives.Combined with precision temperature sensor DS18B20, to achieve the correct temperature acquisition, and upload the data via Ethernet to a PC client.At first,the paper introduces the characteristics of various devices in a communication network, the bus structure and transmission technology, and according to the principle of serial communication between SCM and PC, with ubantu complete temperature monitoring system software design and implementation, to provide users with a friendly man-machine interface, the monitoring system to control and display the data after collection.The system also enables communication via a plurality of multi-threaded client and the server.Key words:S5PV210;embedded Linux operating system;DS18B20;Network programming

      II

      1.引言.......................................................................................................................................1 1.1 設(shè)計(jì)背景及意義...............................................................................................................1 1.2 設(shè)計(jì)的主要內(nèi)容................................................................................................................2 2.相關(guān)技術(shù)...............................................................................................................................2 2.1 嵌入式Linux......................................................................................................................2 2.2 S5PV210.............................................................................................................................3 2.3 socket網(wǎng)絡(luò)編程..............................................................................................................3 3.具體實(shí)現(xiàn)功能.......................................................................................................................4 3.1總體框架圖........................................................................................................................4 3.2客戶端功能........................................................................................................................5 3.3 服務(wù)器功能........................................................................................................................5 3.4 實(shí)驗(yàn)板輸出信息...............................................................................................................5 4.具體實(shí)現(xiàn)過程.......................................................................................................................6 4.1 交叉編譯工具的安裝.......................................................................................................6 4.2 客戶端模塊的設(shè)計(jì)...........................................................................................................7 4.3 服務(wù)器模塊.......................................................................................................................8 4.4 LED點(diǎn)亮模塊..................................................................................................................10 4.5 溫度感應(yīng)模塊.................................................................................................................11 5.測(cè)試結(jié)果分析.....................................................................................................................13 5.1 各模塊運(yùn)行的效果.........................................................................................................13 5.2 可擴(kuò)展功能......................................................................................................................15 6.總結(jié)與展望.......................................................................................................................15

      第一章 引言

      1.1 設(shè)計(jì)背景及意義

      溫度作為工業(yè)、農(nóng)業(yè)、國(guó)防和科研等部門最普遍的測(cè)量項(xiàng)目。它在工農(nóng)業(yè)生產(chǎn)、現(xiàn)代科學(xué)研究以及高新技術(shù)開發(fā)過程中也是一個(gè)極其普遍而又非

      常重要的參數(shù)。因此,在這些領(lǐng)域中,對(duì)于這個(gè)參數(shù)的測(cè)量與控制就顯得尤為重要,特別是在紡織工業(yè)、冶金、化工、食品、溫室種植,汽車制造以及氣象預(yù)報(bào)和科研實(shí)驗(yàn)室等許多地方,都具有舉足輕重的作用。

      以往這些工作大多是由人工完成,不但工作量大,記錄的數(shù)據(jù)少,對(duì)溫度的調(diào)節(jié)缺乏實(shí)時(shí)性,而且電路復(fù)雜,標(biāo)定和校準(zhǔn)也比較麻煩,難以滿足現(xiàn)代溫度測(cè)量的要求[1]。自從傳感器技術(shù)、微控制器技術(shù)和計(jì)算機(jī)技術(shù)日漸成熟之后,現(xiàn)代的溫度測(cè)量與控制系統(tǒng)克服了以往系統(tǒng)中存在的一些問題,比如對(duì)環(huán)境溫度的控制與調(diào)節(jié)以及數(shù)據(jù)的記錄都由微控制器或計(jì)算機(jī)自動(dòng)完成,人們的工作量大大地降低,而且測(cè)得的數(shù)據(jù)也更加的精確,對(duì)環(huán)境溫度的調(diào)節(jié)更具有實(shí)時(shí)性[2]。

      1.2 設(shè)計(jì)的主要內(nèi)容

      此次主要采用嵌入式Linux作為操作系統(tǒng),針對(duì)以S5PV210為處理器的開發(fā)板設(shè)計(jì)的一個(gè)嵌入式溫度監(jiān)測(cè)系統(tǒng)。在Linux設(shè)備驅(qū)動(dòng)程序的基本工作原理基礎(chǔ)上,討論了開發(fā)中經(jīng)常會(huì)碰到的中斷處理、擁塞處理、I/O端口,并在此基礎(chǔ)上實(shí)現(xiàn)了基于S5PV210嵌入式處理器的開、讀、寫、關(guān)外部RAM的字符設(shè)備驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)。結(jié)合高精度溫度傳感器DS18B20,實(shí)現(xiàn)溫度的正確采集,并通過以太網(wǎng)絡(luò)將數(shù)據(jù)上傳給上位機(jī)客戶端。

      溫度監(jiān)測(cè)系統(tǒng)根據(jù)Linux中的網(wǎng)絡(luò)通信技術(shù)和串口通信技術(shù)來傳輸數(shù)據(jù)。用ubantu完成溫度監(jiān)測(cè)系統(tǒng)的軟件設(shè)計(jì)與實(shí)現(xiàn),為用戶提供一個(gè)友好的人機(jī)界面,對(duì)監(jiān)測(cè)系統(tǒng)進(jìn)行控制并顯示采集后的數(shù)據(jù)。本系統(tǒng)還通過多線程實(shí)現(xiàn)了多個(gè)客戶端與服務(wù)器的通信。

      第二章 相關(guān)技術(shù)

      2.1 嵌入式Linux Linux是UNIX系統(tǒng)的一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個(gè)基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個(gè)性能穩(wěn)定的多用戶網(wǎng)絡(luò)操作系統(tǒng)。它誕生與1991年的10月5日。以后借助與Internet

      網(wǎng),并進(jìn)過全世界各地計(jì)算機(jī)愛好者的共同努力下,現(xiàn)已成為世界上使用最多的一種UNIX類操作系統(tǒng),并且使用人數(shù)還在迅猛增漲。

      本次設(shè)計(jì)采用Linux作為嵌入式操作系統(tǒng)的原因有以下幾點(diǎn):[3] 1)低成本開發(fā)系統(tǒng): 2)可應(yīng)用于多種硬件平臺(tái) 3)可定制的內(nèi)核 4)性能優(yōu)異 5)良好的網(wǎng)絡(luò)支持

      2.2 S5PV210

      S5PV210又名“蜂鳥”(Hummingbird),是三星推出的一款適用于智能手機(jī)和平板電腦等多媒體設(shè)備的應(yīng)用處理器。

      S5PV210采用了ARM CortexTM-A8內(nèi)核,ARM V7指令集,主頻可達(dá)1GHZ,64/32位內(nèi)部總線結(jié)構(gòu),32/32KB的數(shù)據(jù)/指令一級(jí)緩存,512KB的二級(jí)緩存,可以實(shí)現(xiàn)2000DMIPS(每秒運(yùn)算20億條指令集)的高性能運(yùn)算能力。

      包含很多強(qiáng)大的硬件編解碼功能,內(nèi)建MFC(Multi Format Codec),支持MPEG-1/2/4,H.263,H.264等格式視頻的編解碼,支持模擬/數(shù)字TV輸出。JPEG硬件編解碼,最大支持8000x8000分辨率

      內(nèi)建高性能PowerVR SGX540 3D圖形引擎和2D圖形引擎,支持2D/3D圖形加速,是第五代PowerVR產(chǎn)品,其多邊形生成率為2800萬多邊形/秒,像素填充率可達(dá)2.5億/秒,在3D和多媒體方面比以往大幅提升,能夠支持DX9,SM3.0,OpenGL2.0等PC級(jí)別顯示技術(shù)。

      具備IVA3硬件加速器,具備出色的圖形解碼性能,可以支持全高清、多標(biāo)準(zhǔn)的視頻編碼,流暢播放和錄制30幀/秒的1920×1080像素(1080p)的視頻文件,可以更快解碼更高質(zhì)量的圖像和視頻,同時(shí),內(nèi)建的HDMIv1.3,可以將高清視頻輸出到外部顯示器上。

      2.3 socket網(wǎng)絡(luò)編程

      Socket是進(jìn)程通訊的一種方式,即調(diào)用這個(gè)網(wǎng)絡(luò)庫(kù)的一些API函數(shù)實(shí)現(xiàn)分布在不同主機(jī)的相關(guān)進(jìn)程之間的數(shù)據(jù)交換。[4] 幾個(gè)定義:

      (1)IP地址:即依照TCP/IP協(xié)議分配給本地主機(jī)的網(wǎng)絡(luò)地址,兩個(gè)進(jìn)程要通訊,任一進(jìn)程首先要知道通訊對(duì)方的位置,即對(duì)方的IP。

      (2)端口號(hào):用來辨別本地通訊進(jìn)程,一個(gè)本地的進(jìn)程在通訊時(shí)均會(huì)占用一個(gè)端口號(hào),不同的進(jìn)程端口號(hào)不同,因此在通訊前必須要分配一個(gè)沒有被訪問的端口號(hào)。

      (3)連接:指兩個(gè)進(jìn)程間的通訊鏈路。

      (4)半相關(guān):網(wǎng)絡(luò)中用一個(gè)三元組可以在全局唯一標(biāo)志一個(gè)進(jìn)程:(協(xié)議,本地地址,本地端口號(hào))

      這樣一個(gè)三元組,叫做一個(gè)半相關(guān),它指定連接的每半部分。(4)全相關(guān):一個(gè)完整的網(wǎng)間進(jìn)程通信需要由兩個(gè)進(jìn)程組成,并且只能使用同一種高層協(xié)議。也就是說,不可能通信的一端用TCP協(xié)議,而另一端用UDP協(xié)議。因此一個(gè)完整的網(wǎng)間通信需要一個(gè)五元組來標(biāo)識(shí):(協(xié)議,本地地址,本地端口號(hào),遠(yuǎn)地地址,遠(yuǎn)地端口號(hào))

      這樣一個(gè)五元組,叫做一個(gè)相關(guān)(association),即兩個(gè)協(xié)議相同的半相關(guān)才能組合成一個(gè)合適的相關(guān),或完全指定組成一連接。

      第三章 具體實(shí)現(xiàn)功能

      3.1總體框架圖

      圖1 項(xiàng)目總體框架圖

      3.2客戶端功能

      1)顯示簡(jiǎn)單的用戶界面 2)發(fā)送命令給服務(wù)器 3)接收服務(wù)器傳輸?shù)臄?shù)據(jù) 4)顯示溫度數(shù)據(jù)

      3.3 服務(wù)器功能

      1)接收客戶端發(fā)送的命令 2)處理命令

      3)把命令轉(zhuǎn)發(fā)給硬件 4)獲取硬件處理所得的數(shù)據(jù) 5)把該數(shù)據(jù)傳給客戶端

      3.4 實(shí)驗(yàn)板輸出信息

      1)LED燈按照客戶端的指令亮滅 2)蜂鳴器唱歌

      3)核心板控制輸出溫度傳感器的數(shù)據(jù)到服務(wù)器

      第四章 具體實(shí)現(xiàn)過程

      個(gè)應(yīng)用系統(tǒng)要完成各項(xiàng)功能,首先必須有較完善的硬件作保證。同時(shí)還必須得到相應(yīng)設(shè)計(jì)合理的軟件的支持,尤其是微機(jī)應(yīng)用高速發(fā)展的今天,許多由硬件完成的工作,都可通過軟件編程而代替。甚至有些必須采用很復(fù)雜的硬件電路才能完成的工作,用軟件編和有時(shí)會(huì)變得很簡(jiǎn)單。因此充分利用其內(nèi)部豐富的硬件資源和軟件資源。

      程序設(shè)計(jì)語言有三種:機(jī)器語言、匯編語言、高級(jí)語言。本系統(tǒng)運(yùn)用的是高級(jí)語言所編寫,也就是C語言。所用到的開發(fā)平臺(tái)為ubuntu系統(tǒng)。

      4.1 交叉編譯工具的安裝

      (1)考慮到現(xiàn)今Linux平臺(tái)發(fā)展,交叉編譯平臺(tái)編統(tǒng)一為arm-linux-gcc-4.4.3(2)在windows系統(tǒng)下,建立一個(gè)共享目錄,如:e:/linux_file(3)將光盤目錄linux中的arm-linux-gcc-4.4.3.tar.gz 復(fù)制到e:/linux_file(4)注意在進(jìn)行虛擬機(jī)設(shè)置時(shí)使共享目錄的有效,并添加共享目錄e:/linux_file(5)進(jìn)入linux操作系統(tǒng),root目錄下建立一個(gè)Armcode的子目錄,將共享目錄下的文件arm-linux-gcc-4.4.3.tar.gz復(fù)制到該目錄(6)然后進(jìn)入到該目錄,執(zhí)行解壓命令:#cd /root/Armcode;#tar xvzf arm-linux-gcc-4.4.3.tgz –C /;注意:C 后面有個(gè)空格,并且C 是大寫的,它是英文單詞“Change”的第一個(gè)字母,在此是改變目錄的意思。(7)執(zhí)行

      令,將

      arm-linux-gcc

      到/opt/FriendlyARM/toolschain /4.4.3/bin 目錄。

      (8)把編譯器路徑加入系統(tǒng)環(huán)境變量,運(yùn)行命令:#gedit /root/.bashrc 編輯/root/.bashrc 文件,在最后一行添加:export PATH=$PATH: /opt/FriendlyARM/toolschain/4.4.3/bin(9)重新登錄系統(tǒng)(不必重啟機(jī)器,開始->logout 即可),使以上設(shè)置生效,在命令行輸入:arm-linux-gcc –v,會(huì)出現(xiàn)如下信息,這說明交叉編譯環(huán)境已經(jīng)成功安裝。

      4.2 客戶端模塊的設(shè)計(jì)

      用戶界面的顯示:

      void interface_print(char *temp){ system(“clear”);printf(“e[31m*******************2016梧*********************e[0mn”);printf(“e[31m*

      *e[0mn”);printf(“e[31m*e[0m e[32m點(diǎn)亮LED1: on1

      on2e[0me[31m

      *e[0mn”);printf(“e[31m*e[0m e[33m關(guān)閉LED1: off1

      off2e[0me[31m

      *e[0mn”);printf(“e[31m*e[0m e[34m開蜂鳴器: onb

      songe[0me[31m

      *e[0mn”);printf(“e[31m*e[0m e[35m獲取溫度: get

      e[31m *e[0mn”,temp);printf(“e[31m*e[0m e[36m退

      出: e[0me[31m

      *e[0mn”);printf(“e[31m*

      *e[0mn”);printf(“e[31m******************未

      來**********************e[0mn”);}

      發(fā)送命令給服務(wù)器:

      /*5.調(diào)用I/O函數(shù)(read/write)與客戶端通訊。*/ int i = 5;int pos;while(1){

      ret = poll(pfd,2,-1);

      if(ret > 0){

      if(pfd[0].revents == POLLIN){

      interface_print(temp);

      /*從終端讀取數(shù)據(jù)*/

      memset(buf,0,sizeof(buf));

      ret = read(pfd[0].fd,buf,sizeof(buf)-1);7

      州學(xué)院

      |

      點(diǎn)亮LED2:

      |

      關(guān)閉LED2:

      |

      播放音樂:

      |

      溫度:[%s]e[0m quit

      |

      的大

      } if(ret > 0){

      }

      /*發(fā)送數(shù)據(jù)給服務(wù)器*/ write(sockfd,buf,ret);

      接受服務(wù)器傳輸?shù)臄?shù)據(jù):

      if(pfd[1].revents == POLLIN){

      if(!strncmp(buf,“get”,3)){

      /*接收服務(wù)器發(fā)送的信息*/

      memset(temp,0,sizeof(temp));

      ret = read(pfd[1].fd,temp,sizeof(temp)-1);

      if(ret > 0){

      temp[ret-1] = '