亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Linux的光柵檢測(cè)系統(tǒng)的軟件設(shè)計(jì)與實(shí)現(xiàn)

        2014-04-29 10:00:45張立立張鵬飛沙毅方晶晶
        電子世界 2014年21期

        張立立 張鵬飛 沙毅 方晶晶

        【摘要】本文設(shè)計(jì)的光柵檢測(cè)系統(tǒng)主要應(yīng)用在高精度噴繪機(jī)的運(yùn)動(dòng)控制單元。本文以Linux操作系統(tǒng)為開(kāi)發(fā)平臺(tái),分別從自動(dòng)配置和初始化子程序、服務(wù)于I/O請(qǐng)求的子程序、中斷程序三個(gè)部分詳細(xì)說(shuō)明了光柵檢測(cè)系統(tǒng)的軟件設(shè)計(jì)流程。本系統(tǒng)通過(guò)實(shí)際運(yùn)行與測(cè)試,達(dá)到設(shè)計(jì)要求。

        【關(guān)鍵詞】光柵檢測(cè);高精度噴繪機(jī);Linux操作系統(tǒng);軟件程序

        近幾年來(lái),大幅面噴繪市場(chǎng)發(fā)生了巨大變化,大幅面產(chǎn)品的應(yīng)用越來(lái)越廣泛,已逐步滲透到包括廣告、裝飾、攝影等許多行業(yè)。隨著大幅面打印技術(shù)的不斷成熟,噴繪機(jī)[1]在全球范圍得到迅速普及,特別是在我國(guó)的廣告制作領(lǐng)域更是得到革命性的應(yīng)用。

        噴繪機(jī)的性能指標(biāo)[2]主要包括:打印速度和打印精度。噴繪機(jī)的打印速度是以單位時(shí)間的出畫(huà)面積來(lái)衡量,打印精度(分辨率)用DPI(點(diǎn)每英寸)來(lái)衡量,單位長(zhǎng)度內(nèi)的點(diǎn)數(shù)越多,DPI越大,畫(huà)面就越清晰。為了提高打印精度,減少2個(gè)點(diǎn)之間距離,必須提高噴頭的點(diǎn)火頻率。為了提高噴繪機(jī)的打印速度必須提高噴頭的移動(dòng)速度。隨著噴繪機(jī)制造行業(yè)的迅猛發(fā)展,原有產(chǎn)品不論在打印精度上還是在打印速度上已經(jīng)不具有市場(chǎng)領(lǐng)先優(yōu)勢(shì),甚至有一些方面已經(jīng)處于劣勢(shì)。這樣必須及時(shí)推出高打印精度,高打印速度的噴繪設(shè)備,才能使公司在市場(chǎng)競(jìng)爭(zhēng)中立于不敗之地。本文設(shè)計(jì)的光柵系統(tǒng)主要用于小車(chē)打畫(huà)過(guò)程中的精確定位,使畫(huà)面的點(diǎn)均勻分布。光柵尺的精度為180DPI,通過(guò)正交解碼最高可達(dá)到720DPI。

        1.Linux設(shè)備驅(qū)動(dòng)編程

        Linux的核心設(shè)備驅(qū)動(dòng)是一組運(yùn)行在特權(quán)等級(jí)上的內(nèi)存駐留底層硬件處理共享庫(kù),正是它們負(fù)責(zé)管理各個(gè)設(shè)備[3]。在Linux操作系統(tǒng)[4]中,需要內(nèi)核建立應(yīng)用程序和設(shè)備之間的抽象接口,而不是由應(yīng)用程序直接操作硬件。為此,操作系統(tǒng)一般提供設(shè)備驅(qū)動(dòng)程序,專(zhuān)門(mén)完成對(duì)特定硬件的控制。設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理或操作硬件控制器的軟件,從本質(zhì)上講,它們是內(nèi)核中具有高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層處理硬件例程[5]。

        在Linux系統(tǒng)中,一個(gè)基本的特點(diǎn)是它抽象了設(shè)備處理,所有硬件設(shè)備的操作和通常的文件一樣,利用標(biāo)準(zhǔn)的系統(tǒng)調(diào)用可在設(shè)備上進(jìn)行打開(kāi)、關(guān)閉、讀取或?qū)懭氩僮鳌O到y(tǒng)中的每個(gè)設(shè)備由設(shè)備特殊文件代表,每個(gè)由相同設(shè)備驅(qū)動(dòng)程序控制的設(shè)備具有相同的主設(shè)備號(hào),而從設(shè)備號(hào)則用來(lái)區(qū)分同類(lèi)設(shè)備中不同的設(shè)備。設(shè)備特殊文件的VFS索引節(jié)點(diǎn)中包含設(shè)備號(hào)的信息。如果通過(guò)系統(tǒng)調(diào)用來(lái)訪問(wèn)設(shè)備,則內(nèi)核通過(guò)該VFS節(jié)點(diǎn)中的設(shè)備號(hào)信息調(diào)用適當(dāng)?shù)脑O(shè)備驅(qū)動(dòng)程序。

        Linux支持字符、塊及網(wǎng)絡(luò)設(shè)備三種硬件設(shè)備[6]。字符設(shè)備指那些無(wú)需緩沖直接讀寫(xiě)的設(shè)備,像系統(tǒng)中的串口設(shè)備。塊設(shè)備則僅能以塊為單位進(jìn)行讀寫(xiě)。Linux核心中存在許多不同的設(shè)備驅(qū)動(dòng),這些驅(qū)動(dòng)具有以下的共同特點(diǎn)[7]:

        (1)核心代碼:設(shè)備驅(qū)動(dòng)是核心的一部分,如同核心中其他代碼一樣,出錯(cuò)將導(dǎo)致系統(tǒng)的嚴(yán)重?fù)p害,甚至使系統(tǒng)崩潰,導(dǎo)致文件系統(tǒng)的破壞和數(shù)據(jù)丟失。

        (2)核心接口:設(shè)備驅(qū)動(dòng)必須為L(zhǎng)inux核心或者其從屬子系統(tǒng)提供一個(gè)標(biāo)準(zhǔn)接口。

        (3)核心機(jī)制與服務(wù):設(shè)備驅(qū)動(dòng)可以使用標(biāo)準(zhǔn)的核心服務(wù),如中斷發(fā)送和等待隊(duì)列等。

        (4)動(dòng)態(tài)可加載:多數(shù)Linux設(shè)備驅(qū)動(dòng)可以在核心模塊發(fā)出加載請(qǐng)求時(shí)加載,在不再使用時(shí)卸載,這樣核心能有效的利用系統(tǒng)資源。

        (5)可配置:Linux設(shè)備驅(qū)動(dòng)可以連接到核心中,可以配置決定那些設(shè)備驅(qū)動(dòng)被連入核心。

        (6)動(dòng)態(tài)性:當(dāng)系統(tǒng)啟動(dòng)和設(shè)備驅(qū)動(dòng)初始化時(shí),將查找它所控制的硬件設(shè)備,如果某個(gè)設(shè)備的驅(qū)動(dòng)為一個(gè)空閑的過(guò)程并不會(huì)有什么問(wèn)題。此時(shí),設(shè)備驅(qū)動(dòng)僅僅是一個(gè)冗余的程序,它除了占用少量系統(tǒng)內(nèi)存外,不會(huì)對(duì)系統(tǒng)造成什么危害。

        2.光柵檢測(cè)系統(tǒng)的軟件設(shè)計(jì)

        Linux核心與設(shè)備驅(qū)動(dòng)之間有一個(gè)標(biāo)準(zhǔn)方式進(jìn)行互操作的接口。每一類(lèi)設(shè)備驅(qū)動(dòng)都提供通用的接口,這種通用接口使得核心可以用相同的方式來(lái)對(duì)待不同的設(shè)備及設(shè)備驅(qū)動(dòng)。嵌入式Jupiter系統(tǒng)[8]通過(guò)外部中斷5對(duì)光柵檢測(cè)系統(tǒng)產(chǎn)生的信號(hào)進(jìn)行響應(yīng),當(dāng)中斷信號(hào)產(chǎn)生時(shí),相應(yīng)的中斷服務(wù)程序,即驅(qū)動(dòng)程序執(zhí)行設(shè)定的任務(wù)。外中斷五中斷服務(wù)程序流程圖如圖1所示。

        圖1 外中斷五中斷服務(wù)程序流程圖

        對(duì)用戶程序來(lái)說(shuō),Linux系統(tǒng)的設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供一致的接口,一般來(lái)說(shuō)是把設(shè)備映射為一個(gè)特殊的設(shè)備文件,用戶程序可以像對(duì)其它文件一樣對(duì)此設(shè)備文件進(jìn)行操作。Linux對(duì)硬件設(shè)備支持兩個(gè)標(biāo)準(zhǔn)接口:塊設(shè)備文件和字符設(shè)備文件,分別稱(chēng)為塊設(shè)備接口和字符文件接口。每一個(gè)設(shè)備驅(qū)動(dòng)程序由如下三個(gè)部分組成:

        2.1 自動(dòng)配置和初始化子程序init

        負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作,同時(shí)自動(dòng)配置和初始化。這一部分程序會(huì)在系統(tǒng)啟動(dòng)的過(guò)程中自動(dòng)執(zhí)行。在內(nèi)核啟動(dòng)的最后階段運(yùn)行這一部分程序,首先通過(guò)系統(tǒng)調(diào)用register_chrdev向系統(tǒng)申請(qǐng)一個(gè)主設(shè)備號(hào),如果這個(gè)主設(shè)備號(hào)已經(jīng)被別的設(shè)備占用,將會(huì)返回一個(gè)錯(cuò)誤的信息;然后通過(guò)系統(tǒng)調(diào)用request_irq請(qǐng)求使用這個(gè)設(shè)備,如果這個(gè)設(shè)備沒(méi)有注冊(cè)成功,或者使用的條件不足,也會(huì)返回一個(gè)錯(cuò)誤信息。如果這兩步都沒(méi)有問(wèn)題的話,驅(qū)動(dòng)程序就加載到了內(nèi)核,在用戶程序空間就可以使用這個(gè)設(shè)備。

        2.2 服務(wù)于I/O請(qǐng)求的子程序

        服務(wù)于I/O請(qǐng)求的子程序,又稱(chēng)為驅(qū)動(dòng)程序的上半部分。調(diào)用這部分是由于系統(tǒng)調(diào)用的結(jié)果。這部分程序在執(zhí)行的時(shí)候,系統(tǒng)仍認(rèn)為是和進(jìn)行調(diào)用的進(jìn)程屬于同一個(gè)進(jìn)程,只是由用戶態(tài)變成了核心態(tài),但是具有進(jìn)行此系統(tǒng)調(diào)用的用戶程序的運(yùn)行環(huán)境。因此,可以在子程序中調(diào)用于進(jìn)程相關(guān)的系統(tǒng)庫(kù)函數(shù)。

        這一部分程序?qū)嶋H的作用就是用戶程序空間和內(nèi)核空間進(jìn)行通信,由用戶程序空間向內(nèi)核空間傳達(dá)各種參數(shù),或者從內(nèi)核空間獲取設(shè)備的各種信息。

        在系統(tǒng)內(nèi)部,I/O設(shè)備的存取操作通過(guò)一組固定的入口點(diǎn)進(jìn)行,這組入口點(diǎn)是由每個(gè)設(shè)備的驅(qū)動(dòng)程序提供的。嵌入式操作系統(tǒng)中的字符型設(shè)備提供一下入口點(diǎn):

        open(struct inode *inode, struct file *file):

        打開(kāi)設(shè)備準(zhǔn)備I/O操作,系統(tǒng)通過(guò)設(shè)備名稱(chēng),函數(shù)的第一個(gè)參數(shù)來(lái)區(qū)分每個(gè)驅(qū)動(dòng)程序的入口點(diǎn)操作函數(shù);第二個(gè)參數(shù)說(shuō)明這個(gè)函數(shù)的文件結(jié)構(gòu)體,主要說(shuō)明設(shè)備的使用類(lèi)型。對(duì)字符特別設(shè)備文件進(jìn)行打開(kāi)操作,都會(huì)調(diào)用設(shè)備的open入口點(diǎn)函數(shù)。Open子程序必須對(duì)將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作。如果設(shè)備是獨(dú)占的,那么同一時(shí)間只能有一個(gè)程序訪問(wèn)此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志,以表示設(shè)備處于忙狀態(tài)。

        在嵌入式操作系統(tǒng)中,定時(shí)器一、定時(shí)器二和外中斷五主要用open函數(shù)設(shè)置驅(qū)動(dòng)程序的打開(kāi)狀態(tài),防止設(shè)備在打開(kāi)之前就已經(jīng)開(kāi)始使用的情況,同時(shí)還將設(shè)備驅(qū)動(dòng)程序的一些計(jì)數(shù)變量初始化。

        release(struct inode*inode,struct file*file):

        釋放一個(gè)設(shè)備。當(dāng)使用設(shè)備終結(jié)后,調(diào)用release子程序。在程序的試驗(yàn)開(kāi)發(fā)階段有用,因?yàn)榍度胧疆a(chǎn)品的控制程序主要是一個(gè)不斷循環(huán)的過(guò)程,不存在設(shè)備的關(guān)閉和資源的釋放。

        read (struct inode*inode,struct file *filp,char *buf,int count):

        從設(shè)備上讀數(shù)據(jù)。對(duì)于有緩沖的I/O操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。對(duì)字符設(shè)備文件進(jìn)行讀操作將調(diào)用read子程序。Count指定了讀取的字節(jié)數(shù),讀取的數(shù)據(jù)置入以buffer為首地址的內(nèi)存空間。在定時(shí)器一中,read函數(shù)主要用來(lái)將定時(shí)器發(fā)生的次數(shù)清零,并且將主程序放入等待隊(duì)列。

        write(struct inode*inode,struct file *filp,char*buf,int count):

        往設(shè)備上寫(xiě)數(shù)據(jù)。對(duì)于有緩沖區(qū)的I/O操作,一般是把數(shù)據(jù)寫(xiě)入緩沖區(qū)里。對(duì)字符設(shè)備特別設(shè)備文件進(jìn)行寫(xiě)操作將調(diào)用write子程序,寫(xiě)入的數(shù)據(jù)放在Buf為起始地址的內(nèi)存空間里,字節(jié)數(shù)為count代表的值。

        2.3 中斷服務(wù)子程序

        中斷服務(wù)子程序,又稱(chēng)為驅(qū)動(dòng)程序的下半部分:

        isr(int irq,void *dev_id,struct pt_regs *regs):

        其中irq代表設(shè)備的硬件中斷號(hào),dev_id代表設(shè)備名稱(chēng),pt_regs代表設(shè)備使用的寄存器的值。這是一個(gè)回調(diào)函數(shù),中斷發(fā)生時(shí),系統(tǒng)調(diào)用這個(gè)函數(shù),傳入的參數(shù)包括硬件中斷號(hào)、設(shè)備號(hào)、寄存器值。

        在Linux系統(tǒng)中,并不直接從中斷向量表中調(diào)用設(shè)備驅(qū)動(dòng)程序的中斷服務(wù)子程序,而是由Linux系統(tǒng)來(lái)接收硬件中斷,再由系統(tǒng)調(diào)用中斷服務(wù)子程序。中斷可以產(chǎn)生在任何一個(gè)進(jìn)程運(yùn)行的時(shí)候。因此,在中斷服務(wù)程序被調(diào)用的時(shí)候,不能依賴(lài)于任何進(jìn)程的狀態(tài),也就不能調(diào)用與進(jìn)程運(yùn)行環(huán)境有關(guān)的函數(shù)。因?yàn)樵O(shè)備驅(qū)動(dòng)程序一般支持同一類(lèi)型的若干設(shè)備,所以一般在系統(tǒng)調(diào)用中斷服務(wù)子程序的時(shí)候,都帶有一個(gè)或者多個(gè)參數(shù),以唯一標(biāo)識(shí)請(qǐng)求服務(wù)的設(shè)備。

        Jupiter提供了6個(gè)外中斷源,中斷反應(yīng)時(shí)間在10-25微秒。每識(shí)別到一個(gè)光柵信號(hào)觸發(fā)一次中斷,在中斷程序中首先用計(jì)數(shù)器記錄中斷產(chǎn)生的次數(shù),如果次數(shù)達(dá)到給定的起始位置數(shù),則開(kāi)始往噴頭送256次數(shù),執(zhí)行點(diǎn)火操作。

        上面所述為驅(qū)動(dòng)程序的內(nèi)容部分,驅(qū)動(dòng)程序做完以后,還要往系統(tǒng)里添加,把程序放在?Clinux內(nèi)核的/drivers/char文件目錄下,并且在/drivers/char/ mem.c添加驅(qū)動(dòng)程序的init(),以便系統(tǒng)啟動(dòng)的時(shí)候執(zhí)行該子程序測(cè)試并且初始化設(shè)備;然后在/drivers/char/Makefile文件中添加編譯信息,在編譯系統(tǒng)內(nèi)核的時(shí)候,會(huì)自動(dòng)編譯所加的驅(qū)動(dòng)程序。最后在系統(tǒng)啟動(dòng)末尾執(zhí)行的批處理文件里加上設(shè)備的mknod命令。這樣,在系統(tǒng)啟動(dòng)以后,在/dev目錄下就可以觀察到你所注冊(cè)的設(shè)備,設(shè)備就可以在用戶程序里進(jìn)行調(diào)用了。

        3.控制系統(tǒng)軟件調(diào)試

        嵌入式的運(yùn)行環(huán)境是?Clinux,應(yīng)用程序是在這個(gè)環(huán)境下運(yùn)行的。在設(shè)計(jì)軟件的時(shí)候,應(yīng)該考慮到一切意外的情況下,應(yīng)用程序都應(yīng)該有自救的功能。例如,在串口通信的實(shí)現(xiàn)上,和PC機(jī)約定好為16個(gè)字節(jié),利用read函數(shù)每次讀取一個(gè)字節(jié),循環(huán)16次度取完所有字節(jié)。但是如果操作系統(tǒng)的驅(qū)動(dòng)程序丟失傳送的字節(jié)后,應(yīng)用程序就會(huì)死掉。所以采用對(duì)read()函數(shù)的屬性進(jìn)行設(shè)置,在2秒鐘的時(shí)間內(nèi),如果還沒(méi)有字節(jié)輸入,會(huì)自動(dòng)退出。然后向PC機(jī)發(fā)出出錯(cuò)信息,重發(fā)一次。這樣就克服了上述的缺點(diǎn)。

        4.結(jié)束語(yǔ)

        本文在Linux的基礎(chǔ)上設(shè)計(jì)了光柵檢測(cè)控制的軟件系統(tǒng)。配合噴繪機(jī)硬件設(shè)備,提高了噴繪機(jī)的打印精度。但隨著噴頭技術(shù)的發(fā)展,以及客戶的不斷要求,在一些方面還需要加強(qiáng)。提高嵌入式核心的主頻,以增加數(shù)據(jù)的絕對(duì)處理速度;采用傳輸速率更高的方式如LVDS進(jìn)行數(shù)據(jù)傳輸;增大系統(tǒng)板的內(nèi)存容量,減小打印過(guò)程中的等待時(shí)間,這樣就可以解除現(xiàn)有噴繪機(jī)打印速度不能顯著提高的瓶頸。

        參考文獻(xiàn)

        [1]劉晉,靳祥陸,張秋風(fēng),劉鋒,顧彬彬.大幅面高速彩色噴繪機(jī)主控制系統(tǒng)研究與設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2011,19(9):

        2140-2142.

        [2]Kumar S,Bhat V,Vinoy K J,Santhanam V. Using an Office Inkjet Printer to Define the Formation of Copper Films on Paper[J].IEEE Transactions on Nanotechnology,2014,13(1):160-164.

        [3]鄒思軼主編.嵌入式Linux設(shè)計(jì)與應(yīng)用[M].北京:清華大學(xué)出版社,2002:171-186.

        [4]Lan Yuqing,Xu Hao,Liu Xiaohui.The Research of Performance Test Method for Linux Process Scheduling[C].2012 International Symposium on Information Science and Engineering (ISISE),2012,216-219.

        [5]李善平,陳文智編著.邊干邊學(xué)Linux內(nèi)核指導(dǎo)[M].杭州:浙江大學(xué)出版社,2002:337-347.

        [6]Wong,William.Tiny Compact Flash-based sys runs ?Clinux[J].Electronics Design,2004,52(21):40-42.

        [7]Gary Nutt. Kernel Projects for Linux[M].北京:機(jī)械工業(yè)出版社,2002.

        [8]高世偉,劉亞利,陳秀萍.基于uCLinux和Jupiter的嵌入式通訊設(shè)備的設(shè)計(jì)[J].計(jì)算機(jī)工程與應(yīng)用,2005(29):110-112.

        基金項(xiàng)目:國(guó)家自然科學(xué)基金資助項(xiàng)目(項(xiàng)目編號(hào):11273001)。

        作者簡(jiǎn)介:張立立(1984—),女,遼寧沈陽(yáng)人,碩士,實(shí)驗(yàn)師,主要研究方向:無(wú)線傳感器網(wǎng)絡(luò)等。

        精品视频在线观看一区二区有| 亚洲乱码中文字幕综合| 亚洲免费人成在线视频观看| 亚洲av成人一区二区三区网址| 国产盗摄一区二区三区av| 日韩女优中文字幕在线| av手机免费在线观看高潮| 亚洲综合一区中文字幕| 亚洲成av人片天堂网| 国内少妇自拍区免费视频| 日本一区二区三区看片| 国产一区亚洲二区三区极品| 我把护士日出水了视频90分钟 | 亚洲av日韩av永久无码下载| 国产大学生粉嫩无套流白浆| 亚洲综合综合在线| 日本女优中文字幕在线播放| 性猛交╳xxx乱大交| 国产成人国产在线观看入口| 国产三级国产精品国产专区| 精品不卡视频在线网址| 护士的小嫩嫩好紧好爽| 丰满五十六十老熟女hd| 欧美亚洲另类国产18p| 美腿丝袜在线观看视频| 国产伦精品一区二区三区妓女| 尤物99国产成人精品视频| 白色月光在线观看免费高清| 精品国产成人av久久| 午夜精品一区二区三区的区别| 色欧美与xxxxx| 91精品国产高清久久福利| 日韩精品视频一区二区三区| 日韩一级特黄毛片在线看| 国产精品久久久精品三级18 | 女同同性av观看免费| 中文成人无字幕乱码精品区| 青草蜜桃视频在线观看| 日韩精品中文字幕第二页| 国产乱人激情h在线观看| 国产a级网站|