手持式終端設(shè)備中電源監(jiān)測技術(shù)研究與實現(xiàn)
2 電源監(jiān)測系統(tǒng)驅(qū)動程序設(shè)計
鑒于文中所述的超級終端系在Linux環(huán)境下運行,各個檢測環(huán)節(jié)的驅(qū)動程序和相關(guān)的實施策略、編寫方法亦多有特點,現(xiàn)詳細(xì)描述如下。
2.1 Linux驅(qū)動程序工作原理
在Linux內(nèi)核中,設(shè)備驅(qū)動程序是作為文件系統(tǒng)的一個模塊存在的,它對下負(fù)責(zé)與硬件設(shè)備的交互,對上通過一個通用的接口掛接到文件系統(tǒng)上,從而和系統(tǒng)的內(nèi)核等聯(lián)系起來。它是軟件概念和硬件設(shè)備間的一個抽象層。系統(tǒng)調(diào)用是內(nèi)核和應(yīng)用程序之間的接口,而設(shè)備驅(qū)動程序則是內(nèi)核和外設(shè)之間的接口。
設(shè)備驅(qū)動程序為應(yīng)用程序屏蔽了外設(shè)硬件的細(xì)節(jié),從應(yīng)用程序角度來看,對于外設(shè)的操作方法與普通文件一樣。設(shè)備驅(qū)動程序與系統(tǒng)外設(shè)關(guān)系如圖2所示。
圖2 Linux驅(qū)動程序與系統(tǒng)外設(shè)關(guān)系圖
2.2 字符設(shè)備
字符設(shè)備是Linux系統(tǒng)中最簡單的設(shè)備,可以像文件一樣訪問。當(dāng)字符設(shè)備初始化的時候,其驅(qū)動程序向Linux核心登記,在chrdevs向量表中增加一個device_STruct數(shù)據(jù)結(jié)構(gòu)條目。這個設(shè)備的主設(shè)備標(biāo)識符用作這個向量表的索引。一個設(shè)備的主設(shè)備標(biāo)識符是固定的。chrdevs向量表中的device_struct數(shù)據(jù)結(jié)構(gòu)包括一個登記設(shè)備驅(qū)動程序名稱的指針和一個指向一組文件操作的指針。這組文件操作本身位于這個設(shè)備的字符設(shè)備驅(qū)動程序中,并處理一些特定任務(wù)。本電池監(jiān)測系統(tǒng)在Linux下的驅(qū)動程序就把外設(shè)視為字符設(shè)備,在驅(qū)動程序里實現(xiàn)了打開、讀、寫和關(guān)閉等操作。
2.3 電池監(jiān)測驅(qū)動實現(xiàn)策略
系統(tǒng)內(nèi)部,I/O設(shè)備的存取使通過一組固定的入口點來進行的。這組入口點由特定設(shè)備的設(shè)備驅(qū)動程序提供,在數(shù)據(jù)結(jié)構(gòu)file_operatiONs()中定義。該程序定義了一個數(shù)據(jù)結(jié)構(gòu)為file_operations()的變量adc_fops。
2.3.1 adc_open函數(shù)
此函數(shù)打開并初始化設(shè)備以待I/O操作。adc_open()子程序必須對其做好必要的準(zhǔn)備,如果設(shè)備是獨占的,adc_open()子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。
2.3.2 adc_read函數(shù)
對AD轉(zhuǎn)換器設(shè)備文件進行讀操作時調(diào)用adc_read()子程序。電池監(jiān)測系統(tǒng)要求實時讀取外設(shè)監(jiān)測點的電壓值。因此,在adc_read()函數(shù)中實時觸發(fā)AD轉(zhuǎn)換器開始工作,并且利用程序輪詢方式讀取轉(zhuǎn)換后的數(shù)據(jù)。adc_read()函數(shù)內(nèi)容如下:
評論