久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

基于嵌入式Linux的IPMI驅動程序設計

時間:2019-05-12 07:20:28下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《基于嵌入式Linux的IPMI驅動程序設計》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《基于嵌入式Linux的IPMI驅動程序設計》。

第一篇:基于嵌入式Linux的IPMI驅動程序設計

基于嵌入式Linux的IPMI驅動程序設計

2012-04-28

丁四華,張志政,東南大學

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

IPMI(Intelligent Platform Management Interface)是一種無代理的智能平臺管理接口,是由Intel 等公司推出的一個重要的開放標準。IPMI定義了管理員如何監測系統硬件狀態,控制系統組件和檢索重要系統事件的日志以進行遠程管理和恢復。

近年來,廣泛采用IPMI協議來監測硬件系統的狀況,例如溫度、風扇、電壓和硬件錯誤(存儲、網絡等)和機箱防盜,刀片支持等。由于IPMI可以獨立于操作系統之外,即使操作系統已經暫停或服務器已經關閉,管理員照樣可以監測、管理、診斷和恢復系統。

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

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

下面描述IPMI 協議設計要點。

(1)IPMI協議采用Request/Response 的模式,我們通常把IPMI的請求消息稱為命令,通過采用Request/Response 模式可使IPMI消息在不同的傳輸通道上傳送,在我們的系統中,采用了I2C總線作為物理上面的傳輸通道進行消息的傳送,上面傳輸的消息的格式按照IPMI協議規定的消息格式。

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

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

圖1 IPMI請求消息格式

圖2 IPMI應答消息格式

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

應答消息(參見圖2)和請求消息在結構上面相同,在回應請求的應答消息中用該將請求的地址和響應的地址字段相互調換,序列號保持不變,NetFn字段加1,LUN填寫的是將請求消息中的字段互換。例如在HOST通過IPMC獲取32bits的物理信息,HOST按照請求的消息格式發送一條請求到IPMC,IPMC收到后,按照響應的消息的格式發送應答到HOST,并將物理信息放到應答消息的DATA字段中,HOST接收到回應后就可以從DATA字段中直接獲取到相關的數據信息。3.Linux下的IPMI驅動設計

Linux下IPMI模塊驅動采用分層設計,詳細設計說明見各以下各小節。3.1 Linux下的IPMI驅動架構

Linux下IPMI模塊驅動分為兩部分,一部分為I2C驅動模塊,位于Linux內核態,為IPMI驅動提供底層Linux 硬件驅動;另一部分為BSP子系統PMI接口封裝層,位于Linux用戶態,為上層應用提供IPMI模塊初始化、消息發送、消息接收接口。模塊位置參見圖3。

圖3 Linux下的IPMI驅動架構

3.2 硬件環境描述

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

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

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

3.3 Linux I2C驅動模塊設計

Linux下IPMI軟件模塊代碼在整個Linux系統中屬于字符設備驅動,按照模塊主要功能來劃分,整個驅動大體可以分為以下五個模塊:

(1)I2C核心框架功能實現子模塊;(2)FPGA邏輯模擬I2C設備驅動子模塊;

(3)FPGA邏輯模擬I2C適配器驅動子模塊;

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

(5)IPMI用戶態接口封裝子模塊。3.3.1 I2C核心框架功能實現子模塊

該模塊提供了核心數據結構的定義、I2C適配器驅動和設備驅動的注冊、注銷管理,I2C通信方法上層的、與具體適配器無關的代碼、檢測設備地址的上層代碼等。

內核中I2C 相關代碼可以分為三個層次(參見圖5):

(1)I2C core框架:提供了核心數據結構的定義和相關接口函數,用來實現I2C適配器驅動和設備驅動的注冊、注銷管理,以及I2C通信方法上層的、與具體適配器無關的代碼,為系統中每個I2C總線增加相應的讀寫方法。

(2)I2C總線適配器驅動:定義描述具體I2C總線適配器的i2c_adapter數據結構、實現在具體I2C適配器上的I2C總線通信方法,并由i2c_algorithm數據結構進行描述。

(3)I2C設備驅動:定義描述具體設備的i2c_client和可能的私有數據結構、借助I2C core提供的函數接口完成設備在內核的注冊,并實現具體的功能,包括read, write以及ioctl等對用戶層操作的接口。

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

