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

正文內(nèi)容

基于三星嵌入式平臺的傳感器驅(qū)動開發(fā)及測試本科畢業(yè)論文-資料下載頁

2024-11-12 15:00本頁面

【導(dǎo)讀】與PC平臺不同,嵌入式便攜設(shè)備通常采用以Linux內(nèi)核為基礎(chǔ)的Android. 等更加適合其處理器架構(gòu)的操作系統(tǒng)。傳感器設(shè)備是便攜設(shè)備中提高用戶體驗的重要組成部分。度傳感器、磁傳感器、陀螺儀傳感器組成的九軸傳感器。核層通過I2C協(xié)議與處理器通信,向上層提供數(shù)據(jù)完成數(shù)據(jù)融合。開發(fā)成立的項目。該項目將在Samsung的平板電腦平臺上首次加入九軸傳感器。證,最終給出測試結(jié)果。

  

【正文】 傳命令: git push 本章小結(jié) 本章重點介紹了 TC4 項目 及其 開發(fā)環(huán)境,和本課題涉及的 BSP 部分內(nèi)容??偟膩碚f, Linux 強大的多用戶的開發(fā)環(huán)境非常適合大型工程的開發(fā),而驅(qū)動程序是 BSP 的重要組成部分。作為開發(fā)者 ,需要深入理解開發(fā)的原理并且熟練使用開發(fā)工具。 17 第三章 Linux 字符型設(shè)備驅(qū)動方法 字符設(shè)備器驅(qū)動程序基本概念 Linux 的眾多優(yōu)良特性之一就是可以在運行時擴展由內(nèi)核提供的特性的能力。這意味著你可以在系統(tǒng)正在運行著的時候增加內(nèi)核的功能(也可以去除)。 每塊可以在運行時添加到內(nèi)核的代碼,被稱為一個模塊。 Linux 內(nèi)核提供了對許多模塊類型的支持,包括但不限于,設(shè)備驅(qū)動。每個模塊由目標(biāo)代碼組成(沒有連接成一個完整可執(zhí)行文件),可以動態(tài)連接到運行中的內(nèi)核中,通過 insmod 程序,以及通過 rmmod 程序去連接。 在 Linux 內(nèi)核當(dāng)中,每個設(shè)備驅(qū)動都對應(yīng)著一定類型的硬件設(shè)備,并且被賦予一個主設(shè)備號。設(shè)備驅(qū)動的列表和它們的主設(shè)備號可以在 (/proc/devices 中找到。每個設(shè)備驅(qū)動管理下的物理設(shè)備也被賦予一個從設(shè)備號。無論這些設(shè)備是否真的安裝,在 /dev 目錄中都將有一個文件,稱作設(shè)備文件,對應(yīng)著每一個具體設(shè)備。 [6] 對設(shè)備的分類方法有很多中,按照 LINUX 操作系統(tǒng)的分類標(biāo)準(zhǔn),可以將設(shè)備分成字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)接口設(shè)備三種。不同的設(shè)備對應(yīng)不同的設(shè)備驅(qū)動。 ( 1)字符設(shè)備 一個字符設(shè)備是一種可以當(dāng)作一個字節(jié)流來存取的設(shè)備。例如鍵盤、打印機、串口等等。在 LINUX 等嵌入式操作系統(tǒng)中,字符設(shè)備以特定的文件方式在文件目錄樹中占據(jù)位置并且擁有相應(yīng)的結(jié)點。結(jié)點中的文件類型指明該文件是字符設(shè)備,可以使用與普通文件相同的文件操作命令對字符設(shè)備文件進行操作,例如打開、關(guān)閉、讀寫、控制等。驅(qū)動程序的編寫可以通過編寫相應(yīng)的函數(shù)來完成,以對上層提供訪問接口。 ( 2)塊設(shè)備 塊設(shè)備則是按照一定數(shù)量字節(jié)數(shù)讀取數(shù)據(jù)的設(shè)備。例如磁盤、光盤、 SD 卡等存儲設(shè)備。塊設(shè)備將信息存儲在固定大小的塊中,每 個塊都有自己的地址。數(shù)據(jù)塊的大小通常在 512 字節(jié)到 32768 字節(jié)之間。塊設(shè)備的基本特征是每個塊都能獨立于其他的塊而讀寫。在 LINUX 中,允許應(yīng)用程序讀寫一個塊設(shè)備象一個字 18 符設(shè)備一樣 它允許一次傳送任意數(shù)目的字節(jié) . 結(jié)果就是 , 塊和字符設(shè)備的區(qū)別僅僅在內(nèi)核在內(nèi)部管理數(shù)據(jù)的方式上 , 并且因此在內(nèi)核 /驅(qū)動的軟件接口上不同 . 如同一個字符設(shè)備 , 每個塊設(shè)備都通過一個文件系統(tǒng)結(jié)點被存取的 , 它們之間的區(qū)別對用戶是透明的 . 塊驅(qū)動和字符驅(qū)動相比 , 與內(nèi)核的接口完全不同。 ( 3)網(wǎng)絡(luò)接口設(shè)備 任何網(wǎng)絡(luò)事務(wù)都 通過一個接口來進行 , 就是說 , 一個能夠與其他主機交換數(shù)據(jù)的設(shè)備。 通常 , 一個接口是一個硬件設(shè)備 , 但是它也可能是一個純粹的軟件設(shè)備 , 比如環(huán)回接口。一個網(wǎng)絡(luò)接口負責(zé)發(fā)送和接收數(shù)據(jù)報文 , 在內(nèi)核網(wǎng)絡(luò)子系統(tǒng)的驅(qū)動下 , 不必知道單個事務(wù)是如何映射到實際的被發(fā)送的報文上的 。 很多網(wǎng)絡(luò)連接( 特別那些使用 TCP 的 ) 是面向流的 , 但是網(wǎng)絡(luò)設(shè)備卻常常設(shè)計成處理報文的發(fā)送和接收。 每個設(shè)備文件都有其文件屬性 (c/b),表示是字符設(shè)備還是塊設(shè)備。我們可以用 mknod 命令創(chuàng)建設(shè)備節(jié)點,也可以在驅(qū)動程序中用 內(nèi)核的函數(shù)創(chuàng)建。對于本文所研究的九軸傳感器,屬于字符型設(shè)備,因此本文將重點討論字符型設(shè)備的設(shè)備驅(qū)動。 對于 Linux 來說,分層的思想貫穿在整個系統(tǒng)當(dāng)中,硬件層與軟件層獨立、用戶空間與內(nèi)核空間獨立使得 Linux 系統(tǒng)集成了 Unix 高內(nèi)聚、低耦合的特點,使得系統(tǒng)每層之間的分工更加明確,從而令操作系統(tǒng)的結(jié)構(gòu)更加清晰、性能更加穩(wěn)定。 (如圖 所示) 圖 Linux 的空間模型 19 字符設(shè)備的數(shù)據(jù)結(jié)構(gòu) Linux 操作系統(tǒng)保持了 Unix“一切都是文件 ”的思想,將設(shè)備節(jié)點作為文件來對待和 操作。對于字符型設(shè)備來說,最重要的是三個結(jié)構(gòu)體: file_operations、 file和 inode。 file_operations 結(jié)構(gòu)體 Linux 使用 file_operations 結(jié)構(gòu)訪問驅(qū)動程序的函數(shù),這個結(jié)構(gòu)的每一個成員的名字都對應(yīng)著一個調(diào)用。用戶進程利用在對設(shè)備文件進行諸如 read/write 操作的時候,系統(tǒng)調(diào)用通過設(shè)備文件的主設(shè)備號找到相應(yīng)的設(shè)備驅(qū)動程序,然后讀取這個和數(shù)據(jù)結(jié)構(gòu)相應(yīng)的函數(shù)指針,接著把控制權(quán)交給該函數(shù),這是 Linux 的設(shè)備驅(qū)動程序工作的基本原理。 file_operations 的主要結(jié)構(gòu)成員有: struct module *owner。該成員不是一個操作,它是一個指向擁有這個結(jié)構(gòu)的模塊的指針。這個成員用來阻止模塊在使用時被卸載。它通常被簡單初始化為THIS—MODULE。 int (*open) (struct inode *, struct file *)。 這常常是對設(shè)備文件進行的第一個操作,不要求驅(qū)動實現(xiàn)一個對應(yīng)的方法。如果這項被賦值為 NULL,設(shè)備打開一直成功,但是驅(qū)動程序不會得到通知。與 open()函數(shù)對應(yīng)的是 release()函數(shù)。 int (*release) (struct inode *, struct file *)。 當(dāng)最后一個打開設(shè)備的用戶進程執(zhí)行 close()系統(tǒng)調(diào)用的時候,內(nèi)核將調(diào)用驅(qū)動程序 release()函數(shù)。 release 函數(shù)的主要任務(wù)是清理未結(jié)束的輸入輸出操作,釋放資源,用戶自定義的按排他標(biāo)志復(fù)位等。 loff_t (*llseek) (struct file *, loff_t, int)。指針參數(shù) flip 為進行讀取信息的目標(biāo)文件結(jié)構(gòu)體指針,第二個整型參數(shù)為文件定位的目標(biāo)偏移量,參數(shù) offset 為對文件定位的起始地址,這個值可以為文件開頭、當(dāng)前位置和文件末尾。 llseek 方法用作改變文件中的當(dāng)前讀/寫位置,并且新位置作為返回值。 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *)。指針參數(shù) flip 指向讀取信息的目標(biāo)文件,指針參數(shù) buffer 為對應(yīng)放置信息的緩沖區(qū) (即用戶空間內(nèi)存地址 ),參數(shù) size 為要讀取的信息長度,參數(shù) offset 為讀的位置相對于文件開頭 20 的偏移,這個函數(shù)被用來從設(shè)備中獲取數(shù)據(jù)。 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)。;參數(shù) filp 為目標(biāo)文件結(jié)構(gòu)體指針, buffer 為要寫入文件的信息緩沖區(qū), count 為要寫入信息的長度, offset 為當(dāng)前的偏移位置,這個值通常是用來判斷寫文件是否越界。此函數(shù)用來發(fā)送數(shù)據(jù)給設(shè)備。 int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long)。 inode 和 filp指針是對 應(yīng)應(yīng)用程序傳遞的文件描述符 fd 的值, cmd 參數(shù)由用戶空間傳入,并且可選的參數(shù) arg 參數(shù)以一個 unsigned long 形式傳遞,不管它是否由用戶給定為一個整數(shù)或幾個指針。如果調(diào)用程序不傳遞第 3 個參數(shù),模塊驅(qū)動收到的 arg 值沒有被定義。因此類型檢查在這個額外參數(shù)上被關(guān)閉,編譯器不能警告一個無效的參數(shù)被傳遞給 ioctl,錯誤將無法查找。 int (*mmap) (struct file *, struct vm_area_struct *)。 mmap 用來請求將設(shè)備內(nèi)存映射到進程的地址空間。如果這個方法 是 NULL, mmap 系統(tǒng)調(diào)用返回 ENODEV。 file 結(jié)構(gòu)體 文件結(jié)構(gòu)代表一個打開的文件描述符,它不是專門給驅(qū)動程序使用的,系統(tǒng)中每一個打開的文件在內(nèi)核中都有一個關(guān)聯(lián)的 struct file。它由內(nèi)核在 open 時創(chuàng)建,并傳遞給在文件上操作的任何函數(shù),知道最后關(guān)閉。當(dāng)文件的所有實例都關(guān)閉之后,內(nèi)核釋放這個數(shù)據(jù)結(jié)構(gòu)。內(nèi)核源碼中通常用 flip 表示指向 file 結(jié)構(gòu)體的指針,用以和 file 本身的名字相區(qū)別。這樣, file 是結(jié)構(gòu)體本身, flip 是指向該結(jié)構(gòu)的指針。在 flip 結(jié)構(gòu)體中,重要的成員有 對應(yīng)的目錄結(jié)構(gòu) 、文件的引用計數(shù) f_count、文件標(biāo)志 f_flags、讀寫模式 f_mode 改文件在當(dāng)前進程中的文件偏移量 f_pos、 I/O 時間通知數(shù)據(jù) f_owner、文件所有者編號 f_gid/f_uid 等等。 inode 結(jié)構(gòu)體 內(nèi)核中用 inode 結(jié)構(gòu)表示具體的文件,也就是對應(yīng)與硬盤上面具體的文件。提供了設(shè)備文件的信息。 inode 譯成中文就是索引節(jié)點。 inode 結(jié)構(gòu)表示一個文件,而 file 結(jié)構(gòu)表示一個打開的文件。這是二者間最重要的關(guān)系。對于單個文件,允許有多個表示 打開的文件描述符的 file 結(jié)構(gòu),但它們都指向同一個 inode 結(jié)構(gòu)。 21 它包含文件訪問權(quán)限、屬主、組、大小、生成時間、訪問時間、最后修改時間等文件信息。它是 linux 管理文件系統(tǒng)的最基本單位,也是文件系統(tǒng)連接任何子目錄、文件的橋梁。 inode 結(jié)構(gòu)中的靜態(tài)信息取自物理設(shè)備上的文件系統(tǒng),由文件系統(tǒng)指定的函數(shù)填寫,它只存在于內(nèi)存當(dāng)中,可以通過 inode 緩存訪問。雖然每個文件都有相應(yīng)的 inode 結(jié)點,但是只有在需要的時候系統(tǒng)才會在內(nèi)存中為其建立相應(yīng)的 inode數(shù)據(jù)結(jié)構(gòu)。 每個進程為每個打開的文件分配一個 文件描述符,每個文件描述符對應(yīng)一個file 結(jié)構(gòu),同一個文件被不同的進程打開后,在不同的進程中會有不同的 file 文件結(jié)構(gòu),其中包括了文件的操作方式 (只讀\只寫\讀寫 ),偏移量,以及指向 inode的指針等等。這樣,不同的 file 結(jié)構(gòu)指向了同一個 inode 節(jié)點。 常見的成員有表示哈希表、索引節(jié)點鏈表、目錄項鏈表、節(jié)點號、引用計數(shù)、硬鏈接數(shù)、使用者 id 等等。其中,當(dāng) inode 指向一個字符設(shè)備文件時, i_cdev 成員是指向表示字符型設(shè)備 cdev 的指針。 cdev 中定義了內(nèi)嵌 kobject 對象 kobj、所屬模塊 owner、文件操作符 op、和設(shè)備號 dev。對于字符設(shè)備驅(qū)動來說是一個重要的結(jié)構(gòu)體。其原型如下: struct cdev{ struct kobject kobj; //內(nèi)嵌 kboject 模塊 struct module *owner; //所屬模塊 conststruct file_operations*ops; //文件操作結(jié)構(gòu)體 struct list__head list; //鏈表 dev_t dev; //設(shè)備號 unsigned int count; //被引用次數(shù) ); 總結(jié)一下, struct operations 存在于設(shè)備驅(qū)動程序內(nèi)部,起著聯(lián)系應(yīng)用程序和設(shè)備驅(qū)動的作用。 struct inode 存在于磁盤上,作為描述設(shè)備驅(qū)動文件的信息的作用。 struct file 是在執(zhí)行 open 函數(shù)時產(chǎn)生的,每打開一個文件就產(chǎn)生一個 struct file,供設(shè)備驅(qū)動關(guān)聯(lián)的函數(shù)使用 。 [7] 22 字符設(shè)備的高級操作 ioctl 操作 Ioctl 向外界提供了除了讀寫之外的控制操作方法。如果調(diào)用成功, ioctl 返回給進程一個非負的值。內(nèi)核本身能識別部分指令,如果要添加新的指令,則要在函數(shù)中自己定 義。 Ioctl 函數(shù)的原型如下: int (*ioctl) (struct inode * node, struct file *filp, unsigned int cmd, unsigned long arg)。 其中, inode 和 file 類型的指針指向了可能用來修改或者訪問的文件。在要更改文件屬性的時候,需要通過這兩個指針來找到所需的設(shè)備文件。 cmd 命令是重要的參數(shù),表明了要對 ioctl 操作的命令嗎。 Linux 系統(tǒng)建議按照 8位設(shè)備類型、 8 位序列號、 2 位方向、 13/14 位數(shù)據(jù)尺寸的方式 設(shè)備類型字段是一個 “幻數(shù) ”,可以是 00xff 之間的任何一個數(shù)。系統(tǒng)的內(nèi)核已經(jīng)自己定義了一些幻數(shù),因此在自定義設(shè)備的幻術(shù)選取上要避免沖突。 Ioctl 函數(shù)的主題是一個 switch+case 的分支結(jié)構(gòu)。通過傳遞 cmd 命令,可以在 ioctl的 switch 語句中找到執(zhí)行的代碼。 如果函數(shù)返回正常值,則表示函數(shù)調(diào)用正確;如果傳入的非法命令, ioctl返回錯誤號 EINVAL。 poll 操作 在應(yīng)用程序中,我們會使用到 select 函數(shù)來實現(xiàn)多路監(jiān)控的作用。具體的說,就是將多個待檢測的文件放 入到一個列表中,可以檢測這些文件可讀、可寫或者其他的狀態(tài)。一旦這些文件的狀態(tài)變成設(shè)定的狀態(tài)。應(yīng)用程序就會返回滿足要求的文件數(shù)量,繼而可以調(diào)用回調(diào)函數(shù)來喚醒正在等待或者睡眠的進程。 在內(nèi)核空間,相同功能的操作用 poll 函數(shù)來完成。 Poll
點擊復(fù)制文檔內(nèi)容
法律信息相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1