第一篇:如何在嵌入式LINUX中增加自己的設(shè)備驅(qū)動
如何在嵌入式LINUX中增加自己的設(shè)備驅(qū)動程序 北京郵電大學(xué)電子工程學(xué)院 強磊
------------------
驅(qū)動程序的使用可以按照兩種方式編譯,一種是靜態(tài)編譯進內(nèi)核,另一種是編譯成模塊以供動態(tài)加載。由于uClinux不支持模塊動態(tài)加載,而且嵌入式LINUX不能夠象桌面LINUX那樣靈活的使用insmod/rmmod加載卸載設(shè)備驅(qū)動程序,因而這里只介紹將設(shè)備驅(qū)動程序靜態(tài)編譯進uClinux內(nèi)核的方法。下面以UCLINUX為例,介紹在一個以模塊方式出現(xiàn)的驅(qū)動程序test.c基礎(chǔ)之上,將其編譯進內(nèi)核的一系列步驟:
(1)改動test.c源帶代碼 第一步,將原來的:
#include
#ifdef MODULE #include
result=register_chrdev(254,“test”,&test_fops);
(2)將test.c復(fù)制到/uclinux/linux/drivers/char目錄下,并且在/uclinux/linux/drivers/char目錄下mem.c中,int chr_dev_init()函數(shù)中增加如下代碼: #ifdef CONFIG_TESTDRIVE init_test();#endif
(3)在/uclinux/linux/drivers/char目錄下Makefile中增加如下代碼: ifeq($(CONFIG_TESTDRIVE),y)L_OBJS+=test.o Endif(4)在/uclinux/linux/arch/m68knommu目錄下config.in中字符設(shè)備段里增加如下代碼: bool 'support for testdrive' CONFIG_TESTDRIVE y
(5)運行make menuconfig(在menuconfig的字符設(shè)備選項里你可以看見我們剛剛添加的'support for testdrive'選項,并且已經(jīng)被選中);make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。(6)在 /uclinux/romdisk/romdisk/dev/目錄下創(chuàng)建設(shè)備: mknod test c 254 0 并且在/uclinux/appsrc/下運行make,生成新的Romdisk.s19文件。
到這里,在UCLINUX中增加設(shè)備驅(qū)動程序的工作可以說是完成了,只要將新的linux.bin與Romdisk.s19燒入目標(biāo)板中,你就可以使用自己的新設(shè)備test了。
第二篇:基于嵌入式Linux的設(shè)備驅(qū)動程序設(shè)計
基于嵌入式Linux的設(shè)備驅(qū)動程序設(shè)計
Linux為是一個成熟而穩(wěn)定的操作系統(tǒng)。將Linux植入嵌入式設(shè)備具有眾多的優(yōu)點,包括可剪裁和容易移植等,所以Linux操作系統(tǒng)在嵌入式領(lǐng)域獲得了廣泛的應(yīng)用。嵌入式Linux一直是嵌入式領(lǐng)域的研究熱點,與PC架構(gòu)不同,嵌入式系統(tǒng)的硬件具有多樣性和差異性,嵌入式系統(tǒng)的開發(fā)需要對特定系統(tǒng)進行硬件設(shè)計,同時還要針對這些硬件來編寫驅(qū)動程序。Linux內(nèi)核就是通過驅(qū)動程序來同外圍設(shè)備打交道的,系統(tǒng)設(shè)計人員必須為每個設(shè)備編寫驅(qū)動程序,否則設(shè)備無法在操作系統(tǒng)下正常工作。設(shè)備驅(qū)動程序設(shè)計的基本概念與模型
設(shè)備驅(qū)動程序是操作系統(tǒng)內(nèi)核與機器硬件之間的接口,它為應(yīng)用程序屏蔽了硬件的細節(jié),在應(yīng)用程序看來,硬件設(shè)備只是一個設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對硬件設(shè)備進行操作,設(shè)計驅(qū)動程序是內(nèi)核的一部分,可以實現(xiàn)以下功能:
對設(shè)備初始化和釋放;
把數(shù)據(jù)從內(nèi)核傳送到硬件,以及從硬件讀取數(shù)據(jù);
讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù),以及回送應(yīng)用程序請求的數(shù)據(jù);
檢測和處理設(shè)備出現(xiàn)的錯誤。
前面已經(jīng)提到驅(qū)動程序的作用,而編寫驅(qū)動程序就是構(gòu)造一系列可供應(yīng)用程序調(diào)動的函數(shù)(包括open、release、read、write、llseek、ioctl等)。在用戶自己的驅(qū)動程序中,首先要根據(jù)驅(qū)動程序的功能,實現(xiàn)file_operations結(jié)構(gòu)中的函數(shù),不需要的函數(shù)接口可以直接在file_operations結(jié)構(gòu)中初始化為NULL;file_operations變量會在驅(qū)動程序初始化時注冊到系統(tǒng)內(nèi)部。當(dāng)操作系統(tǒng)對設(shè)備操作時,會調(diào)用驅(qū)動程序注冊的file_operations結(jié)構(gòu)中的函數(shù)指針。
以下是嵌入式linux2.4設(shè)備驅(qū)動程序的最簡模型。
具體實現(xiàn)前面定義的函數(shù)時,需注意下面幾點:
1)在test_init函數(shù)中要通過調(diào)用register_chrdev()函數(shù)來向內(nèi)核注冊字符設(shè)備驅(qū)動程序。如果是塊設(shè)備,則還需調(diào)用mmmap()進行地址空間的映射,再調(diào)用register_blkdev()函數(shù)來向內(nèi)核注冊塊設(shè)備驅(qū)動程序,在Linux系統(tǒng)中,對中斷的處理是屬于系統(tǒng)核心部分,因而如果設(shè)備與系統(tǒng)之間以中斷方式進行數(shù)據(jù)交換,則必須把該設(shè)備的驅(qū)動程序作為系統(tǒng)核心的一部分,也就是說設(shè)備驅(qū)動程序要通過調(diào)用request_irq()函數(shù)來申請中斷,通過free_irq()函數(shù)來釋放中斷(在test_cleanup中實現(xiàn))。
2)open()函數(shù)和release()函數(shù)的具體實現(xiàn)有著一定的對應(yīng)性,在open()函數(shù)中主要是執(zhí)行打開設(shè)備時的一些初始化代碼,如果該驅(qū)動程序需要管理多個設(shè)備,那么還要獲取從設(shè)備號,根據(jù)從設(shè)備號來判斷需要操作的設(shè)備,其中,從設(shè)備號可通過調(diào)用函數(shù)MINOR(inode->i_rdev)來獲得,然后再調(diào)用宏MOD_INC_USE_COUNT來使得驅(qū)動程序使用計數(shù)器加1,而在release()函數(shù)中則要進行相反的處理。即調(diào)用宏MOD_DEC_USE_COUNT來減小驅(qū)動程序使用計數(shù)器。
3)歸根到底,驅(qū)動函數(shù)的實現(xiàn)就是調(diào)用內(nèi)核所支持的函數(shù)(包括內(nèi)核提供的API和用戶自己定義的寄存器操作函數(shù))來完成對設(shè)備的操作,雖然嵌入式系統(tǒng)設(shè)備的種類眾多,不同設(shè)備操作的具體實現(xiàn)方法不可能相同,但是Linux操作系統(tǒng)提供了一系列特殊API,為開發(fā)內(nèi)核驅(qū)動程序帶來了很大的方便,調(diào)用這些API時需要注意的是:通常情況下,應(yīng)用程序是通過內(nèi)核接口訪問驅(qū)動程序的(這是驅(qū)動程序的主要使用方式),因此驅(qū)動程序需要與應(yīng)用程序交換數(shù)據(jù),但是操作系統(tǒng)內(nèi)核和驅(qū)動程序在內(nèi)核空間中運行,而用戶程序在用戶空間中運行,用戶程序不能訪問內(nèi)核空間,操作系統(tǒng)內(nèi)核和驅(qū)動程序也不能使用指針或memcpy()等常規(guī)的C庫函與用戶空間傳輸數(shù)據(jù),造成這種狀況的主要原因是linux操作系統(tǒng)使用了虛擬內(nèi)存機制,使用了虛擬內(nèi)存機制后,用戶空間的內(nèi)存可能被換出,當(dāng)內(nèi)核使用用戶空間指針時,對應(yīng)的頁面可能已經(jīng)不在內(nèi)存中了,因此在使用調(diào)用函數(shù)時要注意:設(shè)備驅(qū)動程序在申請和釋放內(nèi)存時不是調(diào)用malloc()和free(),而調(diào)用kmalloc()和kfree();用于內(nèi)核空間與用戶空間進行數(shù)據(jù)拷貝的函數(shù)主要有access_ok()(檢查某內(nèi)存空間是否有權(quán)訪問),copy_to_user()和put_usr()(內(nèi)核函數(shù)向用戶空間傳輸數(shù)據(jù)),copy_from_user()和get_user()(用戶空間向內(nèi)核空間傳輸數(shù)據(jù));關(guān)于內(nèi)核空間與I/O空間的數(shù)據(jù)交換,不同體系結(jié)構(gòu)的處理器對I/O的處理方式也不同,x86系列處理器中,I/O與內(nèi)存完成不同,它是分開編址的,訪問它要使用專用的指令;而對ARM體系結(jié)構(gòu)的處理器來說,則是不區(qū)分I/O和內(nèi)存,統(tǒng)一編址的,可以使用同樣的指令訪問,在驅(qū)動程序中可以使用一系列函數(shù)來訪問I/O口,如outb()、outw()、outl()inb()、inw()、inl()、outsb()、outsw()、outsl()、insb()、insw()和insl()等。
Linux2.6與2.4內(nèi)核驅(qū)動程序的區(qū)別
為了徹底防止對正在被使用的內(nèi)核模塊進行錯誤操作,linux2.6內(nèi)核在加載和導(dǎo)出內(nèi)核模塊方面都較2.4內(nèi)核有所改進,避免了用戶執(zhí)行將導(dǎo)致系統(tǒng)崩潰的操作(例如強制刪除模塊等)。同時,當(dāng)驅(qū)動程序需要在多個文件中包含 頭文件時,不必定義宏來檢查內(nèi)核的版本。與2.4內(nèi)核相比,2.6內(nèi)核在可擴展性、吞吐率等方面有較大提升,其新特性主要包括:使用了新的調(diào)度器算法;內(nèi)核搶占功能顯著地降低了用戶交互式應(yīng)用程序;多媒體應(yīng)用程序等類似應(yīng)用程序的延遲;改進了線程模型以及對NPTL的支持,顯著改善了虛擬內(nèi)存在一定成程度負載下的性能;能夠支持更多的文件系統(tǒng);引進了內(nèi)存池技術(shù);支持更多的系統(tǒng)設(shè)備,在2.4內(nèi)核中有約束大型系統(tǒng)的限制,其支持的每一類設(shè)備的最大數(shù)量為256,而2.6內(nèi)核則徹底打破了這些限制,可以支持4095種主要的設(shè)備類型,且每個單獨的類型又可以支持超過一百萬個的子設(shè)備;支持反向映射機制(reverse mapping),內(nèi)存管理器為每一個物理頁建立一個鏈表,包含指向當(dāng)前映射頁中每個進程的頁表條目的指針。該鏈表叫PTE鏈,它極大的提高了找到那些映射某個頁的進程的速度。
Linux操作系統(tǒng)的設(shè)備驅(qū)動程序是在內(nèi)核空間運行的程序,其中涉及很多內(nèi)核的操作,隨著Linux內(nèi)核版本的升級,驅(qū)動程序的開發(fā)必然也要作出相應(yīng)的修改,總之,在linux2.6內(nèi)核上編寫設(shè)備驅(qū)動程序時具體要注意以下幾個方面:
1)Linux2.6內(nèi)核驅(qū)動程序必須由MODULE_LICENSE(“Dual BSD/GPL”)語句來定義許可證,而不能再用2.4內(nèi)核的MODULE_LICENSE(“GPL”)。否則,在編譯時會出現(xiàn)警告提示。
2)Linux2.6內(nèi)核驅(qū)動程序可以用int try_module_get(&module)來加載模塊,用module_put()函數(shù)來卸載模塊,而以前2.4內(nèi)核使用的宏MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT則可不用。
3)前面給出的字符型設(shè)備驅(qū)動程序模型中結(jié)構(gòu)體file_operations的定義要采用下面的形式。這是因為在Linux內(nèi)核中對結(jié)構(gòu)體的定義形式發(fā)生了變化,不再支持原來的定義形式。
4)就字符型設(shè)備而言,test_open()函數(shù)中向內(nèi)核注冊設(shè)備的調(diào)用函數(shù)register_chrdev()可以升級為int register_chrdev_region(dev_t from,unsigned count,char * name),如果要動態(tài)申請主設(shè)備號可調(diào)用函數(shù)int alloc_chrdev_region(dev_t * dev,unsigned baseminor,unsigned count,char * name)來完成;原來的注冊函數(shù)還可以用,只是不能注冊設(shè)備號大于256的設(shè)備,同理,對于塊設(shè)備和網(wǎng)絡(luò)設(shè)備的注冊函數(shù)也有著相對應(yīng)的代替函數(shù)。
5)在聲明驅(qū)動程序是否要導(dǎo)出符號表方面有著很大的變化。當(dāng)驅(qū)動程序模塊裝入內(nèi)核后,它所導(dǎo)出的任何符號都會變成公共符合表的一部分,在/proc/ksyms中可以看到這些新增加的符號。通常情況之下,模塊只需實現(xiàn)自己的功能,不必導(dǎo)出任何符號,然而,如果有其他模塊需要使用模塊導(dǎo)出的符號時,就必須導(dǎo)出符號,只有顯示的導(dǎo)出符號才能被其他模塊使用,Linux2.6內(nèi)核中默認不導(dǎo)出所有的符號,不必使用EXPORT_NO_SYMBOLS宏來定義;而在2.4內(nèi)核中恰恰相反,它默認導(dǎo)出所有的符號,除非使用EXPORT_NO_SYMBOLS,因此在上面給出的范例中可以省略去該定義語句。
6)Linx內(nèi)核統(tǒng)一了很多設(shè)備類型,同時也支持更大的系統(tǒng)和更多的設(shè)備,原來Linux2.4內(nèi)核中的變量kdev_t已經(jīng)被廢除不可用,取而代之的是dev_t。它拓展到了32位,其中包括12位主設(shè)備號和20位次設(shè)備號。調(diào)用函數(shù)為unsigned int iminor(struct inode * inode)和unsigned int imajor(struct inode * inode),而不再用Linux2.4版本中的int MAJOR(kdev_t dev)和int MINOR(kdev_t dev)。
所有的內(nèi)存分配函數(shù)不再包含在頭文件 中,而是包含在 中,而原來的 已經(jīng)不存在。所以當(dāng)在驅(qū)動程序中要用到函數(shù)kmalloc()或kfree()等內(nèi)存分配函數(shù)時,就必須要定義頭文件 而不是。同時,前面提到的申請內(nèi)存和釋放內(nèi)存函數(shù)的具體參數(shù)也有了一定的改變,包括:分配標(biāo)志GFP_BUFFER被取消,取而代之的是GFP_NOIO和GFP_NOFS;新增了_GFP_REPEAT、_GFP_NOFAIL和_GFP_NORETRY分配標(biāo)志等,使得內(nèi)存操作更加方便。
8)因為內(nèi)核中有些地方的內(nèi)存分配是不允許失敗的,所以為了確保這種情況下得成功分配,linux2.6版本內(nèi)核中開發(fā)了一種稱為“內(nèi)存池”的抽象。內(nèi)存池其實相當(dāng)于后備的高速緩存,以便在緊急狀態(tài)下使用。要使用內(nèi)存池的處理函數(shù)時,必須包含頭文件。內(nèi)存池處理函數(shù)主要有以下幾個:mempool_t *mempool_create()、void*mempool_alloc()、void mempool_free()、int mempool_resize();
另外值得一提的是:2.6內(nèi)核為了區(qū)別以.o為擴展名的常規(guī)對象文件,將內(nèi)核模塊的擴展名改為.ko,所以驅(qū)動程序最后是被編譯為ko后綴的可加載模塊,在應(yīng)用程序中加載驅(qū)動程序模塊時要注意。結(jié)語
驅(qū)動程序的開發(fā)作為嵌入式linux系統(tǒng)開發(fā)過程當(dāng)中最重要的環(huán)節(jié)之一,與硬件特性和操作系統(tǒng)的內(nèi)核有著緊密的聯(lián)系。隨著linux內(nèi)核版本的升級,內(nèi)核驅(qū)動程序必然要作出相應(yīng)的改進,相信隨著嵌入式Linux系統(tǒng)在各個領(lǐng)域中的廣泛應(yīng)用,具有可搶占實時性的Linux2.6內(nèi)核必定會在嵌入式領(lǐng)域大顯身手。本文會對廣大的驅(qū)動程序開發(fā)人員有一定的幫助。
第三篇:基于ARM的嵌入式設(shè)備中uCLinux系統(tǒng)開發(fā).
基于ARM的嵌入式設(shè)備中uCLinux系統(tǒng)開發(fā)
1引言信息家電和手持設(shè)備大大加速了嵌入式系統(tǒng)的發(fā)展,而ARM體系32位高性能、低功耗處理器和嵌入式操作系統(tǒng)Linux無疑成為佼佼者。因為Linux源代碼開放、免費,任何將其定制于PDA、掌上機或者便攜式設(shè)備感興趣的人都可以從因特網(wǎng)免費下載其內(nèi)核和應(yīng)用程序,并開始移植或開發(fā),所以Linux在嵌入式開發(fā)領(lǐng)域得到穩(wěn)步發(fā)展。uCLinux即是目前嵌入式linux中最流行的一種,它是針對微控制領(lǐng)域而設(shè)計的Linux系統(tǒng),其最大特征就是沒有MMU(內(nèi)存 1 引言
信息家電和手持設(shè)備大大加速了嵌入式系統(tǒng)的發(fā)展,而ARM體系32位高性能、低功耗處理器和嵌入式操作系統(tǒng)Linux無疑成為佼佼者。因為Linux源代碼開放、免費,任何將其定制于PDA、掌上機或者便攜式設(shè)備感興趣的人都可以從因特網(wǎng)免費下載其內(nèi)核和應(yīng)用程序,并開始移植或開發(fā),所以Linux在嵌入式開發(fā)領(lǐng)域得到穩(wěn)步發(fā)展。uCLinux 即是目前嵌入式linux 中最流行的一種,它是針對微控制領(lǐng)域而設(shè)計的Linux系統(tǒng),其最大特征就是沒有MMU(內(nèi)存管理單元模塊),適合嵌入式系統(tǒng)小型化應(yīng)用。
uCLinux支持多任務(wù),支持多種文件系統(tǒng),提供了對網(wǎng)絡(luò)的強大支持,具有完整的TCP/IP協(xié)議棧,以及標(biāo)準(zhǔn)豐富的API。由于它的很多核心代碼都為沒有被MMU的處理器重新編寫過,對標(biāo)準(zhǔn)Linux龐大的應(yīng)用程序庫和驅(qū)動程序庫作了刪改,所以它的內(nèi)核要比常規(guī)的Linux 內(nèi)核小很多;uCLinux包含Linux常用的API和小于512k的內(nèi)核及相關(guān)的工具,總代碼只有900k左右,但同時保留了常規(guī)Linux 操作系統(tǒng)絕大多數(shù)的優(yōu)點。2 基于ARM的硬件平臺
嵌入式領(lǐng)域32位處理器以ARM公司的ARM核最為流行,本文以Samsung公司的ARM7TDMI芯片S3C4510為處理器開發(fā)板為硬件平臺,開發(fā)板上與S3C4510相關(guān)的部分主要集成了如下器件:
(2M+512k)B 的Flash,其中AT29C010A為512B作為BootLoader,一片SST49VF160為1M×16bitFlash;
16MB 的DRAM,由兩片4M×16bits的HY57V641620提供 ; 16MB 的SRAM,由M-systems的新一代閃存盤DOC2000構(gòu)成; Ethernet接口; ARM JTAG 接口。
開發(fā)板上與S3C4510相關(guān)部分功能框圖如圖1 所示。
IO
UART
S3C4510 JTAG
Ethernet
FLASH
F
DOC2000
232串口
JTAG接口
LED
以太網(wǎng)接口
用戶自定義邏輯
DRAM uCLinux內(nèi)核移植
嵌入式 Linux 開發(fā)大致涉及三個層次:引導(dǎo)裝載程序、Linux 內(nèi)核和驅(qū)動及應(yīng)用程序。我們將討論涉及這三層的一些基本概念;深入了解引導(dǎo)裝載程序、內(nèi)核和文件系統(tǒng)是如何交互的。
引導(dǎo)程序BootLoader的主要作用包括初始化處理器;初始化必備的設(shè)備;下載系統(tǒng)映象;初始化操作系統(tǒng)系統(tǒng)并準(zhǔn)備執(zhí)行。
引導(dǎo)裝載程序有兩種方法:專用軟件和微小的引導(dǎo)代碼。專用軟件可以直接與遠程系統(tǒng)上的閃存設(shè)備進行交互并將引導(dǎo)裝載程序安裝在閃存的給定位置中。而某些種類的嵌入式設(shè)備具有微小的引導(dǎo)代碼:根據(jù)幾個字節(jié)的指令,它將初始化一些 DRAM 設(shè)置并啟用目標(biāo)上的一個串行(或者USB,或者以太網(wǎng))端口與主機程序通信;然后,主機程序或裝入程序可以使用這個連接將引導(dǎo)裝載程序傳送到目標(biāo)上,并將它寫入閃存。
嵌入式設(shè)備上一些流行的并可免費使用的 Linux 引導(dǎo)裝載程序有
Blob、Redboot 和 Bootldr。所有這些引導(dǎo)裝載程序都用于基于 ARM 設(shè)備上的 Linux,并需要Jflash-linux 工具用于安裝。一旦將引導(dǎo)裝載程序安裝到目標(biāo)的閃存中,它就會執(zhí)行我們上面提到的所有初始化工作。然后,它準(zhǔn)備接收來自主機的內(nèi)核和文件系統(tǒng)。一旦裝入了內(nèi)核,引導(dǎo)裝載程序就將控制轉(zhuǎn)給內(nèi)核。
Linux內(nèi)核移植首先需要配置內(nèi)核,可以用make menuconfig進行,根據(jù)板卡選擇必要的選項。主要包括系統(tǒng)類型選定(ARM system type),配置SDRAM/Flash地址;對塊設(shè)備、字符設(shè)備進行選擇和配置;配置文件系統(tǒng);是否配置圖形用戶界面(GUI)。修改內(nèi)核,我們選用上的uClinux-2.4.26-uc0.diff,已經(jīng)為S3C4510移植好的內(nèi)核,需要修改的地方很少。編譯內(nèi)核,首先要在宿主機(安裝有Linux)上建立交*編譯環(huán)境,下載arm-elf-tools安裝在Linux 宿主機上的/usr/local/bin 目錄下?,F(xiàn)在的BLOB 和將來的uClinux 都要在這個環(huán)境下編譯。開始編譯uClinux 編譯內(nèi)核:執(zhí)行命令:
make menuconfig 在出現(xiàn)的對話框選Samsung/4510B 和 uC-libc,然后退出。如果選擇uC-libc編譯出錯,可以改選uClibc!
make dep
make lib_only
make user_only
make romfs
make image 產(chǎn)生 romfs.o,這一步將會出現(xiàn)一些錯誤報告,可忽略繼續(xù)下面的命令
make 如果make無錯誤,在images的目錄下你會看到有 image.ram 和 image.rom 兩個二進制的內(nèi)核文件。即image.ram和image.rom。image.ram可以通過Bootloader下載到SDRAM中運行。image.rom可以寫入到Flash SST39VF160中直接運行。
down image.ram看看能不能運行
最后一步,uClinux調(diào)試完畢,通過jflashp將其寫入到Flash中:開發(fā)板斷電,把JTAG仿真器接到計算機的并口和板子的14PinJTAG插座上;接通5V電源;執(zhí)行 FlashP w-f image.rom,大約30分鐘以后燒寫完畢。撤掉JTAG仿真器以后再上電就應(yīng)該運行uClinux了。如果想把BootLoader寫回Flash,執(zhí)行FlashP w-f bios.img即可。4 uCLinux驅(qū)動程序開發(fā)
嵌入式系統(tǒng)通常有許多設(shè)備用于與用戶交互,象觸摸屏、小鍵盤、滾動輪、傳感器、RS232接口、LCD等等。除了這些設(shè)備外,還有許多其它專用設(shè)備,包括閃存、USB、GSM、GPS等。內(nèi)核通過所有這些設(shè)備各自的設(shè)備驅(qū)動程序來控制它們,包括 GUI 用戶應(yīng)用程序也通過訪問這些驅(qū)動程序來訪問設(shè)備。uClinux 的驅(qū)動程序庫不可能包括實際項目系統(tǒng)中所有外圍硬件的驅(qū)動,所以在應(yīng)用開發(fā)中,編寫驅(qū)動程序是一個重要步驟,驅(qū)動程序設(shè)計的好壞直接影響系統(tǒng)運行的穩(wěn)定性和運行效率。
在uClinux 內(nèi)核編寫驅(qū)動程序并不像其他操作系統(tǒng)那么復(fù)雜,實際上,所要做的只是為相應(yīng)的設(shè)備編寫幾個基本函數(shù)并向VFS(virtual file system)注冊即可。當(dāng)上層應(yīng)用要使用該設(shè)備時,VFS 就會調(diào)用相應(yīng)的設(shè)備函數(shù)。設(shè)備驅(qū)動程序通常可歸為以下3 類: a)塊設(shè)備(block),以塊為單位,允許隨機訪問,多用緩存技術(shù); b)字符設(shè)備(char),以字節(jié)為單位,只能按順序訪問,不用緩存; c)網(wǎng)絡(luò)接口(net)。
在本系統(tǒng)中,DOC作為塊設(shè)備可被模擬為IDE設(shè)備進行識別,系統(tǒng)用主設(shè)備號(MAJOR)和次設(shè)備號(MINOR)來唯一標(biāo)識一般設(shè)備;相同主設(shè)備號表示同一類設(shè)備,次設(shè)備號表示同類設(shè)備的個數(shù)。所有設(shè)備在適當(dāng)?shù)哪夸洠ㄍǔJ?dev目錄)下必須有相應(yīng)的文件,這樣字符設(shè)備和塊設(shè)備都可以通過文件操作的系統(tǒng)調(diào)用完成。不同的是,塊設(shè)備操作經(jīng)常和緩沖區(qū)聯(lián)系在一起。
字符設(shè)備的驅(qū)動程序通過在device_struct數(shù)據(jù)結(jié)構(gòu)的chrdevs向量中增加一項的方法來向內(nèi)核注冊自己。然后對這個設(shè)備的所有調(diào)用都用這個設(shè)備號來實現(xiàn);
塊設(shè)備和字符設(shè)備都需要定義功能函數(shù):對于每一個驅(qū)動函數(shù)來說,都有一些和此設(shè)備密切相關(guān)的功能函數(shù),就最常用的字符設(shè)備來說,都存在著諸如open()、read()、write()、ioctrol()這一類的操作。當(dāng)系統(tǒng)調(diào)用這些操作時,將自動的使用file-operations 結(jié)構(gòu)中對應(yīng)的函數(shù)來實現(xiàn)具體的操作;塊設(shè)備由于使用高速緩存,其驅(qū)動程序不需要保護自己的read()、write()和fsync()函數(shù),但必須使用自己的open()、release()和ioctl()函數(shù),函數(shù)原型為:
static int my_open(struct inode *inode,struct file *file);static int my_release(struct inode *inode,struct file *file);static int my_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long age);
塊設(shè)備驅(qū)動程序的請求處理函數(shù)一般通過中斷實現(xiàn)。驅(qū)動程序被調(diào)用時CPU由內(nèi)核程序控制,故不可搶占,驅(qū)動程序必須調(diào)用sleep_on()函數(shù)釋放對CPU的占用,在中斷服務(wù)子程序?qū)?shù)據(jù)復(fù)制到內(nèi)核內(nèi)核后,再發(fā)出wake_up()調(diào)用。
字符設(shè)備如LCD、USB應(yīng)用廣泛,下面以此為例詳細說明添加設(shè)備驅(qū)動的過程。設(shè)備名稱為scre,設(shè)備號為254。塊設(shè)備與網(wǎng)絡(luò)設(shè)備可以比照處理。
在目錄/linux_2.4/drives/char編寫源程序scre.c,編寫字符設(shè)備的處理函數(shù)。
1.設(shè)備驅(qū)動原文件必須包括這樣的一個函數(shù):
void scre_init(void){register(254, 'scre', &scre_fops)} 這個函數(shù)完成注冊.在linux-2.4.x/driver/mem.c 將會調(diào)用它。2.修改 linux-2.4.x/driver/char/Makefile 在適當(dāng)位置添加一行:obj_$(CONFIG_SCRE)+= scre.o 3.修改linux-2.4.x/driver/char/Config.in, 添加一行:
bool 'scre device' CONFIG_SCRE,便于在 make menuconfig 時選擇
4.修改linux-2.4.x/driver/char/mem.c,在適當(dāng)位置(你去找就會發(fā)現(xiàn),在文件頭部)添加:
#ifdef CONFIG_SCRE
extern void scre_init(void);
#endif
在chr_dev_init()函數(shù)添加:
#ifdef CONFIG_SCRE
scre_init();
#endif
5.修改vendor/Samsung/4510b/Makefile,建立設(shè)備節(jié)點;在12---35行間,DEVICE 部分添加如下內(nèi)容 :scre,c,254,0。
6.make menuconfig 選中scre device,編譯,下載;啟動后你會看到 /proc/devices 中字符設(shè)備多了一項 scre 254。
uClinux的Web技術(shù),主要有三個Web服務(wù)器:httpd,thttpd和boa。Httpd簡單,但只能Web瀏覽,不支持認證、CGI,thttpd和boa Web服務(wù)器功能較全;而boa Web代碼簡單、速度快,適合嵌入式應(yīng)用。Boa作為一個簡單的http服務(wù)器,與傳統(tǒng)服務(wù)器的主要區(qū)別是它是單進程的。boa在uClinux下的實現(xiàn)需要對boa.conf和mime.types作一些配置和修改,并且需在命令行指定配置文件所在目錄。配置完成后需要重新編譯內(nèi)核,并選中boa選項,將編譯好的內(nèi)核下載到開發(fā)板,啟動uClinux,完成IP設(shè)置,啟動boa Web后便可通過IE訪問網(wǎng)頁了。5 結(jié)語
uClinux在嵌入式領(lǐng)域憑借其穩(wěn)定、良好的移植性,優(yōu)秀的網(wǎng)絡(luò)功能,靈活完備的文件系統(tǒng)以及眾多的技術(shù)支持等優(yōu)點得到廣泛應(yīng)用,并將有更廣闊的應(yīng)用前景。本文針對uClinux的開發(fā)應(yīng)用步驟作了大致的闡述,對ARM應(yīng)用平臺上的系統(tǒng)移植和應(yīng)用開發(fā)作了分析,具有一定的指導(dǎo)意義。
參考文獻
[1].劉安昱 溫曉輝 劉志紅,基于S3C44B0X的uClinux的移植,《單片機與嵌入式系統(tǒng)應(yīng)用》[J]2003.12.[2].徐雪松等,基于嵌入式Linux的DiskOnChip設(shè)備的驅(qū)動開發(fā)實現(xiàn),《電子設(shè)計應(yīng)用》[J]2003.12 [3].Linux on module project-Lom ARM7 ,.[4].朱珂等譯,《Linux編程白皮書》[M],機械工業(yè)出版社,2000.[5].趙炯,《Linux內(nèi)核完全注釋(內(nèi)核版本0.11)》[M],2003
第四篇:淺談基于嵌入式系統(tǒng)在教學(xué)中的應(yīng)用論文
論文關(guān)鍵詞:嵌入式系統(tǒng) Proteus ARM 應(yīng)用
論文摘要:本文指出在嵌入式系統(tǒng)課程的各教學(xué)環(huán)節(jié)引入Proteus、ARM(重點介紹Proteus軟件)軟件,通過動態(tài)仿真模型的設(shè)計,能用到畢業(yè)設(shè)計以及創(chuàng)新設(shè)計當(dāng)中。
1、嵌入式系統(tǒng)的概述
(1)從技術(shù)的角度定義:嵌入式系統(tǒng)是以應(yīng)用為中心,基礎(chǔ)是計算機,能夠適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、及功耗嚴(yán)格要求的專用計算機。
(2)從系統(tǒng)的角度定義:嵌入式系統(tǒng)是能夠完成復(fù)雜功能的軟件和硬件的組合,并使其緊密粘合在一起的計算機系統(tǒng)?!扒度胧健狈从吵龅倪@些系統(tǒng)是更大系統(tǒng)中的一個完整部分,稱為嵌入式系統(tǒng)。
2、Proteus、ARM軟件介紹
Proteus是由英國Labcenter公司開發(fā)的嵌入式系統(tǒng)仿真及開發(fā)平臺,該軟件具有以下特點:
(1)能進行智能原理布圖;進行單片機軟件調(diào)試和單片機與外圍電路的協(xié)同仿真;滿足單片機軟件仿真系統(tǒng)的標(biāo)準(zhǔn)。
(2)支持常見的單片機類型和飛利浦公司ARM7(LPC系列)處理器及常見的外圍器件如8255,ADC0809。
(3)可以與Keil Version3,ADS1兩個集成開發(fā)環(huán)境結(jié)合,把用匯編和C語言編寫的程序編譯后,進行軟、硬件結(jié)合的系統(tǒng)仿真。
3、Proteus軟件的應(yīng)用
3.1 Proteus軟件在教學(xué)中的應(yīng)用
在教學(xué)的過程中,老師可以將Proteus和Keil 建立的虛擬實驗平臺搬到課堂上,能夠?qū)嵺`教學(xué)和理論教學(xué)融為一體,從而讓教學(xué)的效果得到提高。下面筆者引進一個實際的課堂教學(xué)實例。在講到外部中斷處理過程這一章節(jié)時,我們可以將Proteus和Keil進行聯(lián)調(diào),然后通過仿真處理的步驟,可將單片機處理中斷的軟件執(zhí)行過程以及單片機內(nèi)部資源變化的情況以一種直觀地感受呈現(xiàn)給學(xué)生,從而能夠達到單純的理論教學(xué)難以達到的效果。
在運行Protues軟件的狀態(tài)下,按住Proteus中的電路閉合鍵,P3.2引腳會有一個下跳沿,PC= 0x0003H,指向AJMP INT0的轉(zhuǎn)移命令,堆棧的指針SP= 0.9H,數(shù)據(jù)存儲器的0.8H和0.9H單元存放著0.1H和0.5H,即該處存放著下一條指令的地址。因此,學(xué)生能夠迅速的知道,當(dāng)外部有中斷地請求時,程序的自動存儲功能可以保存斷點的地址,同時程序?qū)D(zhuǎn)到中斷服務(wù)程序的入口地址,因為中斷請求是由外部中斷0產(chǎn)生的,因此程序就會轉(zhuǎn)到外部中斷0的入口地址0003H。通過外部中斷執(zhí)行的例子我們可以看出,在課堂教學(xué)上使用Protues和Keil 聯(lián)調(diào)建立的實驗平臺,我們可以將許多抽象概念直觀的介紹給學(xué)生,使學(xué)生不僅能觀察到軟件執(zhí)行時單片機內(nèi)部的I/ O口和存儲器的變化,還可以觀察到軟件程序和外圍電路之間的互動過程。
3.2 Proteus軟件的應(yīng)用
目前所擁有的單片機實驗教學(xué)包括兩個關(guān)鍵的環(huán)節(jié),即課內(nèi)的實驗以及課程的設(shè)計。所有的實驗操作步驟基本上都是在實驗箱上完成的。由于受硬件實驗箱結(jié)構(gòu)以及資源的限制,學(xué)生在做實驗的時候不能將所學(xué)的知識和軟件充分的融會貫通。所以當(dāng)我們的學(xué)生進行自主設(shè)計的時候,很多的學(xué)生幾乎無法完成綜合性的實驗。假設(shè)采用了Proteus軟件的仿真實驗,就可以彌補硬件實驗?zāi)芰Φ牟蛔?。基于Proteus軟件的實驗可以分為以下3個階段。
(1)驗證階段。此階段的主要任務(wù)是讓學(xué)生熟悉Proteus與Keil軟件的運行環(huán)境,使學(xué)生對單片機虛擬系統(tǒng)的仿真有自身的認識。實驗指導(dǎo)方面的教材只需要列出實驗的任務(wù)和要求、Proteus軟件的實驗原理圖、操作的步驟、流程以及和程序相關(guān)的源代碼等。學(xué)生就可可自行根據(jù)實驗步驟或?qū)嶒灢僮鞯玫戒浵襁M行操作、調(diào)試,以及觀察程序的運行結(jié)果。
(2)程序設(shè)計階段。這個階段主要是培養(yǎng)學(xué)生用Proteus繪制系統(tǒng)原理圖,以及使用Keil軟件進行源程序設(shè)計的能力,學(xué)生可以根據(jù)實驗的原理圖用Proteus繪制硬件電路圖,按照實驗的要求完成程序的設(shè)計,在Keil的環(huán)境下編寫出源代碼,調(diào)試成功后,加載程序到Proteus硬件圖仿真。
(3)綜合學(xué)習(xí)階段。此階段的主要目的是激發(fā)學(xué)生學(xué)習(xí)興趣,提高學(xué)生的主觀能動性、以及培養(yǎng)學(xué)生的創(chuàng)新能力。學(xué)生自主的根據(jù)實驗的任務(wù)和要求設(shè)計出硬件額電路(包括CPU型號、元器件及參數(shù)的設(shè)置等)并繪制出Proteus的硬件原理圖;根據(jù)硬件的功能模塊對軟件進行設(shè)計。完成對軟硬件設(shè)計之后,需對兩者進行聯(lián)調(diào),充分利用Proteus與Keil軟件間的聯(lián)合仿真的功能,及時的發(fā)現(xiàn)并改正硬件電路以及程序源代碼的錯誤。系統(tǒng)仿真成功后,再進行實物的制作。在對課程的設(shè)計環(huán)節(jié)中,需要學(xué)生在Proteus環(huán)境下繪制出硬件的電路圖,在Keil軟件中編寫出設(shè)計程序的源代碼,并且在設(shè)計硬件電路時后盡可能的考慮到實驗箱的有限資源,便于在Keil中編寫的程序能夠更好的被移植到實驗箱上。學(xué)生可以針對不同的應(yīng)用類型,選擇最適合的單片機,而不是僅僅局限于課堂上常講解到的單片機。學(xué)生也可在聯(lián)合仿真成功之后,再去進行電路的焊接、軟件系統(tǒng)的調(diào)試以及程序的固化等,可以避免因設(shè)計方案的不正確所造成的不必要的浪費。
4、結(jié)語
Proteus和ARM的嵌入式軟件在教學(xué)中的運用,能充分的利用機房的現(xiàn)有設(shè)備,減少了實驗設(shè)備的硬件維護又與實際的工程系統(tǒng)接近,拉近學(xué)習(xí)和就業(yè)之間的距離。實踐證明,這種嵌入式的教學(xué)方法不但能降低成本,經(jīng)濟優(yōu)勢明顯,而且還具有較高的推廣價值。
參考文獻
[1]萬軍,馬正華.嵌入式系統(tǒng)及應(yīng)用課程實踐教學(xué)的研究[J].中國現(xiàn)代教育裝備,2009(15):7779.[2]李芳,李家慶.基于Proteus+Keil的單片機實驗仿真平臺[J].中國教育技術(shù)裝備,2009(4):78.[3]陳燕,李娜娜.Proteus和Keil在單片機教學(xué)中的應(yīng)用[J].中國科技信息,2009(20):194195.[4]王瑋,曹會寧.Proteus仿真軟件在單片機一體化教學(xué)中的應(yīng)用[J].機電產(chǎn)品開發(fā)與創(chuàng)新,2009,22(5)
第五篇:在平凡中耕耘自己
在平凡中耕耘自己
各位領(lǐng)導(dǎo)、各位同事,大家好!
很高興能有這樣的機會和大家在一起暢談工作中的一些感想和體會,我匯報的題目是:在平凡中耕耘自己。
我叫xxx,是鐵通xx分公司客服中心的一名受理員,自2003年從事該項工作。剛到客服中心工作時,我認為做好客服工作是件很簡單的事情,“不就是接接電話嘛,有什么大不了的”。但是,隨著工作的不斷深入,在分公司對客服工作的高標(biāo)準(zhǔn)、嚴(yán)要求下,面對千千萬萬不同用戶各種不同的問題,我深深地感覺到自己原來的認識是多么錯誤和幼稚。10050客戶服務(wù)中心并不只是接電話、聽聽用戶投訴那么簡單,它是體現(xiàn)鐵通形象和聲譽的窗口,是塑造鐵通品牌、贏得更多市場的平臺,也是解答和解決客戶每一個問題的服務(wù)站。肩負著如此重要的責(zé)任和使命,我清楚地知道,作為一名客服受理員,不但要有良好的職業(yè)道德,還必須具備熟練的服務(wù)技能。
為了達到這個目的,從那時起,我就暗下決心,要從工作中的每件小事做起,把業(yè)務(wù)做到最好最精,贏得客戶的信任。為此,我積極參加崗前學(xué)習(xí),認真鉆研《中華人民共和國電信條例》、《中華人民共和國消費者權(quán)益保護法》、《鐵通客戶服務(wù)行為規(guī)范》、《用戶申訴管理辦法》、《話費爭議處理辦法》等服務(wù)條例、流程和標(biāo)準(zhǔn);自覺參加分公司舉辦的《商務(wù)禮儀》、《鐵通各項業(yè)務(wù)資費標(biāo)準(zhǔn)、使用方法》、《電腦和互聯(lián)網(wǎng)基礎(chǔ)知識》、《簡單故障處理》等培訓(xùn)班。并虛心向有服務(wù)經(jīng)驗的同志學(xué)習(xí),不斷提高自己的服務(wù)水平,立志達到“一口清”、“問不倒、考不倒”。近兩年來,通過學(xué)習(xí)和在工作中的實踐,我寫下了566頁近10萬字的學(xué)習(xí)筆記,并總結(jié)出了客服工作的 “四多”、“十要”?!八亩唷本褪牵骸坝脩舻男枨蠖鄦栆痪?、用戶的難題多想一點、用戶的不會多說一次,用戶的不快多管一事”;“十要”就是:“一要嘴巴甜、二要微笑誠、三要動作輕、四要脾氣小、五要肚量大、六要少講客觀理由、七要行動快、八要效率高、九要觀察勤、十要腦筋活”。
今年六月的一天下午,一位用戶投訴說他們?nèi)宜脑律涎统鰢糜?,直到前幾天才回來,現(xiàn)在來交話費時,發(fā)現(xiàn)五月份竟然有三十多元的話費,認為鐵通亂收費,拒絕交費,同時揚言要到法院去控告鐵通。我接到投訴后馬上聯(lián)系相關(guān)部門將用戶有疑問的話費清單打印出來,通過一一撥打清單上被叫方電話詢問對方是否認識這位用戶,但撥完了所有的電話,對方都說不認識。問題到這里一下子就陷入了僵局,我也覺得很迷惑:難道真的是被人盜打了?我立刻通知分局人員上門檢查線路,結(jié)果沒有問題,話單也未發(fā)現(xiàn)異常。我清楚,如果這件事情處理不好,勢必會影響到鐵通的信譽和在用戶中的形象,無論如何我是絕對不能放棄的。于是,我決定再從被叫方進行突破,再次給清單上的號碼打電話,在了解到這些被叫方都是年輕人時,就試著詢問有沒有認識與用戶同姓的人或者記得打電話的人,結(jié)果他們都一致說出一個人的名字。經(jīng)過近5天的努力,當(dāng)我把這個意外得來的線索向用戶反饋時,用戶說這個人是他們的侄子。后來經(jīng)過核實,確實是用戶的侄子在夫婦倆出國期間過來幫用戶看房子時使用了電話。了解情況后,用戶主動打來電話道歉并深有體會地說:“你們的服務(wù)真是太好了,沒想到這么快就把問題查清楚了,鐵通真的名不虛傳”。對用戶的“四多”、“十要”,使我感受到做一個鐵通人的自豪與驕傲。
把用戶作為鏡子可以正視自己,把意見作為鞭了可以驅(qū)動自己,只有用戶滿意了,我們的工作才能算完成。兩年多的工作,使我深深地愛上了客服受理員這一崗位,并在服務(wù)用戶、塑造鐵通形象中,實現(xiàn)了人生價值的提高。我知道,我的成長離不開用戶,因此,我要在平凡的客服崗位上,耕耘自己,回報用戶。為了達到這個目的,我一直把“用戶的需要作為我的工作方向,用戶的滿意作為我的工作追求”,并在日常的服務(wù)中做到“三個堅持”:堅持把感情融入服務(wù);堅持“多問一句,多想一點,多說一句,多管一事”;堅持“服務(wù)上講求優(yōu)質(zhì),責(zé)任上講求盡職”,把為客戶服務(wù)作為自己工作中的最大快樂,以真情打動用戶,以親情感動用戶,通過服務(wù)實現(xiàn)自己的人生價值。
2005年2月10日晚上九點多,那天正好是大年初二,家人團圓,合家歡聚的時候,一位xx寬帶用戶來電反映寬帶一天都上不了網(wǎng),覺得很氣憤,要求退款,語氣非常強硬。接到申訴后,我先是好言安撫用戶,然后慢慢向用戶了解情況,但用戶態(tài)度的非常強硬,什么也不愿意說,只是要求退款。我再次向用戶表示歉意,同時請求用戶再給我一次為他服務(wù)的機會,并保證一定能處理好這件事。經(jīng)過反復(fù)做用戶的思想工作,用戶最后是半信半疑答應(yīng)了。受理完這件投訴之后,我馬上與分局長聯(lián)系,將用戶的情況詳細向分局長說明,并要求分局連夜派人到用戶家去處理。維修人員經(jīng)過仔細檢查后確信是外線問題,但當(dāng)時天又黑又冷,而且又是大過年的,維修人員要求第二天再去處理?!翱蛻魡栴}無小事”!我清楚,只有通過貼心的服務(wù)才可能重新贏得用戶的心。于是,我耐心地說服了分局維修人員克服重重困難為用戶更換新線后解決了故障問題。上網(wǎng)問題解決后,用戶主動給我打來了電話:“你們的服務(wù)贏得了我的信任,選擇鐵通是正確的,我決定不退了!”
一分耕耘一分收獲,我的辛苦付出不僅為鐵通、為xx分公司樹立了良好的形象,也獲得了用戶的肯定,成為用戶信任的朋友。去年大年三十的晚上,剛好輪到我值夜班,聽著外面的爆竹聲聲,想到不能陪伴父母吃年夜飯時,心里不禁有些傷感,就在這時,我的同事將一個話筒遞給了我,說有人找。我一聽是一個男人的聲音,他說:x x號小姐,你好!我是你們的用戶,多次得到了你的良好服務(wù),我一直銘記在心,今天打電話來也沒什么事,只是想和你說一聲,你們辛苦了,大過年的還要為我們這些老百姓服務(wù),真是太感謝你們了,祝你們新年快樂!說實話,那一刻,我真的好感動,我覺得自己的辛苦沒有白費,用戶其實是理解我們的,我們不要把他們反映問題、提出建議看成是給我們找麻煩。正是這些用戶的問題、建議,使我們看到了自己缺點和工作中的不足,正是他們的意見,使我們在提高服務(wù)質(zhì)量、參與市場競爭中找到了努力的方向,也正是他們的“不滿意”,促使我們不斷改善服務(wù)品質(zhì),在激烈的市場競爭中站穩(wěn)腳跟!
一分汗水,一分榮耀,我的努力不僅得到了用戶的肯定,也得到了分公司的認可,在xx分公司開展的13次月度、客服考試中,我有11次獲得了第一名,2次獲得第2名,多次被評為分公司的“學(xué)習(xí)標(biāo)兵”。在8月11日鐵通總部在xx舉行的由xx個省xx名選手參加的比賽中,我也是憑著自己的長期積累,一路過關(guān)斬將,最終奪得了個人和團體第二名的優(yōu)異成績,為xx鐵通贏得了榮譽。
此文共有2頁12