圖5 Linux內核I2C框架模塊關系圖示

3.3.2 FPGA 邏輯模擬I2C 設備驅動子模塊

該模塊描述具體設備的i2c_client和可能的私有數據結構、借助I2C框架的i2c_probe函數實現注冊設備的attach_adapter方法、提供設備可能使用的地址范圍、以及設備地址檢測成功后創建i2c_client數據結構的回調函數。這部分功能主要由bsp_ipmi_drv.c文件來描述。3.3.3 FPGA邏輯模擬I2C適配器驅動子模塊

FPGA模擬I2C適配器驅動子模塊,定義描述具體I2C總線適配器的i2c_adapter數據結構、實現在具體I2C 適配器上的I2C總線通信方法,并由i2c_algorithm 數據結構進行描述。這部分功能主要由bsp_ipmi_adap.c文件來描述。

3.3.4 I2C設備方法子模塊

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

3.3.6 采用I2C框架的IPMI驅動的數據收發流程

IPMI模塊驅動采用內核I2C核心框架,HOST單板IPMI模塊驅動的數據收發流程分為四個層次(參見圖6)

數據發送流程:

(1)上層用戶調用Linux用戶態IPMI消息發送函數BSP_IpmiSend()函數向IPMC子卡發送消息;

(2)BSP_IpmiSend()函數通過write系統調用切換到Linux內核態,調用I2C設備接口驅動層的write方法實現ipmcdev_write()函數;

(3)ipmcdev_write()函數通過調用I2C核心層i2c_master_send()函數來發送消息;

(4)i2c_master_send()函數最后調用具體I2C適配器驅動層的i2c_ipmc_xfer()函數來操作I2C總線,該函數受到I2C框架總線鎖的保護,任何時刻只能由一個進程訪問,符合硬件I2C總線的實際情況。

(5)i2c_ipmc_xfer()函數根據入參調用ipmc_write()函數來向I2C 硬件設備發送數據。

數據接收流程:

(1)上層用戶調用Linux用戶態IPMI消息接收函數BSP_IpmiRecv()函數接收來自IPMC子卡的消息;

(2)BSP_ IpmiRecv()函數通過read系統調用切換到Linux內核態,調用I2C設備接口驅動層的read方法實現ipmcdev_read()函數;

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

(4)i2c_master_read()函數最后調用具體I2C適配器驅動層的i2c_ipmc_xfer()函數來操作I2C總線,該函數受到I2C框架總線鎖的保護,任何時刻只能由一個進程訪問,符合硬件I2C總線的實際情況。

(5)i2c_ipmc_xfer()函數根據入參調用ipmc_read()函數來阻塞接收來自I2C硬件設備的數據。

圖6 IPMI模塊采用I2C核心框架的數據收發流程

4.總結

本文主要介紹了簡化的嵌入式Linux的IPMI驅動程序設計。通過全文可以看出,基于FPGA邏輯模擬I2C通道的HOST 單板與IPMC 子卡的硬件環境,借助Linux內核穩定而又專業的I2C核心框架,使得設計和實現基于I2C核心框架的簡化IPMI驅動變得非常容易。同時本文詳細描述了IPMI協議的原理和簡化后的消息格式。通過該驅動,管理員可以方便的監測、管理、診斷系統狀態,并恢復系統。總之,改進的簡化IPMI驅動功能模塊有效的降低了系統的復雜度、節省了內存資源,達到了精簡嵌入式應用系統的目的。

第二篇:基于嵌入式Linux的設備驅動程序設計

基于嵌入式Linux的設備驅動程序設計

Linux為是一個成熟而穩定的操作系統。將Linux植入嵌入式設備具有眾多的優點,包括可剪裁和容易移植等,所以Linux操作系統在嵌入式領域獲得了廣泛的應用。嵌入式Linux一直是嵌入式領域的研究熱點,與PC架構不同,嵌入式系統的硬件具有多樣性和差異性,嵌入式系統的開發需要對特定系統進行硬件設計,同時還要針對這些硬件來編寫驅動程序。Linux內核就是通過驅動程序來同外圍設備打交道的,系統設計人員必須為每個設備編寫驅動程序,否則設備無法在操作系統下正常工作。設備驅動程序設計的基本概念與模型

