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

正文內(nèi)容

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

2024-11-12 15:00本頁(yè)面

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

  

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