freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于arm的嵌入式溫度監(jiān)測系統(tǒng)畢業(yè)設(shè)計論文-閱讀頁

2025-07-13 00:15本頁面
  

【正文】 區(qū)格式化Flash,此過程又需要花費幾分鐘時間。(3)重新下載vivi通過dnw下載vivi有兩種方法,本設(shè)計使用方法二。此時點擊USB PortTransmit,“打開”開始下載,下載過程一閃而過,因為使用USB接口下載的速度很快。 燒寫linux內(nèi)核通過dnw下載kernel有兩種方法,本設(shè)計使用的方法二。此時點擊USB PortTransmit,在彈出的打開界面中找到zImage_tp,下載時間比sbc_vivi稍長,約為2s。 下載文件系統(tǒng)輸入:loadyaffs –e root u,回車。此時點擊USB PortTransmit,在彈出的“打開”。下載完畢,linux文件系統(tǒng)將會被自動燒寫到Nand Flash中。再重啟系統(tǒng),就可以用了。嵌入式linux驅(qū)動程序的基本結(jié)構(gòu)和標(biāo)準(zhǔn)的linux的結(jié)構(gòu)基本一致,也支持模塊化模式,所以,大部分驅(qū)動程序編程模塊化形式,而且,要求可以在不同的體系結(jié)構(gòu)上安裝。但是這種模式是調(diào)試驅(qū)動程序的極佳方法。設(shè)備驅(qū)動程序為應(yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件,因而應(yīng)用程序可以像操作普通文件一樣對硬件設(shè)備進(jìn)行操作。驅(qū)動程序的使用可以按照兩種方式編譯:一種是靜態(tài)編譯進(jìn)內(nèi)核;另一種是編譯成內(nèi)核模塊義工動態(tài)加載?;谠O(shè)備驅(qū)動程序的功能和編譯特點,應(yīng)具有的特性如下:(1)由一系列函數(shù)和數(shù)據(jù)構(gòu)成,它既要與硬件設(shè)備進(jìn)行通信又要遵循操作系統(tǒng)內(nèi)核提供的統(tǒng)一接口;(2)它要管理好用戶程序與外設(shè)之間的數(shù)據(jù)流和控制流;(3)是一個自包含組件,能夠動態(tài)地加入到操作系統(tǒng)或被內(nèi)核刪除;(4)屬于內(nèi)核的可定制部分,通過設(shè)備文件賴于用戶程序打交道。硬件設(shè)備驅(qū)動就是通常意義的驅(qū)動,其驅(qū)動程序和物理硬件設(shè)備相連,如UART設(shè)備或IDE設(shè)備;而軟件設(shè)備驅(qū)動程序則作為低級結(jié)構(gòu)間的接口,或者硬件設(shè)備驅(qū)動程序和高級數(shù)據(jù)結(jié)構(gòu)間的接口,如文件系統(tǒng)EXT3的驅(qū)動。系統(tǒng)的串口、鍵盤、虛擬控制臺是字符設(shè)備,而RAMDISK、硬盤是塊設(shè)備,網(wǎng)絡(luò)設(shè)備則如網(wǎng)絡(luò)接口卡等。字符設(shè)備字符設(shè)備能夠存儲或者傳輸不定長數(shù)據(jù)。內(nèi)核把字符設(shè)備看成是可順序訪問的連續(xù)字節(jié)流,它在單個字符的基礎(chǔ)上接收和發(fā)送數(shù)據(jù),數(shù)據(jù)緩沖系統(tǒng)。字符設(shè)備的介質(zhì)一般是傳輸介質(zhì),在對字符設(shè)備發(fā)出讀/寫請求時,實際的硬件I/O一般就緊接著發(fā)生了。對塊設(shè)備的訪問通常需要經(jīng)過高速緩存做緩沖區(qū),若用戶進(jìn)程對設(shè)備的請求通過緩沖區(qū)能滿足用戶的要求,就從緩沖區(qū)返回請求的數(shù)據(jù),如果不能,才調(diào)用請求函數(shù)來進(jìn)行實際的I/O操作。一個文件系統(tǒng)要安裝進(jìn)入操作系統(tǒng)必須在塊設(shè)備上。但是它的塊又不是固定大小的,大到數(shù)百甚至數(shù)千字節(jié),小到幾個字節(jié)。內(nèi)核和網(wǎng)絡(luò)設(shè)備驅(qū)動程序之間的通信,與字符設(shè)備和塊設(shè)備驅(qū)動程序與內(nèi)核的通信數(shù)完全不一樣的,不是通過read()、write(),而是采用sk_buff數(shù)據(jù)緩沖區(qū),調(diào)用與數(shù)據(jù)包相關(guān)的函數(shù)。(2)設(shè)備節(jié)點、文件節(jié)點、設(shè)備文件Linux是一種類UNIX系統(tǒng),UNIX的一個基本特點是“一切皆為文件”。設(shè)備文件抽象了設(shè)備的處理,將所有的硬件設(shè)備都像普通文件一樣看待,也就是說硬件可以跟普通文件一樣來打開、關(guān)閉和讀/寫。Character型設(shè)備文件常指直接讀/寫、沒有緩沖區(qū)的字符設(shè)備,而Block設(shè)備文件常常指那些需要以塊(如512B)的方式寫入的設(shè)備,Socket(網(wǎng)絡(luò)插件)型設(shè)備文件指的是網(wǎng)絡(luò)設(shè)備訪問的BSD Socket接口。例如,硬盤就是用/dev/hd*來表示,/dev/had表示第一個IDE接口的主設(shè)備,/dev/hdal表示第一個硬盤上的第一個分區(qū);而/dev/hdc表示第二個IDE接口的主設(shè)備。而這個設(shè)備號是從/proc/devices文件中獲得的,所以一般是先有設(shè)備驅(qū)動程序(模塊)在內(nèi)核中。 (3)主設(shè)備號和輔設(shè)備號Linux中的每個設(shè)備在文件系統(tǒng)中都至少對應(yīng)一個設(shè)備文件,這個設(shè)備文件節(jié)點中記載著與特定設(shè)備建立連接所需的信息。這種信息由三部分構(gòu)成:第一部分包括設(shè)備的類型,第二部分是一個“主設(shè)備號”(Major),第三部分是一個“輔(或者從)設(shè)備號”(Minor)。主設(shè)備號的主要作用就是聲明設(shè)備所使用的驅(qū)動程序。輔設(shè)備號一般是區(qū)分驅(qū)動程序的不同屬性(如不同的使用方法、不同的位置、不同的操作),標(biāo)識驅(qū)動程序控制的設(shè)備實例。而對于塊設(shè)備(硬盤),如/dev/hdal(block3/1)、/dev/hda2(block3/2)和/dev/hda3(block3/3)都代表著同一塊硬盤的3個分區(qū),它們的主設(shè)備號都是3,輔設(shè)備號分別為3對于常用的設(shè)備,Linux有固定的編號。mknod harddiak b 3 0file /dev/had/dev/had: block special (3/0)用mknod 命令可以創(chuàng)建設(shè)備文件,創(chuàng)建時指定主設(shè)備號和輔設(shè)備號。用file 命令可以顯示設(shè)備文件的設(shè)備號。 驅(qū)動程序的編寫說明設(shè)備驅(qū)動程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。同時,設(shè)備驅(qū)動程序是內(nèi)核的一部分,它完成以下的功能:對設(shè)備初始化和釋放;把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和會送給應(yīng)用程序請求的數(shù)據(jù);檢測和處理設(shè)備出現(xiàn)的錯誤。字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對字符設(shè)備發(fā)出讀寫請求時,實際的硬件I/O一般就緊接著發(fā)生了;塊設(shè)備利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū),當(dāng)用戶進(jìn)程對設(shè)備請求滿足用戶要求時,就返回請求的數(shù)據(jù)。設(shè)備驅(qū)動程序的file_operations 結(jié)構(gòu):通常,一個設(shè)備驅(qū)動程序包括兩個基本的任務(wù):驅(qū)動設(shè)備的某些函數(shù)作為系統(tǒng)調(diào)用執(zhí)行;而某些函數(shù)則負(fù)責(zé)處理中斷(即中斷處理函數(shù))。用戶程序利用系統(tǒng)調(diào)用,比如在對一個設(shè)備文件進(jìn)行諸如read操作時,這是對應(yīng)于該設(shè)備文件的驅(qū)動程序就會執(zhí)行相關(guān)的ssize_t(*read)(struct ,file* char *,size_t,loff_t*)函數(shù)。file_operations 結(jié)構(gòu)在kernel/include/linux/。 loff_t (* llseek) (struct file* , loff_t,int)。 ssize_t (*write) (struct file *,const char *,size_t,loff_t *)。 unsigned int(*poll) (struct file *,struct poll_table_struct *)。 int (*mmap) (struct file*,struct vm_area_struct *)。 int(*flush) (struct file*)。 int (*fsync) (struct file*,struct dentry*,int datasync)。 int(*lock) (struct file*,int, struct file_lock)。ssize_t(*writev) (struct file*,const struct iovec*,unsigned long ,loff_t *)。unsigned long (*get_unmapped_area)(struct file*,unsigned long,unsigned long, unsigned long, unsigned long)。endif /* MAGIC_ROM_PTR*/}其中主要的函數(shù)說明如下:(1) open是驅(qū)動程序用來完成設(shè)備初始化操作的,open還會增加設(shè)備計數(shù),以防止文件在關(guān)閉之前模塊被卸載出內(nèi)核。(2) read是用來從外部設(shè)備中讀取數(shù)據(jù)。函數(shù)返回一個非負(fù)值表示成功讀取了多少字節(jié)。如果沒有這個函數(shù),write系統(tǒng)調(diào)用程序返回一個EINVAL。(4) release是設(shè)備關(guān)閉時調(diào)用這個操作。這個設(shè)備方法有時也稱為close函數(shù)。(5) llseek是 改變當(dāng)前的讀寫指針。(7) poll一般用于查詢設(shè)備是否可讀可寫或處于特殊的狀態(tài)。(9) mmap 將設(shè)備內(nèi)存映射到應(yīng)用程序的進(jìn)程地址空間[10]。首先,用戶在自己的驅(qū)動程序源文件定義file_operation結(jié)構(gòu),并編寫出設(shè)備需要的各操作函數(shù),對于設(shè)備不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊到內(nèi)核,當(dāng)應(yīng)用程序?qū)υO(shè)備相應(yīng)的設(shè)備文件進(jìn)行文件操作時,內(nèi)核會找到相應(yīng)的操作函數(shù),并進(jìn)行調(diào)用。定義并編寫完file_operation結(jié)構(gòu)函數(shù)后,要定義一個初始化函數(shù),比如函數(shù)名可device_init(),在linux初始化的時候要調(diào)用該函數(shù),因此,該函數(shù)包括以下幾項工作:(1)對該驅(qū)動程序所使用到的硬件寄存器進(jìn)行初始化,包括中斷寄存器。一般來說,每個設(shè)備要定義一個設(shè)備變量,用來保存設(shè)備相關(guān)的參數(shù)。linux內(nèi)核通過主設(shè)備號將設(shè)備驅(qū)動程序同設(shè)備文件相連。通過查看linux系統(tǒng)中/proc下的devices文件,該文件記錄已經(jīng)使用的主設(shè)備號和設(shè)備名,選擇一個沒有使用的主設(shè)備號,調(diào)用下面的函數(shù)來注冊設(shè)備。(4)注冊設(shè)備使用的中斷。int requesr_irq(unsigned irq,void(*handler)(int ,void *,struct pt_regs*),unsigned long flags,const char * device,void * dev_id)。硬件系統(tǒng)將IRQn映射成中斷向量。flags中斷處理中的一些選項的掩碼。dev_id在中斷共享時使用的id。當(dāng)設(shè)備的驅(qū)動程序使用了如下的函數(shù)方式,則設(shè)備驅(qū)動可以動態(tài)的加載和卸載。void _exit device_exit(void)。module_exit(device _exit)。 ADC驅(qū)動程序具體函數(shù)的分析在ADC驅(qū)動程序里,主要包括四個函數(shù),分別如下:open(),release(),read(),write()。用戶程序不能直接使用這些“方法”,而是通過“系統(tǒng)調(diào)用”間接調(diào)用“方法”實現(xiàn)對硬件的操作。(1)open 方法open方法由系統(tǒng)調(diào)用open()函數(shù)喚醒的其原型如下: int (*open)(struct inode *inode,struct file *filp)參數(shù)inode 中包含了需要初始化的設(shè)備信息,也就是驅(qū)動程序中對應(yīng)設(shè)備的那個數(shù)據(jù)結(jié)構(gòu)。(2)release方法與open方法的作用相反,release 方法會減少驅(qū)動程序使用計數(shù),并且釋放由open 分配的、存放于fileprivate_data 中的數(shù)據(jù)??赡苡泻芏喾N原因造成這種情況。內(nèi)核自動維護(hù)一個計數(shù)器以標(biāo)識設(shè)備驅(qū)動的使用情況。第二種情況是某些硬件從系統(tǒng)啟動就一直維持開啟狀態(tài),直到系統(tǒng)斷電才關(guān)閉。驅(qū)動程序中對這些設(shè)備的核心數(shù)據(jù)結(jié)構(gòu)中會維護(hù)一個狀態(tài)變量,通常有兩個狀態(tài):開啟或待機(jī)。(3)read 方法 read 方法由同名系統(tǒng)調(diào)用read()喚醒,其原型如下:ssize_t (*read)(struct file *filp,char _user *buf, size_t count, loff_t *f_pos)在參數(shù)列表中,char_user *buf 指用來存放讀到的數(shù)據(jù)的用戶空間地址;size_t count表示需要讀取的字節(jié)數(shù),size_t 實際上就是32位無符號整型變量;loff_t *f_pos指向數(shù)據(jù)存放地址,loff_t是64位有符號類型,相當(dāng)于long long。read 方法實現(xiàn)的是從內(nèi)核地址空間向用戶空間中的數(shù)據(jù)傳輸,為了實現(xiàn)這個目的,還需要在read方法中調(diào)用兩個子方法:copy_to_user()、access_ok(),它們在asm/中定義,原型如下:unsigned long copy_to_user(void_user *to,const void *from,unsigned long count)。在復(fù)制數(shù)據(jù)之前,copy_to_user還會調(diào)用access_ok方法,以檢查目標(biāo)地址空間是否有效,其原型如下:int access_ok(int type,const void *addr,unsigned int size)參數(shù)type 的值是VERIFY_READ或VERIFY_WRITE,取決于是讀操作還是寫操作,如果既要讀也要寫,則應(yīng)該使用VERIFY_WRITE。和其他liunx函數(shù)不同,這個函數(shù)雜檢驗成功后返回1。但是傳送數(shù)據(jù)較少時,linux提供了開銷較小的方法:put_user()、get_user(),這是兩個在內(nèi)核中定義的宏,用來傳遞8個字節(jié)的數(shù)據(jù)時開銷較小,速度很快。他們的原型如下:put_user(data,ptr)。這兩個宏分別將數(shù)據(jù)復(fù)制到地址ptr處,不同的是put_user()和get_user()中的ptr分別代表用戶空間、內(nèi)核空間中的地址。write方法的原型如下:ssize_t (*write) (struct file *filp,const char_user *buff,size_t count,loff_t *offp)write方法同樣也是依靠一些子方法實現(xiàn)的:copy_from_user、access_ok。 ADC驅(qū)動程序的加載和刪除加載驅(qū)動程序有兩種方法:一種是直接加載到內(nèi)核中;另一種是編譯成驅(qū)動模塊,動態(tài)的加載和卸載。驅(qū)動程序加載到linux內(nèi)核里設(shè)備驅(qū)動程序?qū)懲旰?,就可以加到linux的內(nèi)核中了,這需要修改linux的源碼,然后重新編譯linux內(nèi)核。該驅(qū)動程序中,使用int _init device_init(void)方式編寫。在kernel/driver/。當(dāng)選中它時,編譯通過,則驅(qū)動程序就加到內(nèi)核中去了。掛在操作系統(tǒng)中的設(shè)備都使用了設(shè)備驅(qū)動程序,要使一個設(shè)備成為應(yīng)用程序可以訪問的設(shè)備,必須在文件系統(tǒng)中有一個代表此設(shè)備的設(shè)備文件,通過使用設(shè)備文件,就可以對外部設(shè)備進(jìn)行具體的操作。這個系統(tǒng)是一個只讀壓縮文件系統(tǒng),要在制作cramfs文件系統(tǒng)之前,在root_tech目錄結(jié)構(gòu)中的/usr/etc/,添加相應(yīng)的設(shè)備
點擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1