設備驅動程序是操作系統內核與機器硬件之間的接口,它為應用程序屏蔽了硬件的細節,在應用程序看來,硬件設備只是一個設備文件,應用程序可以象操作普通文件一樣對硬件設備進行操作,設計驅動程序是內核的一部分,可以實現以下功能:

對設備初始化和釋放;

把數據從內核傳送到硬件,以及從硬件讀取數據;

讀取應用程序傳送給設備文件的數據,以及回送應用程序請求的數據;

檢測和處理設備出現的錯誤。

前面已經提到驅動程序的作用,而編寫驅動程序就是構造一系列可供應用程序調動的函數(包括open、release、read、write、llseek、ioctl等)。在用戶自己的驅動程序中,首先要根據驅動程序的功能,實現file_operations結構中的函數,不需要的函數接口可以直接在file_operations結構中初始化為NULL;file_operations變量會在驅動程序初始化時注冊到系統內部。當操作系統對設備操作時,會調用驅動程序注冊的file_operations結構中的函數指針。

以下是嵌入式linux2.4設備驅動程序的最簡模型。

具體實現前面定義的函數時,需注意下面幾點:

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

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

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

Linux2.6與2.4內核驅動程序的區別

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

Linux操作系統的設備驅動程序是在內核空間運行的程序,其中涉及很多內核的操作,隨著Linux內核版本的升級,驅動程序的開發必然也要作出相應的修改,總之,在linux2.6內核上編寫設備驅動程序時具體要注意以下幾個方面:

1)Linux2.6內核驅動程序必須由MODULE_LICENSE(“Dual BSD/GPL”)語句來定義許可證,而不能再用2.4內核的MODULE_LICENSE(“GPL”)。否則,在編譯時會出現警告提示。

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

3)前面給出的字符型設備驅動程序模型中結構體file_operations的定義要采用下面的形式。這是因為在Linux內核中對結構體的定義形式發生了變化,不再支持原來的定義形式。

4)就字符型設備而言,test_open()函數中向內核注冊設備的調用函數register_chrdev()可以升級為int register_chrdev_region(dev_t from,unsigned count,char * name),如果要動態申請主設備號可調用函數int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)來完成;原來的注冊函數還可以用,只是不能注冊設備號大于256的設備,同理,對于塊設備和網絡設備的注冊函數也有著相對應的代替函數。

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

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

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

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

另外值得一提的是:2.6內核為了區別以.o為擴展名的常規對象文件,將內核模塊的擴展名改為.ko,所以驅動程序最后是被編譯為ko后綴的可加載模塊,在應用程序中加載驅動程序模塊時要注意。結語

驅動程序的開發作為嵌入式linux系統開發過程當中最重要的環節之一,與硬件特性和操作系統的內核有著緊密的聯系。隨著linux內核版本的升級,內核驅動程序必然要作出相應的改進,相信隨著嵌入式Linux系統在各個領域中的廣泛應用,具有可搶占實時性的Linux2.6內核必定會在嵌入式領域大顯身手。本文會對廣大的驅動程序開發人員有一定的幫助。

第三篇:嵌入式程序設計課程設計

課程設計

課 程 名嵌入式軟件開發技術

題 目 基于嵌入式Linux的溫度監測系統的

設計與實現

專 業 計算機科學與技術(嵌入式系統方向)班 級 13計算機嵌入式系統班 學 號 學生姓名

2016年6月

摘要

溫度是個很普遍而又非常重要的參數,在日常生活、工農業生產以及科研領域都有著廣泛的應用。因此,研制能夠準確地測量和記錄這個參數值的系統具有十分重要的意義。

基于ARM的嵌入式溫度監測系統是采用嵌入式Linux作為操作系統,針對以S5PV210為處理器的開發板設計的一個嵌入式溫度監測系統。論文在分析了Linux設備驅動程序的基本工作原理基礎上,討論了開發中經常會碰到的中斷處理、擁塞處理、I/O端口,并在此基礎上實現了基于S5PV210嵌入式處理器的開、讀、寫、關外部RAM的字符設備驅動和網絡驅動。結合高精度溫度傳感器DS18B20,實現溫度的正確采集,并通過以太網絡將數據上傳給上位機客戶端。

