張立立 張鵬飛 沙毅 方晶晶
【摘要】本文設計的光柵檢測系統主要應用在高精度噴繪機的運動控制單元。本文以Linux操作系統為開發平臺,分別從自動配置和初始化子程序、服務于I/O請求的子程序、中斷程序三個部分詳細說明了光柵檢測系統的軟件設計流程。本系統通過實際運行與測試,達到設計要求。
【關鍵詞】光柵檢測;高精度噴繪機;Linux操作系統;軟件程序
近幾年來,大幅面噴繪市場發生了巨大變化,大幅面產品的應用越來越廣泛,已逐步滲透到包括廣告、裝飾、攝影等許多行業。隨著大幅面打印技術的不斷成熟,噴繪機[1]在全球范圍得到迅速普及,特別是在我國的廣告制作領域更是得到革命性的應用。
噴繪機的性能指標[2]主要包括:打印速度和打印精度。噴繪機的打印速度是以單位時間的出畫面積來衡量,打印精度(分辨率)用DPI(點每英寸)來衡量,單位長度內的點數越多,DPI越大,畫面就越清晰。為了提高打印精度,減少2個點之間距離,必須提高噴頭的點火頻率。為了提高噴繪機的打印速度必須提高噴頭的移動速度。隨著噴繪機制造行業的迅猛發展,原有產品不論在打印精度上還是在打印速度上已經不具有市場領先優勢,甚至有一些方面已經處于劣勢。這樣必須及時推出高打印精度,高打印速度的噴繪設備,才能使公司在市場競爭中立于不敗之地。本文設計的光柵系統主要用于小車打畫過程中的精確定位,使畫面的點均勻分布。光柵尺的精度為180DPI,通過正交解碼最高可達到720DPI。
1.Linux設備驅動編程
Linux的核心設備驅動是一組運行在特權等級上的內存駐留底層硬件處理共享庫,正是它們負責管理各個設備[3]。在Linux操作系統[4]中,需要內核建立應用程序和設備之間的抽象接口,而不是由應用程序直接操作硬件。為此,操作系統一般提供設備驅動程序,專門完成對特定硬件的控制。設備驅動程序實際是處理或操作硬件控制器的軟件,從本質上講,它們是內核中具有高特權級的、駐留內存的、可共享的底層處理硬件例程[5]。
在Linux系統中,一個基本的特點是它抽象了設備處理,所有硬件設備的操作和通常的文件一樣,利用標準的系統調用可在設備上進行打開、關閉、讀取或寫入操作。系統中的每個設備由設備特殊文件代表,每個由相同設備驅動程序控制的設備具有相同的主設備號,而從設備號則用來區分同類設備中不同的設備。設備特殊文件的VFS索引節點中包含設備號的信息。如果通過系統調用來訪問設備,則內核通過該VFS節點中的設備號信息調用適當的設備驅動程序。
Linux支持字符、塊及網絡設備三種硬件設備[6]。字符設備指那些無需緩沖直接讀寫的設備,像系統中的串口設備。塊設備則僅能以塊為單位進行讀寫。Linux核心中存在許多不同的設備驅動,這些驅動具有以下的共同特點[7]:
(1)核心代碼:設備驅動是核心的一部分,如同核心中其他代碼一樣,出錯將導致系統的嚴重損害,甚至使系統崩潰,導致文件系統的破壞和數據丟失。
(2)核心接口:設備驅動必須為Linux核心或者其從屬子系統提供一個標準接口。
(3)核心機制與服務:設備驅動可以使用標準的核心服務,如中斷發送和等待隊列等。
(4)動態可加載:多數Linux設備驅動可以在核心模塊發出加載請求時加載,在不再使用時卸載,這樣核心能有效的利用系統資源。
(5)可配置:Linux設備驅動可以連接到核心中,可以配置決定那些設備驅動被連入核心。
(6)動態性:當系統啟動和設備驅動初始化時,將查找它所控制的硬件設備,如果某個設備的驅動為一個空閑的過程并不會有什么問題。此時,設備驅動僅僅是一個冗余的程序,它除了占用少量系統內存外,不會對系統造成什么危害。
2.光柵檢測系統的軟件設計
Linux核心與設備驅動之間有一個標準方式進行互操作的接口。每一類設備驅動都提供通用的接口,這種通用接口使得核心可以用相同的方式來對待不同的設備及設備驅動。嵌入式Jupiter系統[8]通過外部中斷5對光柵檢測系統產生的信號進行響應,當中斷信號產生時,相應的中斷服務程序,即驅動程序執行設定的任務。外中斷五中斷服務程序流程圖如圖1所示。
圖1 外中斷五中斷服務程序流程圖
對用戶程序來說,Linux系統的設備驅動程序隱藏了設備的具體細節,對各種不同設備提供一致的接口,一般來說是把設備映射為一個特殊的設備文件,用戶程序可以像對其它文件一樣對此設備文件進行操作。Linux對硬件設備支持兩個標準接口:塊設備文件和字符設備文件,分別稱為塊設備接口和字符文件接口。每一個設備驅動程序由如下三個部分組成:
2.1 自動配置和初始化子程序init
負責檢測所要驅動的硬件設備是否存在和是否能正常工作,同時自動配置和初始化。這一部分程序會在系統啟動的過程中自動執行。在內核啟動的最后階段運行這一部分程序,首先通過系統調用register_chrdev向系統申請一個主設備號,如果這個主設備號已經被別的設備占用,將會返回一個錯誤的信息;然后通過系統調用request_irq請求使用這個設備,如果這個設備沒有注冊成功,或者使用的條件不足,也會返回一個錯誤信息。如果這兩步都沒有問題的話,驅動程序就加載到了內核,在用戶程序空間就可以使用這個設備。
2.2 服務于I/O請求的子程序
服務于I/O請求的子程序,又稱為驅動程序的上半部分。調用這部分是由于系統調用的結果。這部分程序在執行的時候,系統仍認為是和進行調用的進程屬于同一個進程,只是由用戶態變成了核心態,但是具有進行此系統調用的用戶程序的運行環境。因此,可以在子程序中調用于進程相關的系統庫函數。
這一部分程序實際的作用就是用戶程序空間和內核空間進行通信,由用戶程序空間向內核空間傳達各種參數,或者從內核空間獲取設備的各種信息。
在系統內部,I/O設備的存取操作通過一組固定的入口點進行,這組入口點是由每個設備的驅動程序提供的。嵌入式操作系統中的字符型設備提供一下入口點:
open(struct inode *inode, struct file *file):
打開設備準備I/O操作,系統通過設備名稱,函數的第一個參數來區分每個驅動程序的入口點操作函數;第二個參數說明這個函數的文件結構體,主要說明設備的使用類型。對字符特別設備文件進行打開操作,都會調用設備的open入口點函數。Open子程序必須對將要進行的I/O操作做好必要的準備工作。如果設備是獨占的,那么同一時間只能有一個程序訪問此設備,則open子程序必須設置一些標志,以表示設備處于忙狀態。
在嵌入式操作系統中,定時器一、定時器二和外中斷五主要用open函數設置驅動程序的打開狀態,防止設備在打開之前就已經開始使用的情況,同時還將設備驅動程序的一些計數變量初始化。
release(struct inode*inode,struct file*file):
釋放一個設備。當使用設備終結后,調用release子程序。在程序的試驗開發階段有用,因為嵌入式產品的控制程序主要是一個不斷循環的過程,不存在設備的關閉和資源的釋放。
read (struct inode*inode,struct file *filp,char *buf,int count):
從設備上讀數據。對于有緩沖的I/O操作,一般是從緩沖區里讀數據。對字符設備文件進行讀操作將調用read子程序。Count指定了讀取的字節數,讀取的數據置入以buffer為首地址的內存空間。在定時器一中,read函數主要用來將定時器發生的次數清零,并且將主程序放入等待隊列。
write(struct inode*inode,struct file *filp,char*buf,int count):
往設備上寫數據。對于有緩沖區的I/O操作,一般是把數據寫入緩沖區里。對字符設備特別設備文件進行寫操作將調用write子程序,寫入的數據放在Buf為起始地址的內存空間里,字節數為count代表的值。
2.3 中斷服務子程序
中斷服務子程序,又稱為驅動程序的下半部分:
isr(int irq,void *dev_id,struct pt_regs *regs):
其中irq代表設備的硬件中斷號,dev_id代表設備名稱,pt_regs代表設備使用的寄存器的值。這是一個回調函數,中斷發生時,系統調用這個函數,傳入的參數包括硬件中斷號、設備號、寄存器值。
在Linux系統中,并不直接從中斷向量表中調用設備驅動程序的中斷服務子程序,而是由Linux系統來接收硬件中斷,再由系統調用中斷服務子程序。中斷可以產生在任何一個進程運行的時候。因此,在中斷服務程序被調用的時候,不能依賴于任何進程的狀態,也就不能調用與進程運行環境有關的函數。因為設備驅動程序一般支持同一類型的若干設備,所以一般在系統調用中斷服務子程序的時候,都帶有一個或者多個參數,以唯一標識請求服務的設備。
Jupiter提供了6個外中斷源,中斷反應時間在10-25微秒。每識別到一個光柵信號觸發一次中斷,在中斷程序中首先用計數器記錄中斷產生的次數,如果次數達到給定的起始位置數,則開始往噴頭送256次數,執行點火操作。
上面所述為驅動程序的內容部分,驅動程序做完以后,還要往系統里添加,把程序放在?Clinux內核的/drivers/char文件目錄下,并且在/drivers/char/ mem.c添加驅動程序的init(),以便系統啟動的時候執行該子程序測試并且初始化設備;然后在/drivers/char/Makefile文件中添加編譯信息,在編譯系統內核的時候,會自動編譯所加的驅動程序。最后在系統啟動末尾執行的批處理文件里加上設備的mknod命令。這樣,在系統啟動以后,在/dev目錄下就可以觀察到你所注冊的設備,設備就可以在用戶程序里進行調用了。
3.控制系統軟件調試
嵌入式的運行環境是?Clinux,應用程序是在這個環境下運行的。在設計軟件的時候,應該考慮到一切意外的情況下,應用程序都應該有自救的功能。例如,在串口通信的實現上,和PC機約定好為16個字節,利用read函數每次讀取一個字節,循環16次度取完所有字節。但是如果操作系統的驅動程序丟失傳送的字節后,應用程序就會死掉。所以采用對read()函數的屬性進行設置,在2秒鐘的時間內,如果還沒有字節輸入,會自動退出。然后向PC機發出出錯信息,重發一次。這樣就克服了上述的缺點。
4.結束語
本文在Linux的基礎上設計了光柵檢測控制的軟件系統。配合噴繪機硬件設備,提高了噴繪機的打印精度。但隨著噴頭技術的發展,以及客戶的不斷要求,在一些方面還需要加強。提高嵌入式核心的主頻,以增加數據的絕對處理速度;采用傳輸速率更高的方式如LVDS進行數據傳輸;增大系統板的內存容量,減小打印過程中的等待時間,這樣就可以解除現有噴繪機打印速度不能顯著提高的瓶頸。
參考文獻
[1]劉晉,靳祥陸,張秋風,劉鋒,顧彬彬.大幅面高速彩色噴繪機主控制系統研究與設計[J].計算機測量與控制,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設計與應用[M].北京:清華大學出版社,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]李善平,陳文智編著.邊干邊學Linux內核指導[M].杭州:浙江大學出版社,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].北京:機械工業出版社,2002.
[8]高世偉,劉亞利,陳秀萍.基于uCLinux和Jupiter的嵌入式通訊設備的設計[J].計算機工程與應用,2005(29):110-112.
基金項目:國家自然科學基金資助項目(項目編號:11273001)。
作者簡介:張立立(1984—),女,遼寧沈陽人,碩士,實驗師,主要研究方向:無線傳感器網絡等。