論文首先介紹了通信網絡中各種設備特性、總線結構及傳輸技術,然后根據單片機與PC機之間的串行通信原理,用ubantu完成溫度監測系統的軟件設計與實現,為用戶提供一個友好的人機界面,對監測系統進行控制并顯示采集后的數據。本系統還通過多線程實現了多個客戶端與服務器的通信。

關鍵詞:S5PV210;嵌入式Linux操作系統;DS18B20;網絡編程

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 設計背景及意義...............................................................................................................1 1.2 設計的主要內容................................................................................................................2 2.相關技術...............................................................................................................................2 2.1 嵌入式Linux......................................................................................................................2 2.2 S5PV210.............................................................................................................................3 2.3 socket網絡編程..............................................................................................................3 3.具體實現功能.......................................................................................................................4 3.1總體框架圖........................................................................................................................4 3.2客戶端功能........................................................................................................................5 3.3 服務器功能........................................................................................................................5 3.4 實驗板輸出信息...............................................................................................................5 4.具體實現過程.......................................................................................................................6 4.1 交叉編譯工具的安裝.......................................................................................................6 4.2 客戶端模塊的設計...........................................................................................................7 4.3 服務器模塊.......................................................................................................................8 4.4 LED點亮模塊..................................................................................................................10 4.5 溫度感應模塊.................................................................................................................11 5.測試結果分析.....................................................................................................................13 5.1 各模塊運行的效果.........................................................................................................13 5.2 可擴展功能......................................................................................................................15 6.總結與展望.......................................................................................................................15

第一章 引言

1.1 設計背景及意義

溫度作為工業、農業、國防和科研等部門最普遍的測量項目。它在工農業生產、現代科學研究以及高新技術開發過程中也是一個極其普遍而又非

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

以往這些工作大多是由人工完成,不但工作量大,記錄的數據少,對溫度的調節缺乏實時性,而且電路復雜,標定和校準也比較麻煩,難以滿足現代溫度測量的要求[1]。自從傳感器技術、微控制器技術和計算機技術日漸成熟之后,現代的溫度測量與控制系統克服了以往系統中存在的一些問題,比如對環境溫度的控制與調節以及數據的記錄都由微控制器或計算機自動完成,人們的工作量大大地降低,而且測得的數據也更加的精確,對環境溫度的調節更具有實時性[2]。

1.2 設計的主要內容

此次主要采用嵌入式Linux作為操作系統,針對以S5PV210為處理器的開發板設計的一個嵌入式溫度監測系統。在Linux設備驅動程序的基本工作原理基礎上,討論了開發中經常會碰到的中斷處理、擁塞處理、I/O端口,并在此基礎上實現了基于S5PV210嵌入式處理器的開、讀、寫、關外部RAM的字符設備驅動和網絡驅動。結合高精度溫度傳感器DS18B20,實現溫度的正確采集,并通過以太網絡將數據上傳給上位機客戶端。

溫度監測系統根據Linux中的網絡通信技術和串口通信技術來傳輸數據。用ubantu完成溫度監測系統的軟件設計與實現,為用戶提供一個友好的人機界面,對監測系統進行控制并顯示采集后的數據。本系統還通過多線程實現了多個客戶端與服務器的通信。

第二章 相關技術

2.1 嵌入式Linux Linux是UNIX系統的一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟件、應用程序和網絡協議。支持32位和64位硬件。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡操作系統。它誕生與1991年的10月5日。以后借助與Internet

網,并進過全世界各地計算機愛好者的共同努力下,現已成為世界上使用最多的一種UNIX類操作系統,并且使用人數還在迅猛增漲。

本次設計采用Linux作為嵌入式操作系統的原因有以下幾點:[3] 1)低成本開發系統: 2)可應用于多種硬件平臺 3)可定制的內核 4)性能優異 5)良好的網絡支持

2.2 S5PV210

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

S5PV210采用了ARM CortexTM-A8內核,ARM V7指令集,主頻可達1GHZ,64/32位內部總線結構,32/32KB的數據/指令一級緩存,512KB的二級緩存,可以實現2000DMIPS(每秒運算20億條指令集)的高性能運算能力。

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

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

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

2.3 socket網絡編程

Socket是進程通訊的一種方式,即調用這個網絡庫的一些API函數實現分布在不同主機的相關進程之間的數據交換。[4] 幾個定義:

(1)IP地址:即依照TCP/IP協議分配給本地主機的網絡地址,兩個進程要通訊,任一進程首先要知道通訊對方的位置,即對方的IP。

(2)端口號:用來辨別本地通訊進程,一個本地的進程在通訊時均會占用一個端口號,不同的進程端口號不同,因此在通訊前必須要分配一個沒有被訪問的端口號。

(3)連接:指兩個進程間的通訊鏈路。

(4)半相關:網絡中用一個三元組可以在全局唯一標志一個進程:(協議,本地地址,本地端口號)

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

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

第三章 具體實現功能

3.1總體框架圖

圖1 項目總體框架圖

3.2客戶端功能

1)顯示簡單的用戶界面 2)發送命令給服務器 3)接收服務器傳輸的數據 4)顯示溫度數據

3.3 服務器功能

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

3)把命令轉發給硬件 4)獲取硬件處理所得的數據 5)把該數據傳給客戶端

3.4 實驗板輸出信息

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

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

第四章 具體實現過程

個應用系統要完成各項功能,首先必須有較完善的硬件作保證。同時還必須得到相應設計合理的軟件的支持,尤其是微機應用高速發展的今天,許多由硬件完成的工作,都可通過軟件編程而代替。甚至有些必須采用很復雜的硬件電路才能完成的工作,用軟件編和有時會變得很簡單。因此充分利用其內部豐富的硬件資源和軟件資源。

程序設計語言有三種:機器語言、匯編語言、高級語言。本系統運用的是高級語言所編寫,也就是C語言。所用到的開發平臺為ubuntu系統。

4.1 交叉編譯工具的安裝

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

令,將

arm-linux-gcc

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

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

4.2 客戶端模塊的設計

用戶界面的顯示:

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點亮LED1: on1

on2e[0me[31m

*e[0mn”);printf(“e[31m*e[0m e[33m關閉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”);}

發送命令給服務器:

/*5.調用I/O函數(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);

/*從終端讀取數據*/

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

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

州學院

|

點亮LED2:

|

關閉LED2:

|

播放音樂:

|

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

|

的大

} if(ret > 0){

}

/*發送數據給服務器*/ write(sockfd,buf,ret);

接受服務器傳輸的數據:

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

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

/*接收服務器發送的信息*/

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

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

if(ret > 0){

temp[ret-1] = '

主站蜘蛛池模板: 日本在线看片免费人成视频1000| 超碰97人人让你爽| 香港三级韩国三级日本三级| 男女猛烈激情xx00免费视频| 精品无码久久久久久久久水蜜桃| 精品欧美小视频在线观看| 香蕉在线 亚洲 欧美 专区| 思思久久99热只有频精品66| 亚洲老妇色熟女老太| 国产精品69人妻无码久久| 又色又爽又高潮免费视频观看| 成人国产精品一区二区网站| 久久国产精品偷| 久久精品人人做人人爽| 中文字幕乱码无码人妻系列蜜桃| 国产精品国产三级国产a| 亚洲精品乱码久久久久久app| 亚洲精品久久久久久中文字幕| 国产精品偷伦视频免费还看旳| 精品av天堂毛片久久久| 国产免费又爽又色又粗视频| 亚洲成a人片在线观看天堂无码| 国产亚洲精aa在线看| 精品玖玖玖视频在线观看| 欧美性大战xxxxx久久久√| 亚洲一区av无码专区在线观看| 国产美女遭强高潮网站| 国产午夜成人无码免费看| 国产肥白大熟妇bbbb视频| 亚洲成_人网站图片| 一道本在线伊人蕉无码| 精品人妻无码一区二区三区换脸| 豆国产97在线 | 亚洲| 亚洲成色综合网站在线| 欧洲黑大粗无码免费| 男阳茎进女阳道视频大全| 久久婷婷五月综合成人d啪| 国产一卡二卡三新区2022| 久久中文字幕av一区二区不卡| 国产精口品美女乱子伦高潮| 天堂久久天堂av色综合|