(1)搭建VxWorks嵌入式開(kāi)發(fā)環(huán)境;
(2)簡(jiǎn)要介紹VxWorks的基本組成,內(nèi)核的基本結(jié)構(gòu);
(3)概述VxWorks板級(jí)支持包(BSP)的概念及VxWorks的啟動(dòng)過(guò)程;
(4)介紹VxWorks設(shè)備驅(qū)動(dòng)的架構(gòu)及編寫(xiě)方法;
(5)指明VxWorks應(yīng)用開(kāi)發(fā)的思路,任務(wù)調(diào)度及任務(wù)同步、中斷與任務(wù)的同步機(jī)制。
以上各章中將貫穿著許多實(shí)例,由于本文定位于入門(mén)級(jí)教程,所以文中的實(shí)例都將十分簡(jiǎn)單。下面我們進(jìn)入第一章內(nèi)容的講解。
如圖1,嵌入式系統(tǒng)的調(diào)試方法一般為通過(guò)PC(宿主機(jī))上的集成開(kāi)發(fā)環(huán)境交叉編譯針對(duì)特定電路板(目標(biāo)機(jī))的程序,然后將程序通過(guò)目標(biāo)板的JTAG、串口或網(wǎng)口等途徑下載到目標(biāo)板上運(yùn)行。因此,為了構(gòu)造一個(gè)嵌入式系統(tǒng)的學(xué)習(xí)環(huán)境,擁有一塊包含CPU、存儲(chǔ)器及I/O電路(構(gòu)造計(jì)算機(jī)系統(tǒng))的目標(biāo)電路板往往是必要的。雖然許多集成開(kāi)發(fā)環(huán)境附帶模擬軟件,但僅限于指令集的模擬,均無(wú)法模擬物理的目標(biāo)機(jī)硬件平臺(tái),因而在其上只能進(jìn)行應(yīng)用程序的象征性模擬開(kāi)發(fā)。但是,并非所有人都能擁有一塊物理的電路板。在這種情況下,我們?nèi)绾螛?gòu)造一個(gè)模擬的開(kāi)發(fā)環(huán)境,其學(xué)習(xí)效果就如同擁有完全真實(shí)的電路板一樣呢?本文試圖解答此問(wèn)題,主體內(nèi)容包括四個(gè)方面:
(1) 利用VMware等軟件模擬真實(shí)的目標(biāo)機(jī);
(2) 構(gòu)建VMware虛擬PC上VxWorks BSP,建立Bootrom和OS映像;
(3) 修改Tornado相關(guān)設(shè)置,連接宿主機(jī)與目標(biāo)機(jī),建立調(diào)試通道;
(4) 寫(xiě)一個(gè)簡(jiǎn)單的應(yīng)用程序并下載到目標(biāo)系統(tǒng)運(yùn)行。
圖1 嵌入式系統(tǒng)的調(diào)試
本章工作的最終目標(biāo)為:
(1)VxWorks在VMware啟動(dòng)成功并順利運(yùn)行,如圖2;
圖2 在VMware中運(yùn)行的VxWorks
(2)可在Tornado上針對(duì)目標(biāo)板編譯程序并進(jìn)行調(diào)試,如圖3。
圖3 與目標(biāo)機(jī)建立調(diào)試通道的Tornado
1. 模擬目標(biāo)機(jī)
PC也具有目標(biāo)機(jī)的所有特點(diǎn),實(shí)際上,我們可以把PC作為嵌入式系統(tǒng)的目標(biāo)機(jī),從而構(gòu)造如圖4所示的開(kāi)發(fā)模型:
圖4 PC作為目標(biāo)機(jī)
很遺憾,這種方法實(shí)際上非常麻煩,同時(shí)開(kāi)動(dòng)兩臺(tái)PC進(jìn)行調(diào)試將使你和你的室友飽受折磨,既然他如此地?zé)崆杏谟螒蚝蜕暇W(wǎng)。因此,我們可以借助VMware來(lái)在本機(jī)上虛擬出另一PC。
VMware的確是天才的作品!在同一PC上,利用VMware幾乎可以安裝所有的操作系統(tǒng),而且操作系統(tǒng)之間的切換不需要重新啟動(dòng)電腦。VM的意義是Virtual Machine,即虛擬出一個(gè)邏輯的電腦,它可以提供基于Intel CPU的虛擬PC系統(tǒng)環(huán)境,包括CPU、內(nèi)存、BIOS、硬盤(pán)和其他外圍硬件設(shè)備。
下面我們講解用VMware來(lái)建立一臺(tái)虛擬PC的步驟:
(1)下載并安裝VMware;
(2)使用VMware向?qū)Ы⒁粋(gè)針對(duì)VxWorks的虛擬機(jī);
此步驟中注意在操作系統(tǒng)中選擇“other”,如圖5:
由于目標(biāo)機(jī)最終通過(guò)軟盤(pán)啟動(dòng),因此要求你的電腦具有軟驅(qū)。很遺憾,當(dāng)年日常使用的軟盤(pán)如今成了古董,很少再有電腦配備軟驅(qū)。因此,我們?cè)賮?lái)制造一個(gè)假冒偽劣產(chǎn)品,虛擬一個(gè)軟驅(qū)。又一個(gè)天才的工具軟件RamDiskNT為我們提供了這一便利,圖6演示了用RamDiskNT虛擬一個(gè)1.44M軟盤(pán)的方法。
]]>在這里我們撇開(kāi)其商業(yè)性與否不談,但從利于我們學(xué)習(xí)的角度出發(fā),探討一下linux在vxworks開(kāi)發(fā)學(xué)習(xí)過(guò)程中的作用,當(dāng)然如果你非常精通linux對(duì)學(xué)習(xí)vxworks一定會(huì)有很大的幫助.當(dāng)然你也可以完全撇開(kāi)linux.但在這里,我們只是尋求一種學(xué)習(xí)vxworks的相對(duì)科學(xué)的途徑,怎樣在有限的時(shí)間內(nèi)把vxworks的學(xué)習(xí)效率提到最高?怎樣合理的把嵌入式開(kāi)發(fā)商提供的linux資源運(yùn)用到我們的vxworks開(kāi)發(fā)中?是否有必要抽出時(shí)間去學(xué)習(xí)一下linux?研究到什么程度?這些問(wèn)題對(duì)于做底層開(kāi)發(fā)的廣大嵌入式愛(ài)好者尤為突出.
對(duì)于這些問(wèn)題,希望大家從自己的開(kāi)發(fā)經(jīng)歷談?wù)勛约嚎捶?在這里只要你有過(guò)嵌入式開(kāi)發(fā)的經(jīng)驗(yàn),你就可以暢所欲言,我們的目的是取長(zhǎng)補(bǔ)短,相互提高!
]]>1.首先從Tornado中建立一個(gè)新的Project可以看出,有兩種映像可以選擇:Bootable和Downloadable,在開(kāi)發(fā)初期通常是先建立一個(gè)不包含應(yīng)用層模塊的bootable project,編譯出一個(gè)包含基本組件的VxWorks映像,將系統(tǒng)啟動(dòng)起來(lái);其實(shí)這一步編譯出的就是包含基本組建的一個(gè)VxWorks內(nèi)核,并沒(méi)有我們的應(yīng)用代碼。
2.在和上面的Bootable工程相同的Workspace中建立一個(gè)Downloadable project,在這個(gè)工程中編寫(xiě)、編譯應(yīng)用層的模塊,然后動(dòng)態(tài)下載到目標(biāo)機(jī)中去調(diào)試;
3.應(yīng)用層模塊調(diào)試完畢可以發(fā)布之后,可以將應(yīng)用層模塊和第一步中的Bootable的VxWorks映像編譯到一起;這時(shí)候可以向Boottable Project中加入應(yīng)用層代碼文件,加入方式是Add from project,然后把包含應(yīng)用層代碼的Downloadable project中的文件導(dǎo)入Bootable project,重新編譯Bootable Project得到的就是包含應(yīng)用層的可啟動(dòng)的VxWorks影像。
4.把最終的映象放到軟盤(pán)、硬盤(pán)或者Ftp服務(wù)器相應(yīng)的目錄下,這需要根據(jù)BootRom中bootline的啟動(dòng)方式來(lái)決定。
]]>
目前,針對(duì)有內(nèi)存管理單元MMU(Memory Management Unit)的處理器設(shè)計(jì)的一些桌面操作系統(tǒng),如Windows、Linux,使用了虛擬存儲(chǔ)器的概念。虛擬內(nèi)存地址被送到MMU映射為物理地址,實(shí)際存儲(chǔ)器被分割為相同大小的頁(yè)面,采用分頁(yè)的方式載人進(jìn)程。
大多數(shù)嵌人式系統(tǒng)針對(duì)沒(méi)有MMU的處理器設(shè)計(jì),不能使用處理器的虛擬內(nèi)存管理技術(shù),而采用實(shí)存儲(chǔ)器管理策略。因而對(duì)于內(nèi)存的訪問(wèn)是直接的,它對(duì)地址的訪問(wèn)不需要經(jīng)過(guò)MMU,而是直接送到地址線上輸出,所有程序中訪問(wèn)的地址都是實(shí)際物理地址;而且,大多數(shù)嵌人式操作系統(tǒng)對(duì)內(nèi)存空間沒(méi)有保護(hù),各個(gè)進(jìn)程實(shí)際上共享一個(gè)運(yùn)行空間。一個(gè)進(jìn)程在執(zhí)行前,系統(tǒng)必須為它分配足夠的連續(xù)地址空間,然后全部載人主存儲(chǔ)器的連續(xù)空間。
由此可見(jiàn),嵌人式系統(tǒng)的開(kāi)發(fā)人員不得不參與系統(tǒng)的內(nèi)存管理。從編譯內(nèi)核開(kāi)始,開(kāi)發(fā)人員必須告訴系統(tǒng)這塊開(kāi)發(fā)板到底擁有多少內(nèi)存;在開(kāi)發(fā)應(yīng)用程序時(shí),必須考慮內(nèi)存的分配情況并關(guān)注應(yīng)用程序需要運(yùn)行空間的大小。另外, 由于采用實(shí)存儲(chǔ)器管理策略,用戶(hù)程序同內(nèi)核以及其他用戶(hù)程序在一個(gè)地址空間,程序開(kāi)發(fā)時(shí)要保證不侵犯其它程序的地址空間,以使得程序不至于破壞系統(tǒng)的正常工作,或?qū)е缕渌绦虻倪\(yùn)行異常;因而,嵌人式系統(tǒng)的開(kāi)發(fā)人員對(duì)軟件中的一些內(nèi)存操作要格外小心。
1 嵌入式系統(tǒng)中對(duì)內(nèi)存分配的要求
嵌人式系統(tǒng)開(kāi)發(fā)對(duì)內(nèi)存分配有很高的要求:
① 內(nèi)存能快速申請(qǐng)和釋放,即快速性。嵌人式系統(tǒng)中對(duì)實(shí)時(shí)性的保證,要求內(nèi)存分配過(guò)程要盡可能地快;
② 內(nèi)存分配保持原子性,即可靠性。也就是內(nèi)存分配的請(qǐng)求必須得到滿足,如果分配失敗可能會(huì)帶來(lái)災(zāi)難性的后果;
③ 內(nèi)存應(yīng)該各盡其用,即高效性。內(nèi)存分配要盡可能地少浪費(fèi)。不可能為了保證滿足所有的內(nèi)存分配請(qǐng)求而將內(nèi)存配置得無(wú)限大。
2 VxWorks內(nèi)存管理機(jī)制
VxWorks采用用戶(hù)程序、內(nèi)核處于同一個(gè)地址空間的內(nèi)存管理策略,軟件開(kāi)發(fā)人員在開(kāi)發(fā)程序時(shí)必須保證不侵犯其他程序和內(nèi)核的地址空間,以免破壞系統(tǒng)的正常工作或?qū)е缕渌绦虍惓_\(yùn)行。內(nèi)核負(fù)責(zé)為程序分配內(nèi)存、動(dòng)態(tài)分配內(nèi)存和回收內(nèi)存。VxWorks為用戶(hù)提供兩種內(nèi)存區(qū)域:內(nèi)存域region和內(nèi)存分區(qū)partitionregion是可變長(zhǎng)的內(nèi)存區(qū),可以從創(chuàng)建的region中在分配段segment,region的特點(diǎn)是容易產(chǎn)生碎片,但靈活、不浪費(fèi);partition是定長(zhǎng)的內(nèi)存區(qū),用戶(hù)可以從創(chuàng)建的partition中分配內(nèi)存塊或在某個(gè)內(nèi)存分區(qū)中再創(chuàng)建一個(gè)內(nèi)存分區(qū),partition的特點(diǎn)是無(wú)碎片、效率高,但浪費(fèi)。通常,VxWorks內(nèi)核和應(yīng)用程序?qū)?nèi)存的操作是基于內(nèi)存分區(qū)進(jìn)行的。內(nèi)存池是一塊連續(xù)的內(nèi)存區(qū)域,包含一個(gè)或多個(gè)內(nèi)存塊。內(nèi)存分區(qū)包含分區(qū)自身的描述信息(一個(gè)結(jié)構(gòu)體)和一個(gè)或多個(gè)內(nèi)存池,描述信息保存在系統(tǒng)內(nèi)存分區(qū)中,內(nèi)存池是該分區(qū)實(shí)際擁有的內(nèi)存空間。內(nèi)存分區(qū)剛創(chuàng)建完畢時(shí),只有一個(gè)內(nèi)存池,以后用戶(hù)程序可往該分區(qū)中添加內(nèi)存池。內(nèi)存池之間的地址不一
定連續(xù),VxWorks在啟動(dòng)過(guò)程中會(huì)創(chuàng)建一個(gè)包含系統(tǒng)內(nèi)存池的系統(tǒng)內(nèi)存分區(qū),如圖1所示。VxWorks的內(nèi)存管理采用自由鏈管理內(nèi)存空閑塊。用首先適配算法動(dòng)態(tài)分配內(nèi)存,內(nèi)存釋放時(shí),采用上下空閑區(qū)融合的方法,即把相鄰的空閑內(nèi)存塊合并,沒(méi)有清理碎片的功能。
3 對(duì)VxWorks內(nèi)存管理的改進(jìn)
改進(jìn)的緩沖區(qū)管理模塊的作用在于加強(qiáng)VxWorks實(shí)時(shí)操作系統(tǒng)對(duì)內(nèi)存的管理,并為上層應(yīng)用程序提供所需內(nèi)存申請(qǐng)和釋放工作。因此本改進(jìn)模塊位于VxWorks實(shí)時(shí)操作系統(tǒng)模塊和應(yīng)用程序模塊之間。
CPU實(shí)際物理內(nèi)存在bootRoom啟動(dòng)時(shí)劃分為兩部分:VxWorks內(nèi)核操作系統(tǒng)內(nèi)存和保留給用戶(hù)管理的內(nèi)存。為了便于管理,對(duì)為用戶(hù)保留內(nèi)存作進(jìn)一步劃分,使用memPartCreate函數(shù)創(chuàng)建兩個(gè)內(nèi)存分區(qū):一個(gè)分區(qū)用來(lái)生成預(yù)先申請(qǐng)好固定大小緩沖池;另一分區(qū)以堆方式向上層提供的緩沖池。這樣就把物理內(nèi)存劃分成3個(gè)部分:
(1)Paal:VxWorks系統(tǒng)內(nèi)存,在物理低端;
(2)Part2:預(yù)先申請(qǐng)好的固定大小的緩沖池,每種固定長(zhǎng)度的內(nèi)存緩沖區(qū)形成一個(gè)隊(duì)列;
(3)Pan3:以堆方式提供給上層應(yīng)用程序的緩沖池;
內(nèi)存劃分如圖2所示。
3.1 不同大小固定長(zhǎng)度緩沖區(qū)管理
為了避免內(nèi)存碎片,我們采用預(yù)先分配內(nèi)存塊的方式實(shí)現(xiàn)對(duì)堆內(nèi)存分區(qū)進(jìn)行管理:分區(qū)內(nèi)的所有內(nèi)存隊(duì)列,每個(gè)隊(duì)列管理一定數(shù)量大小相同且已經(jīng)申請(qǐng)好的內(nèi)存塊,這些內(nèi)存塊永久占用。然后對(duì)每個(gè)內(nèi)存隊(duì)列管理數(shù)據(jù)結(jié)構(gòu)進(jìn)行維護(hù)。上層應(yīng)用程序調(diào)用模塊接口函數(shù)從緩沖池中
申請(qǐng)和釋放。每塊緩沖區(qū)的用戶(hù)區(qū)填充默認(rèn)內(nèi)容。
3.2 堆方式內(nèi)存的管理
對(duì)于堆內(nèi)存的使用,我們對(duì)VxWorks的兩個(gè)內(nèi)核函數(shù)memPartAlloc()和memPartFree()進(jìn)行了封裝,并在調(diào)試版本中加入信息,如圖3所示。
圖中:BLOCK- HDR表示內(nèi)存塊頭,OAHEAD表示塊附加信息頭,pbuf指向?qū)嶋H的堆空間,size為堆的大小。
3.3 快速內(nèi)存分配管理
對(duì)于協(xié)議等存在大量、快速地申請(qǐng)/釋放內(nèi)存的操作而言,在系統(tǒng)運(yùn)行一段時(shí)間后內(nèi)存都變成了碎片,再申請(qǐng)大塊內(nèi)存時(shí)容易失敗。提供一種快速的內(nèi)存申請(qǐng)/釋放的方式,并且最大程度地減少系統(tǒng)的內(nèi)存碎片。提供64/128/……/524 288大小的內(nèi)存使用快速內(nèi)存分配管理機(jī)制,則在一個(gè)大的內(nèi)存塊內(nèi)部進(jìn)行內(nèi)存使用,申請(qǐng)/釋放時(shí)不涉及到系統(tǒng)對(duì)內(nèi)存的拆鏈/建鏈過(guò)程,比較快速,并且對(duì)釋放的內(nèi)存進(jìn)行合并,保證系統(tǒng)有盡可能多的大塊內(nèi)存。如圖4所示。
4 小結(jié)
許多嵌入式應(yīng)用開(kāi)發(fā)在實(shí)時(shí)操作系統(tǒng)提供的malloc()和free()函數(shù)的基礎(chǔ)上編寫(xiě)自己的內(nèi)存管理方案。編寫(xiě)這樣的內(nèi)存管理方案,一方面可以減少對(duì)malloc()和free()函數(shù)的依賴(lài),統(tǒng)一內(nèi)存應(yīng)用接口,從而避免此之帶來(lái)的內(nèi)存碎片、時(shí)間不確定等缺點(diǎn),另一方面可以增強(qiáng)程序的查錯(cuò)能力,減少內(nèi)存使用錯(cuò)誤。對(duì)于在嵌入式系統(tǒng)中廣泛存在的數(shù)據(jù)庫(kù)類(lèi)型的內(nèi)存需求,把由用戶(hù)管理的內(nèi)存分為固定大小的緩沖區(qū)、以堆方式分配的緩沖區(qū)和不同固定大小內(nèi)存隊(duì)列的分配方式,體現(xiàn)了內(nèi)存管理的優(yōu)越性
Abstract: The paper bring forward the conception of Embedded System ,Analyse the core kere of μc/os ,moreover detailedly introduce grafting the μC/OS‘s operating system on the ARM‘s architectural structure of S3C44B0‘s microprocessor and empolder on application and driver program 。
Key words: Embedded System μc/os MicroProcessor
一、嵌入式系統(tǒng)概述
嵌入式系統(tǒng)是將先進(jìn)的計(jì)算機(jī)技術(shù)、半導(dǎo)體技術(shù)和電子技術(shù)與各個(gè)行業(yè)的具體應(yīng)用相結(jié)合后的產(chǎn)物,目前嵌入式系統(tǒng)已經(jīng)滲透到日常生活的各個(gè)方面,其在工業(yè)、服務(wù)業(yè)、消費(fèi)電子等領(lǐng)域的應(yīng)用范圍都不斷擴(kuò)大,嵌入式計(jì)算機(jī)系統(tǒng)的正式定義為:以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),軟件硬件可裁減,符合應(yīng)用系統(tǒng)對(duì)功能、可靠性、成本、體積、功耗的嚴(yán)格要求的專(zhuān)用計(jì)算機(jī)系統(tǒng)。嵌入式系統(tǒng)的主要特征有:系統(tǒng)內(nèi)核小;專(zhuān)用性強(qiáng);系統(tǒng)精簡(jiǎn);嵌入式軟件要求高實(shí)時(shí)性的操作系統(tǒng)軟件;軟件要求高質(zhì)量和高可靠性;嵌入式系統(tǒng)開(kāi)發(fā)需要專(zhuān)門(mén)的開(kāi)發(fā)工具和環(huán)境。
嵌入式系統(tǒng)由硬件和軟件兩大部分組成,在本開(kāi)發(fā)應(yīng)用中,選擇ARM7TDMI內(nèi)核結(jié)構(gòu)的samsung公司的s3c44b0作為微處理器芯片,該芯片具有主頻高、運(yùn)算速度快,超低功耗、價(jià)格低廉、結(jié)構(gòu)簡(jiǎn)單等特點(diǎn),在該內(nèi)核基礎(chǔ)上擴(kuò)展了一系列完整的通用外圍器件,主要有:片內(nèi)8KB高速緩存、帶有1個(gè)專(zhuān)用DMA通道的LCD控制器、2個(gè)通用DMA通道、1個(gè)多主機(jī)I2C總線控制器、5個(gè)PWM定時(shí)器及1個(gè)內(nèi)部定時(shí)器、71個(gè)通用I/O口、8個(gè)外部中斷源、8個(gè)10位ADC等資源,主頻為66MHZ,系統(tǒng)支持大小端模式,共256MB的地址空間,支持8/16/32位數(shù)據(jù)總線編程。
開(kāi)發(fā)平臺(tái)外配與用戶(hù)交互接口有RS-232串口電路、外擴(kuò)flash、sdram,USB控制電路、以太網(wǎng)電路、鍵盤(pán),JTAG接口電路部分。
實(shí)時(shí)嵌入式操作系統(tǒng)的種類(lèi)繁多,大體上可以分為兩種:商用型和免費(fèi)型,前者系統(tǒng)功能穩(wěn)定、可靠,并有完善的技術(shù)支持和售后服務(wù),建立應(yīng)用開(kāi)發(fā)較為容易,但價(jià)格昂貴,代表性的有美國(guó)WindRiver公司的VxWorks操作系統(tǒng)、Microsoft公司的WinCE操作系統(tǒng);免費(fèi)型可以節(jié)約成本,且源碼公開(kāi),便于開(kāi)發(fā),代表性的有嵌入式Linux系統(tǒng)、μC/OS系統(tǒng)。
二、嵌入式μC/OS的體系結(jié)構(gòu)介紹
由于μC/OS結(jié)構(gòu)簡(jiǎn)單,編程工具絕大部分是C語(yǔ)言編程,可以在大多數(shù)界面友好的編譯器中編譯生成目標(biāo)代碼,如Borland C、Keil等工具,且其內(nèi)核最小可以到幾十K,可以在多種體系結(jié)構(gòu)的微處理器上移植,用戶(hù)的工作較小,源代碼開(kāi)放,便于學(xué)習(xí)。μC/OS-II的幾大組成部分有
核心部分(OSCore.c) 是操作系統(tǒng)的處理核心,包括操作系統(tǒng)初始化、操作系統(tǒng)運(yùn)行、中斷進(jìn)出的前導(dǎo)、時(shí)鐘節(jié)拍、任務(wù)調(diào)度、事件處理等多部分。
任務(wù)處理部分(OSTask.c)完成任務(wù)的操作;包括任務(wù)的建立、刪除、掛起、恢復(fù)等等。
時(shí)鐘部分(OSTime.c)主要完成任務(wù)延時(shí)等操作。
任務(wù)同步和通信部分 為事件處理部分,包括信號(hào)量、郵箱、郵箱隊(duì)列、事件標(biāo)志等部分; μC/OS-II的軟件體系結(jié)構(gòu)如圖1所示。從圖1中可以看到,如果要使用μC/OS-II, 必須為其編寫(xiě)OS_CPU.H、OS_CPU_C.C、OS_CPU_A.ASM三個(gè)文件。
三、μC/OS在ARM微處理器上的移植
μC/OS-II的全部源代碼量大約是6000-7000行,一共有15個(gè)文件。將 μC/OS-II 移植到ARM處理器上,需要完成的工作也非常簡(jiǎn)單,只需要修改三個(gè)和ARM體系結(jié)構(gòu)相關(guān)的文件,代碼量大約是500行。以下分別介紹這三個(gè)文件的移植工作
OS_CPU.H 文件 數(shù)據(jù)類(lèi)型定義,這部分的修改是與所用的編譯器相關(guān)的,不同的編譯器會(huì)使用不同的字節(jié)長(zhǎng)度來(lái)表示同一數(shù)據(jù)類(lèi)型,這里采用的編譯器為集成可視化開(kāi)發(fā)環(huán)境ARM SDT 2.5,相關(guān)的數(shù)據(jù)類(lèi)型的定義
#define BYTE INT8S /* Define data types for backward compatibility */
#define UBYTE INT8U /* .to uC/OS V1.xx. Not actually needed for . */
#define WORD INT16S /* ... uC/OS-II. */
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U
堆棧單位因?yàn)樘幚砥鳜F(xiàn)場(chǎng)的寄存器在任務(wù)切換時(shí)都將會(huì)保存在當(dāng)前運(yùn)行任務(wù)的堆棧中,所以O(shè)S_STK 數(shù)據(jù)類(lèi)型應(yīng)該是和處理器的寄存器長(zhǎng)度一致的。
typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */
堆棧增長(zhǎng)方向該設(shè)置由編譯器選項(xiàng)決定,在本開(kāi)發(fā)中設(shè)定堆棧由高地址向低地址增長(zhǎng)。
#define OS_STK_GROWTH 1 //define the stack to grow from high to low
2、OS_CPU_C.C 文件
任務(wù)堆棧初始化 這里涉及到任務(wù)初始化時(shí)的一個(gè)堆棧設(shè)計(jì),也就是在堆棧增長(zhǎng)方向上如何定義每個(gè)需要保存的寄存器位置,在ARM體系結(jié)構(gòu)下,任務(wù)堆?臻g由高至低依次將保存著pc、lr、r12、r11、r10、… r1、r0、CPSR、SPSR。
void *OSTaskStkInit (void (*task)(void *pd), void *pdata, void *ptos, INT16U opt)
{
unsigned int *stk ;
opt = opt; /* ‘opt‘ is not used, prevent warning */
stk = (unsigned int *)ptos; /* Load stack pointer */
*--stk = (unsigned int) task; / * lr */
……; /* r12—r0 */
*--stk = ARM_MODE_SYS; /* system mode */
*--stk = ARM_MODE_SYS; /* system mode */
return ((void *)stk);
}
當(dāng)前任務(wù)堆棧初始化完成后,OSTaskStkInit 返回新的堆棧指針stk,在 OSTaskCreate()執(zhí)行時(shí)將會(huì)調(diào)用 OSTaskStkInit 的初始化過(guò)程,然后通過(guò)OSTCBInit()函數(shù)調(diào)用將返回的sp指針保存到該任務(wù)的TCB塊中。
OSStartHighRdy() 該函數(shù)是在主程序OSStart( )多任務(wù)啟動(dòng)后執(zhí)行,負(fù)責(zé)從最高優(yōu)先級(jí)任務(wù)的TCB控制塊中獲得該任務(wù)的堆棧指針sp,通過(guò)sp依次將cpu現(xiàn)場(chǎng)恢復(fù),這時(shí)系統(tǒng)就將控制權(quán)交給用戶(hù)創(chuàng)建的該任務(wù)進(jìn)程,僅執(zhí)行一次,此后多任務(wù)優(yōu)先級(jí)調(diào)度由下面函數(shù)執(zhí)行
]]>Solid? Information Technology的旗艦產(chǎn)品solidDB是知名的關(guān)系型數(shù)據(jù)庫(kù),并因可嵌入到超快速、永不間斷數(shù)據(jù)訪問(wèn)的應(yīng)用程序中而廣受業(yè)界肯定。solidDB也是當(dāng)今唯一將全事務(wù)處理的內(nèi)存數(shù)據(jù)庫(kù)與功能強(qiáng)大的磁盤(pán)數(shù)據(jù)庫(kù)集成到一個(gè)小型低成本產(chǎn)品中的數(shù)據(jù)管理平臺(tái),其內(nèi)存引擎與磁盤(pán)引擎可同時(shí)運(yùn)行,并可共享同一標(biāo)準(zhǔn)編程接口。特別指出的是,這些特性還可應(yīng)用于高級(jí)功能,例如復(fù)制及高可用性,從而極大地降低了開(kāi)發(fā)新應(yīng)用的復(fù)雜性,縮減了時(shí)間和成本。
VxWorks環(huán)境要求在極短的響應(yīng)時(shí)間內(nèi)執(zhí)行應(yīng)用程序,并將所需的內(nèi)存及處理資源降至最低程度,而solidDB for VxWorks 專(zhuān)門(mén)針對(duì)其與VxWorks環(huán)境的無(wú)縫集成進(jìn)行了特別優(yōu)化。
Wind River 產(chǎn)品管理總監(jiān) Warren Kurisu 說(shuō):“伴隨著設(shè)備最終用戶(hù)技術(shù)水平的提高,他們也對(duì)設(shè)備軟件中的新功能和新服務(wù)提出了更多的需求,例如 e911、一鍵通(Push-To-Talk)和VoIP。solidDB for VxWorks 的優(yōu)越性能、高可用性及嵌入式特性使得需要為跨越多個(gè)行業(yè)從事應(yīng)用開(kāi)發(fā)的軟件人員能夠更好地滿足上述需求!
Monash Information Services 總裁 Curt Monash 博士說(shuō):“正如傳統(tǒng)應(yīng)用程序所印證的那樣,當(dāng)實(shí)時(shí)應(yīng)用程序更加豐富時(shí),一定會(huì)需要強(qiáng)大可靠的數(shù)據(jù)管理功能。Solid 的產(chǎn)品長(zhǎng)期致力于可嵌入的實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng),并已在這個(gè)市場(chǎng)占據(jù)了領(lǐng)先的地位!
Solid Information Technology 副總裁 Paola Lubet 說(shuō):“在幫助開(kāi)發(fā)人員超越應(yīng)用程序性能要求方面,Solid具有無(wú)與倫比的成功經(jīng)驗(yàn),而且可以縮短產(chǎn)品上市時(shí)間,有效降低項(xiàng)目成本。因此,對(duì)于任何使用業(yè)界領(lǐng)先的 VxWorks 實(shí)時(shí)操作系統(tǒng)的開(kāi)發(fā)人員而言,solidDB for VxWorks 無(wú)疑是他們最理想的解決方案。這項(xiàng)產(chǎn)品發(fā)布不僅強(qiáng)調(diào)了 Solid 為現(xiàn)有 VxWorks 客戶(hù)提供持續(xù)支持的承諾,同時(shí)也擴(kuò)大了Solid 在 VxWorks 市場(chǎng)的整體份額!
4 PostScript文件的生成
在VxWorks操作系統(tǒng)的開(kāi)發(fā)環(huán)境Tornado下,軟件包ZINC中的ZafPrinter類(lèi)及ZafDisplay類(lèi)提供的函數(shù)可完成PostScript文件的生成。ZafPrinter類(lèi)繼承ZafDisplay 類(lèi)而來(lái),因此,在ZafPrinter 中除了繼承來(lái)的圖形顯示函數(shù)之外,還定義了與打印機(jī)接口相關(guān)的函數(shù),如BeginJob(),EndJob(),BeginPage(),EndPage()等。
在用ZINC自帶的程序生成PostScript文件時(shí),需注意以下幾點(diǎn):
(1)將自定義的顏色值加入顏色表中,在i_print.cpp文件(在目錄…\Tornado\target\src\zinc\generic下)中,原來(lái)的顏色表定義為:
static unsigned long psColorTable[16]=
{
0x00000000L, // 0-ZAF_CLR_BLACK
0x00000080L, // 1-ZAF_CLR_BLUE
0x00008000L, // 2-ZAF_CLR_GREEN
0x00008080L, // 3-ZAF_CLR_CYAN
0x00800000L, // 4-ZAF_CLR_RED
0x00800080L, // 5-ZAF_CLR_MAGENTA
0x00808000L, // 6-ZAF_CLR_BROWN
0x00C0C0C0L, // 7-ZAF_CLR_LIGHTGRAY
0x00808080L, // 8-ZAF_CLR_DARKGRAY
0x000000FFL, // 9-ZAF_CLR_LIGHTBLUE
0x0000FF00L, // 10-ZAF_CLR_LIGHTGREEN
0x0000FFFFL, // 11-ZAF_CLR_LIGHTCYAN
0x00FF0000L, // 12-ZAF_CLR_LIGHTRED
0x00FF00FFL, // 13-ZAF_CLR_LIGHTMAGENTA
0x00FFFF00L, // 14-ZAF_CLR_YELLOW
0x00FFFFFFL, // 15-ZAF_CLR_WHITE
};
保留原有的16種顏色,再增加48種海圖中的顏色:
0x00000000, 0x00000080, 0x0000b400, 0x0080ffff,
0x00d20000, 0x00ff00ff, 0x00dc8000, 0x00c0c0c0,
0x00ffc7ab, 0x000000ff, 0x0000ff00, 0x00c8ffff,
0x00ff0000, 0x00ff96ff, 0x00ffffc0, 0x00ffffff,
0x00ff02fd, 0x00ff02fd, 0x00ff02fd, 0x00ff02fd,
0x00ff02fd, 0x00ff02fd, 0x00ff02fd, 0x00ff02fd,
0x00ff02fd, 0x00ff02fd, 0x00ff02fd, 0x00ff02fd,
0x00ff02fd, 0x00ff02fd, 0x00ff02fd, 0x00ff02fd,
0x00000000, 0x000000ff, 0x0033aa00, 0x0060c0c0,
0x00b03030, 0x00c040c0, 0x00804040, 0x00a0a0a0,
0x00404040, 0x008080ff, 0x0080ff80, 0x0016edfe,
0x00e02020, 0x00e010e0, 0x00ffff80, 0x00ffffff,
這樣顏色表中共有64種可用顏色。
同時(shí)將
for(index = 0; index < 16; index++)
colorTable[index]= psColorTable[index];
改為:
for(index = 0; index < 64; index++)
colorTable[index]= psColorTable[index];
(2)為使生成的PostScript文件盡可能的小,對(duì)原來(lái)海圖的畫(huà)圖程序做了一點(diǎn)改動(dòng)。在原程序中,多邊形的繪制是通過(guò)畫(huà)兩點(diǎn)線完成的,這樣,生成PostScript文件比較大,可將其改為直接調(diào)用畫(huà)多邊形的函數(shù)Polygon()。經(jīng)過(guò)這樣的改動(dòng),生成的PostScript文件減小了很多,原來(lái)的一頁(yè)圖生成的PostScript文件為3.65M,改動(dòng)后不足1M。
5 PostScript 文件在VxWorks操作系統(tǒng)下的打印輸出
要使用打印驅(qū)動(dòng)程序,首先要調(diào)用函數(shù)lptDevCreate(char*name,intchannel)為L(zhǎng)PT端口創(chuàng)建設(shè)備,其中端口號(hào)由參數(shù)channel指定,創(chuàng)建的設(shè)備的名稱(chēng)為name。只能為一個(gè)端口號(hào)創(chuàng)建一個(gè)設(shè)備。
創(chuàng)建設(shè)備成功之后,主機(jī)就可以向打印機(jī)發(fā)送PostScript文件了,其程序流程如圖2。
6 漢字打印輸出的實(shí)現(xiàn)
在VxWorks操作系統(tǒng)下,實(shí)現(xiàn)電子海圖中漢字的顯示和打印輸出功能的基本思路是:利用Windows操作系統(tǒng)中的TrueType字庫(kù),根據(jù)需要顯示漢字的Unicode編碼,在TrueType字庫(kù)中找到該漢字的相應(yīng)信息,按照TrueType字庫(kù)中存儲(chǔ)的信息,將漢字顯示或打印輸出。
TrueType字庫(kù)由很多表組成,它是用一些閉合的輪廓線來(lái)描述每個(gè)字符的。若能夠訪問(wèn)TrueType字庫(kù)獲得相應(yīng)漢字的描述信息,就能將漢字畫(huà)出來(lái)。對(duì)于TrueType字庫(kù)的訪問(wèn),網(wǎng)上有開(kāi)放的資源可以實(shí)現(xiàn),這就是FreeType2,它為應(yīng)用程序訪問(wèn)字庫(kù)文件提供了統(tǒng)一的接口,支持的格式包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。要使用FreeType, 就要在相應(yīng)的操作系統(tǒng)下對(duì)源代碼進(jìn)行編譯,生成一個(gè)庫(kù)文件,然后在應(yīng)用程序中調(diào)用相應(yīng)的API庫(kù)函數(shù)。
通過(guò)FreeType提供的庫(kù)函數(shù),應(yīng)用程序可以訪問(wèn)TrueType字庫(kù),根據(jù)所得到的TrueType漢字信息,就能實(shí)現(xiàn)TrueType字體的顯示或打印輸出。但是TrueType字庫(kù)的訪問(wèn)是通過(guò)Unicode編碼進(jìn)行的,也就是說(shuō),只有獲得了字符的Unicode編碼,才能在TrueType字庫(kù)中得到該字符的描述信息。在電子海圖程序中,字符的Unicode編碼的獲得是通過(guò)查表實(shí)現(xiàn)的。所謂的查表,是指將國(guó)際漢字字符集中所有字符的Unicode編碼,存在一個(gè)數(shù)組unsigned long gb2312_uni_data[87][94],根據(jù)字符的區(qū)位碼就可以得到相應(yīng)的Unicode編碼。例如區(qū)號(hào)為qh,位號(hào)為wh的字符的Unicode編碼就是數(shù)組元素gb2312_uni_data[qh-1][wh-1]的值。
保存所有字符的Unicode編碼的數(shù)組gb2312_uni_data[87][94]是在Windows操作系統(tǒng)下轉(zhuǎn)換得到的。具體的做法是將國(guó)際漢字字符集中的所有字符按照一定的格式保存成文本文件,然后從文件中讀出每個(gè)字符,調(diào)用函數(shù)MultiByteToWideChar(…)將其轉(zhuǎn)換成Unicode編碼,并將其保存。
根據(jù)TrueType字庫(kù)中字符的信息,顯示或打印輸出字符有兩種途徑:一種是調(diào)用FreeType的API函數(shù)得到相應(yīng)字符的輪廓線,然后將其填充;另一種是調(diào)用FreeType的API函數(shù)直接得到字符的位圖,再調(diào)用相應(yīng)操作系統(tǒng)中的打點(diǎn)函數(shù)實(shí)現(xiàn)位圖的顯示。由于第二種方法實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單,并且海圖系統(tǒng)中的漢字不是很多,所以在海圖程序中使用的是第二種方法。
在獲得相應(yīng)漢字的字形位圖信息的基礎(chǔ)上,實(shí)現(xiàn)漢字打印輸出功能的關(guān)鍵是如何使用PostScript語(yǔ)言描述相應(yīng)漢字字形的位圖信息。在程序的設(shè)計(jì)中,通過(guò)畫(huà)1個(gè)像素長(zhǎng)度的直線來(lái)實(shí)現(xiàn)點(diǎn)的輸出,然后用一系列的點(diǎn)輸出位圖信息。其中,點(diǎn)的輸出用PostScript語(yǔ)言表示為:
x y moveto
x+1 y lineto
根據(jù)漢字橫多豎少的特點(diǎn),可以對(duì)以上產(chǎn)生的PostScript文件進(jìn)行優(yōu)化,如果N點(diǎn)在一條橫線上,就直接畫(huà)N長(zhǎng)度的直線,用PostScript語(yǔ)言表示為:
x y moveto
x+N y line to
這樣,就將原來(lái)的N條PostScript語(yǔ)句轉(zhuǎn)化為1條語(yǔ)句,從而減少了PostScript文件的長(zhǎng)度。
7 結(jié)束語(yǔ)
VxWorks實(shí)時(shí)操作系統(tǒng)的特點(diǎn)決定了在此操作系統(tǒng)中開(kāi)發(fā)驅(qū)動(dòng)程序的重要性。根據(jù)需要配置相應(yīng)的設(shè)備,并實(shí)現(xiàn)硬件的驅(qū)動(dòng),是VxWorks系統(tǒng)中進(jìn)行軟件設(shè)計(jì)與開(kāi)發(fā)的前提。本文介紹的電子海圖系統(tǒng)打印功能的總體設(shè)計(jì)思想及實(shí)現(xiàn)方法,已在哈爾濱工程大學(xué)研制的某型電子海圖系統(tǒng)的二次開(kāi)發(fā)中得到應(yīng)用。
RTW(Real-Time Workshop)是Matlab圖形建模和仿真環(huán)境Simulink的一個(gè)重要的補(bǔ)充功能模塊,它是一個(gè)基于Simulink的代碼自動(dòng)生出環(huán)境,它能直接從Simulink的模型中產(chǎn)生優(yōu)化的、可移植的和個(gè)性化的代碼,并根據(jù)目標(biāo)配置自動(dòng)生成多種環(huán)境下的程序。
RTW提供了幾個(gè)快速原型化的目標(biāo),其中包括提供了從Simulink模型到VxWorks應(yīng)用代碼的自動(dòng)轉(zhuǎn)換接口Tornado Real-Time Target,可以讓用戶(hù)的模型在VxWorks上執(zhí)行。
2、Tornado(VxWorks)實(shí)時(shí)目標(biāo)運(yùn)行時(shí)結(jié)構(gòu)
開(kāi)發(fā)VxWorks實(shí)時(shí)應(yīng)用系統(tǒng)的典型配置,如圖1所示:
圖1 VxWorks實(shí)時(shí)應(yīng)用開(kāi)發(fā)的經(jīng)典配置
實(shí)時(shí)代碼在主機(jī)上,用Tornado提供的交叉編譯器編譯。通過(guò)RTW的Tornado實(shí)時(shí)目標(biāo)生成目標(biāo)文件(vxmodel.lo),可通過(guò)Tornado集成開(kāi)發(fā)環(huán)境的WindSh下載到VxWorks目標(biāo)機(jī)。實(shí)時(shí)程序在VxWorks目標(biāo)機(jī)上執(zhí)行,通過(guò)IO設(shè)備和外部硬件交換數(shù)據(jù),并保持和主機(jī)之間的相互通信。
實(shí)時(shí)程序運(yùn)行在VxWorks目標(biāo)機(jī)上,而Simulink運(yùn)行在主機(jī)上。Simulink需要VxWorks目標(biāo)機(jī)上運(yùn)行的任務(wù)來(lái)處理通信過(guò)程。Tornado(VxWorks)Real-Time Tartget生成如下VxWorks任務(wù):一個(gè)用于和Simulink通信,其他用于完成模型功能[2]。
3、Tornado(VxWorks)實(shí)時(shí)目標(biāo)的實(shí)現(xiàn)過(guò)程
3.1 實(shí)驗(yàn)環(huán)境
我的實(shí)驗(yàn)環(huán)境如下表:
表1 實(shí)驗(yàn)環(huán)境
3.2 實(shí)時(shí)目標(biāo)的具體實(shí)現(xiàn)步驟
為了通過(guò)Real-Time Workshop實(shí)現(xiàn)和運(yùn)行一個(gè)基于VxWorks的實(shí)時(shí)程序,用戶(hù)可按如下的步驟進(jìn)行:
(1) 在Matlab/Simulink下建立一個(gè)模型,這里以一個(gè)經(jīng)典的PID模型為例:
圖2 實(shí)驗(yàn)所采用的經(jīng)典PID模型
模型采用外部工作模式(External Mode),并設(shè)置Simulink Parameters對(duì)話框中的參數(shù):
圖3 仿真參數(shù)Solver設(shè)置
圖4 仿真參數(shù)Real-Time Workshop設(shè)置
圖5 仿真參數(shù)code generation options設(shè)置
(2) 配置模板聯(lián)編連文件tornado.tmf,該文件位于%matlabroot%/rtw/c/tornado目錄下,要對(duì)這個(gè)文件作如下修改:
#------------ Macros read by make_rtw -------------
MAKECMD = C:Tornado2.2hostx86-win32 inmake
HOST = PC
#-------------Tool Locations-----------------------------
WIND_BASE= C:Tornado2.2
WIND_REGISTRY=$(COMPUTERNAME)
WIND_HOST_TYPE=x86-win32
#------------Vxworks Configuration------------------
VX_TARGET_TYPE = pentium
CPU_TYPE = PENTIUM2
#-------------Macros for Downloading to Target-----
TARGET=target
TGTSVR_HOST=host
VX_CORE_LOC = $(WIND_BASE)/target/config/ pcPentium3/vxWorks
(3) 程序的生成、編譯、連接
設(shè)置完參數(shù),保存后,開(kāi)始創(chuàng)建程序,單擊上圖中的Build按鈕,開(kāi)始編譯程序,成功后可在當(dāng)前的目錄中產(chǎn)生了一個(gè)vxmodel_tornado_rtw的文件夾和一個(gè)目標(biāo)文件vxmodel.lo。
(4) 手動(dòng)下載和運(yùn)行可執(zhí)行文件
現(xiàn)在可以將實(shí)時(shí)程序下載到目標(biāo)機(jī)中,具體的方法是在Tornado集成開(kāi)發(fā)環(huán)境中啟動(dòng)WindSh,在WindSh窗口執(zhí)行如下命令:
ld<vxmodel.lo
請(qǐng)注意要保證lo文件在WindSh的工作路徑下。VxWorks實(shí)時(shí)程序定義了一個(gè)函數(shù)rt_main(),用來(lái)創(chuàng)建和執(zhí)行模型代碼、完成與Simulink的通信(如果選擇了外部模式方式)。rt_main函數(shù)在文件rt_main.c中定義,這個(gè)文件位于目錄%matlabroot% twc ornado中。
在WindSh窗口中調(diào)用rt_main函數(shù),開(kāi)始運(yùn)行程序:sp(rt_main,vxmodel,"-tf 100 -w ","*",0,30,17725)
參數(shù)的含義分別是:
rt_main()是實(shí)時(shí)程序定義的函數(shù),用來(lái)產(chǎn)生任務(wù)執(zhí)行代碼和與Simulink進(jìn)行通信;?
-tf用于指定仿真時(shí)間,此處設(shè)為100秒;?
-w表示在外部模式時(shí),運(yùn)行前等待來(lái)自Simulink消息的觸發(fā);?
“*”為安裝所有的信號(hào);?
0表示使用各自的模塊名;?
30表示使用默認(rèn)作為tBaseRate優(yōu)先級(jí);?
17725為T(mén)CP默認(rèn)端口號(hào)(可以設(shè)置在256~65535之間)。?
運(yùn)行后我們可以看到目標(biāo)機(jī)上的屏幕上顯示:
waiting for start message from host
(5) 建立連接
在External Target Interface對(duì)話框中的MEX-file arguments指定目標(biāo)機(jī)的IP、冗長(zhǎng)度和TCP端口號(hào),如圖6所示,就可以建立連接了。
圖6 External Target Interface對(duì)話框設(shè)置
打開(kāi)External Mode Control Panel,如圖7所示。點(diǎn)擊Connect按鈕,執(zhí)行Start real-time code,可以看到Scope上的圖形輸出。此時(shí),可以改變模型的參數(shù)(如增益的數(shù)值),參數(shù)下載后Scope的曲線將隨之改變。仿真時(shí)間結(jié)束以后,可以看到產(chǎn)生了一個(gè)external.mat文件,由目標(biāo)機(jī)會(huì)傳到主機(jī),放在Tornado的安裝根目錄下。
圖7 External Mode Control Panel對(duì)話框
4、結(jié)論
針對(duì)Matlab的仿真特性和VxWorks操作系統(tǒng)的實(shí)時(shí)特點(diǎn),本文介紹了RTW面向Tornado(VxWorks)實(shí)時(shí)目標(biāo)的運(yùn)行結(jié)構(gòu),并且較為詳細(xì)的闡述了Tornado(VxWorks)實(shí)時(shí)目標(biāo)的具體實(shí)現(xiàn)流程,實(shí)現(xiàn)了Simulink在Tornado(VxWorks)實(shí)時(shí)目標(biāo)下的仿真。
在結(jié)合相關(guān)文檔的同時(shí),筆者加入了親身實(shí)驗(yàn)的經(jīng)驗(yàn),增補(bǔ)了一些必要的內(nèi)容,完善了實(shí)驗(yàn)的具體步驟,降低了為讀者今后實(shí)驗(yàn)的調(diào)試難度
]]>VxWorks 是美國(guó) Wind River System 公司( 以下簡(jiǎn)稱(chēng)風(fēng)河 公司 ,即 WRS 公司)推出的一個(gè)實(shí)時(shí)操作系統(tǒng)。WRS 公司 組建于1981年,是一個(gè)專(zhuān)門(mén)從事實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)與生產(chǎn)的軟件公司,該公司在實(shí)時(shí)操作系統(tǒng)領(lǐng)域被世界公認(rèn)為是最具有領(lǐng)導(dǎo)作用的公司。
VxWorks 是一個(gè)運(yùn)行在目標(biāo)機(jī)上的高性能、可裁減的嵌入式實(shí)時(shí)操作系統(tǒng)。它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通訊、軍事演習(xí)、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。在美國(guó)的 F-16、FA-18 戰(zhàn)斗機(jī)、B-2 隱形轟炸機(jī)和愛(ài)國(guó)者導(dǎo)彈上,甚至連1997年4月在火星表面登陸的火星探測(cè)器上也使用到了VxWorks。
1984年 WRS 公司推出它的第一個(gè)版本--VxWorks 1.0.1,在 1999年推出了它的最新版本VxWorks 5.4。從1995年以后, WRS 公司推出了一套實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)環(huán)境-- Tornado。
1.1 Tornado2.0 組件
Tornado是嵌入式實(shí)時(shí)領(lǐng)域里最新一代的開(kāi)發(fā)調(diào)試環(huán)境。Tornado給嵌入式系統(tǒng)開(kāi)發(fā)人員提供了一個(gè)不受目標(biāo)機(jī)資源限制的超級(jí)開(kāi)發(fā)和調(diào)試環(huán)境。Tornado包含三個(gè)高度集成的部分:
. 運(yùn)行在宿主機(jī)和目標(biāo)機(jī)上的強(qiáng)有力的交叉開(kāi)發(fā)工具和實(shí)用程序;
. 運(yùn)行在目標(biāo)機(jī)上的高性能、可裁剪的實(shí)時(shí)操作系統(tǒng)VxWorks;
. 連接宿主機(jī)和目標(biāo)機(jī)的多 種通訊方式,如:以太網(wǎng),串口線,ICE或ROM仿真器等。
對(duì)于不同的目標(biāo)機(jī),Tornado給開(kāi)發(fā)者提供一個(gè)一致的圖形接口和人機(jī)界面。當(dāng)使用Tornado的開(kāi)發(fā)人員轉(zhuǎn)向新的目標(biāo)機(jī)時(shí),不必再花費(fèi)時(shí)間學(xué)習(xí)或適應(yīng)新的工具;對(duì)深嵌入式應(yīng)用開(kāi)發(fā)者來(lái)說(shuō)更重要的是,Tornado所有的工具都是駐留在開(kāi)發(fā)平臺(tái)上的。在嵌入式系統(tǒng) 工具發(fā)展歷史上,Tornado是第一個(gè)實(shí)現(xiàn)了當(dāng)目標(biāo)機(jī)資源有限時(shí)開(kāi)發(fā)工具仍可使用而且功能齊全的開(kāi)發(fā)環(huán)境。另外,所有工具都通過(guò)一個(gè)中央服務(wù)器(Target Server)處理與目標(biāo)機(jī)的通訊。所以無(wú)論連結(jié)方式是Ethernet,還是串口線、ICE仿真器、ROM仿真器或客戶(hù)設(shè)計(jì)的調(diào)試通道,所有工具均可使用。
1.1.1 實(shí)時(shí)系統(tǒng)
特點(diǎn):
l 實(shí)時(shí),能滿足嚴(yán)格的時(shí)間要求;
l 多任務(wù)內(nèi)核:
實(shí)時(shí)調(diào)度(基于優(yōu)先級(jí)或搶占式的);
任務(wù)間通訊;
互斥;
l 其他標(biāo)準(zhǔn)設(shè)備作為庫(kù)的形式支持內(nèi)核;
l 系統(tǒng)可重新配置,根據(jù)需要裁減組件,空間小;
l 所有任務(wù)駐留在同一地址空間(任務(wù)間通訊快而容易,上下文切換快,但一個(gè)任務(wù)崩潰會(huì)影響別的任務(wù));
l 所有任務(wù)運(yùn)行在超級(jí)(supervisor)模式(沒(méi)有哪個(gè)系統(tǒng)調(diào)用具有壓倒一切的優(yōu)勢(shì),所有的設(shè)備都作為普通子程序調(diào)用);
l 在主機(jī)上編寫(xiě)代碼和編譯;在目標(biāo)機(jī)上進(jìn)行調(diào)試和執(zhí)行;
1.1.2 tornado 開(kāi)發(fā)工具
l CrossWind:
源程序(C 或 C++ 以及匯編程序等)的調(diào)試工具。 CrossWind結(jié)合了圖形方式和命令行方式的最大特點(diǎn)。 最普通的調(diào)試方式,例如斷點(diǎn)設(shè)置和程序執(zhí)行控制,可 以通過(guò)便捷的點(diǎn)擊方式實(shí)現(xiàn)。同樣,程序顯示框和數(shù) 據(jù)偵察窗也提供了一個(gè)直接的可視窗口來(lái)觀察應(yīng)用程 序中最關(guān)鍵的一部分。如果需要更復(fù)雜的調(diào)試,CrossWind 也提供了命令行的方式來(lái)調(diào)用它提供的各種命令。
l Browser:
可對(duì)系統(tǒng)對(duì)象(任務(wù)、消息隊(duì)列、信號(hào)量等)和存儲(chǔ) 器使用情況進(jìn)行觀察的瀏覽器。可以方便地監(jiān)視用戶(hù)的 目標(biāo)系統(tǒng)。Browser匯總了應(yīng)用進(jìn)程,內(nèi)存消耗和一個(gè)目 標(biāo)內(nèi)存的映射。通過(guò) Browser,用戶(hù)可以觀察信號(hào)量、 消息隊(duì)列、內(nèi)存分配、看門(mén)狗計(jì)時(shí)器、堆棧使用情況、 目標(biāo) CPU使用率、對(duì)象模塊結(jié)構(gòu)和符號(hào)表以及每個(gè)任務(wù)的詳細(xì)信息。
l WindSh:
提供從宿主機(jī)到目標(biāo)機(jī)之間的一個(gè)命令 shell。WindSh 是一種非常受歡迎的開(kāi)發(fā)工具,它具有很強(qiáng)的交互性和可操作性,允許用戶(hù)調(diào)用內(nèi)存中的應(yīng)用程序模塊或是 VxWorks模塊中的任何例程。它不但具有一般命令語(yǔ)言的功能,而且也具有 C 語(yǔ)言的設(shè)計(jì)特點(diǎn),能夠解釋幾乎任何 C 語(yǔ)言表達(dá)式, 執(zhí)行大多數(shù) C 語(yǔ)言算子,解析符號(hào)表數(shù)據(jù)。對(duì)初用者來(lái)說(shuō),WindSh學(xué)習(xí)起來(lái)比較簡(jiǎn)單,使用比較方便,對(duì)熟練用戶(hù)而言,則有較為高級(jí)的手段可以應(yīng)用。
l WindView:
非常出色的系統(tǒng)可視診斷和分析工具。可非常容易地觀察各任務(wù),中斷程序之間的相互作用。它是在嵌入式系統(tǒng)應(yīng)用開(kāi)發(fā)期間的可視工具。
l VxSim:
快速原型仿真器?稍谟布O(shè)備未完成之前,在宿主機(jī)上對(duì)應(yīng)用程序進(jìn)行仿真分析。
l Project Facility:
工程管理工具,配制應(yīng)用程序或vxworks本身。
]]>目前市場(chǎng)上比較著名的實(shí)時(shí)操作系統(tǒng)有:VxWorks、PSOS、Nucleus、QNX、VRTX、Windows CE、Palm 0S、Lynx0S等。 其中,VxWorks是一個(gè)具有微內(nèi)核、可裁剪的高性能強(qiáng)實(shí)時(shí)操作系統(tǒng),在實(shí)時(shí)操作系統(tǒng)市場(chǎng)上處于領(lǐng)先地位。它以其良好的可靠性和卓越的實(shí)時(shí)性被廣泛地應(yīng)用在通信、軍事、航空、航天等高精尖技術(shù)及實(shí)時(shí)性要求極高的領(lǐng)域中,如衛(wèi)星通訊、彈道制導(dǎo)、飛機(jī)導(dǎo)航等。在美國(guó)的 F-16戰(zhàn)斗機(jī)、B-2 隱形轟炸機(jī)和愛(ài)國(guó)者導(dǎo)彈上,甚至火星探測(cè)器上都使用了VxWorks實(shí)時(shí)操作系統(tǒng)。在嵌入式實(shí)時(shí)操作系統(tǒng)中使用串口通信,不僅可擴(kuò)展嵌入式設(shè)備通信能力,而且可擴(kuò)大其應(yīng)用范圍。
2 VxWorks簡(jiǎn)介
VxWorks是由wRS(wind River Systems,Inc.)公司開(kāi)發(fā)的一套具有微內(nèi)核、高性能、可伸縮的實(shí)時(shí)操作系統(tǒng),支持廣泛的網(wǎng)絡(luò)通信協(xié)議,并能夠根據(jù)用戶(hù)的需求進(jìn)行組合,其開(kāi)放式的結(jié)構(gòu)和對(duì)工業(yè)標(biāo)準(zhǔn)的支持使開(kāi)發(fā)者只需做最少的工作即可設(shè)計(jì)出有效的適合于不同用戶(hù)要求的系統(tǒng)。除了性能出眾的操作系統(tǒng)之外,wRS公司還提供了優(yōu)秀的實(shí)時(shí)操作系統(tǒng)開(kāi)發(fā)工具Tornado。Tornado由三個(gè)高度集成的部分組成:Tornado工具,一整套強(qiáng)有力的交叉開(kāi)發(fā)工具;VxWorks運(yùn)行系統(tǒng),是運(yùn)行在目標(biāo)機(jī)上的高性能、可裁剪的實(shí)時(shí)操作系統(tǒng);連接目標(biāo)機(jī)和宿主機(jī)的通信選項(xiàng),加以太網(wǎng)、串行線路、在線仿真等。Tornado能夠支持Windows、Unix等流行的工作平臺(tái)和PowerPC、X86、ARM等幾乎所有的目標(biāo)處理器,所提供的工具可用于所有目標(biāo)機(jī),并具有兩種調(diào)試模式(系統(tǒng)模式和任務(wù)模式)。除了基本的功能和開(kāi)發(fā)工具外,Tornado還具有先進(jìn)的系列網(wǎng)絡(luò)產(chǎn)品,極大地?cái)U(kuò)展了Tornado的網(wǎng)絡(luò)特性,并增強(qiáng)了嵌人式微處理器的網(wǎng)絡(luò)特性。[1]
3 串口通信基本原理
串口在嵌入式系統(tǒng)當(dāng)中是一類(lèi)重要的數(shù)據(jù)通信接口,其本質(zhì)功能是作為CPU和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)據(jù)從CPU經(jīng)過(guò)串行端口發(fā)送出去時(shí),字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位;在接收數(shù)據(jù)時(shí),串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。應(yīng)用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統(tǒng)提出資源申請(qǐng)要求(打開(kāi)串口),通信完成后必須釋放資源(關(guān)閉串口)。
串口通信的優(yōu)點(diǎn)是開(kāi)發(fā)簡(jiǎn)單,在傳輸數(shù)據(jù)量不大、要求速度不高而傳輸距離較大的通信場(chǎng)合得到廣泛應(yīng)用。
在VxWorks中,將I/O系統(tǒng)設(shè)計(jì)成為任何類(lèi)型的設(shè)備提供一個(gè)簡(jiǎn)單、統(tǒng)一、獨(dú)立于設(shè)備的接口,任何對(duì)于串口的操作都可以視為對(duì)一個(gè)文件的操作,而不必了解串口設(shè)備或程序驅(qū)動(dòng)實(shí)現(xiàn)的細(xì)節(jié)。在串口通信軟件的設(shè)計(jì)中,當(dāng)串口初始化完成后,在使用之前利用open()打開(kāi)相應(yīng)串口,然后進(jìn)行配置。
VxWorks提供終端和偽終端設(shè)備驅(qū)動(dòng)。Tty驅(qū)動(dòng)針對(duì)實(shí)終端;pty針對(duì)仿真終端的程序。Tty設(shè)備有兩種操作模式:raw模式和line模式。在raw模式下,每個(gè)剛從設(shè)備輸入的字符對(duì)讀者都是有效的;在line模式下所有輸入字符被存儲(chǔ),直到NEWLINE字符輸入。設(shè)備選項(xiàng)字使用帶FIOSETOPTIONS 功能的ioctl()程序來(lái)設(shè)置。[2]
配置完成后,依據(jù)串口打開(kāi)時(shí)的讀寫(xiě)標(biāo)志,調(diào)用函數(shù)write()、read()對(duì)串口進(jìn)行只讀操作、只寫(xiě)操作或同時(shí)進(jìn)行讀寫(xiě)操作。
為提高數(shù)據(jù)接收的實(shí)時(shí)性,可采用中斷方式,利用VxWorks提供的select函數(shù)的事件觸發(fā)機(jī)制,將讀串口的任務(wù)阻塞使其一直等待數(shù)據(jù),當(dāng)有數(shù)據(jù)來(lái)到的時(shí)候該任務(wù)會(huì)立刻自動(dòng)響應(yīng),提高系統(tǒng)的實(shí)時(shí)性。
4 環(huán)境配置
在本實(shí)時(shí)應(yīng)用系統(tǒng)中采用486機(jī)作為目標(biāo)機(jī),串口通信時(shí)目標(biāo)機(jī)VxWorks系統(tǒng)啟動(dòng)盤(pán)的制作步驟:
(1) 修改通用配置文件\\Tornado\target\config\pc486\config.h。在config.h文件中加入以下宏定義:
#define INCLUDE_WDB
#define INCLUDE_WDB_TTY_TEST
#undef WDB_COMM_TYPE
#define WDB_COMM_TYPE WDB_COMM_SERIAL /*定義通信方式為串口聯(lián)結(jié)*/
#define WDB_TTY_CHANNEL 1 /*通道號(hào)*/
#define WDB_TTY_BAUD 9600 /*串口速率,可設(shè)置至38400*/
#define WDB_TTY_DEV_NAME "tyCo/1"
#define CONSOLE_TTY 0
#define DEFAULT_BOOT_LINE "fd=0,0(0,0)hostname:/fd0/vxWorks \ h=主機(jī)
ip e=目標(biāo)機(jī)ip u=主機(jī)上的登錄用戶(hù)名"
(2) 在Tornado集成環(huán)境中執(zhí)行菜單命令Project > Make PC486 > Common Targets > clean刪除以前生成的文件,執(zhí)行菜單命令Project > Make PC486 > Boot Rom Targets > bootrom_uncmp編譯鏈接生成bootrom_uncmp ;再選擇VxWorks Target,編譯生成vxworks;
(3) 拷貝\\Tornado\target\config\pc486\bootrom_uncmp至\\Tornado\host\bin下
(4) 重命名文件bootrom_uncmp為bootrom;
(5) 準(zhǔn)備一張已格式化的空盤(pán)插入軟驅(qū);
(6) 在目錄\\Tornado\host\bin下執(zhí)行命令 mkboot a: bootrom;
(7)拷貝\\Tornado\target\config\pc486\VxWorks至軟盤(pán);
(8) 將系統(tǒng)制作盤(pán)插入目標(biāo)機(jī)軟驅(qū),加電啟動(dòng)目標(biāo)機(jī)即載入VxWorkst系統(tǒng)。[3]
5程序示例
5.1 在程序中加入下列頭文件
#include <vxWorks.h>
#include "strLib.h"
#include <string.h>
#include <sioLib.h>
#include <ioLib.h>
#include <stdio.h>
#include <ioctl.h>
#include <selectLib.h>
#include "types/vxTypesOld.h"
5.2 打開(kāi)串口
int open_com1(void) //打開(kāi)串口1函數(shù)
{ int sfd;//串口設(shè)備文件描述符
sfd =open(”/tyCo/0”,0_RDWR,0);//打開(kāi)串口并返回串口設(shè)備文件描述符
if(sfd ==ERROR) //如果不能打開(kāi)串口1則打印出錯(cuò)信息
printf("You can’t open port com1 !")
5.3 配置串口
int config_com1(void) //串口1配置函數(shù)
{ ioctl(sfd,FIOSETOPTIONS,OPT_LINE); //設(shè)置串口工作模式為行模式:LINE_MODE
ioctl(sfd,FIOBAUDRATE,9600); //設(shè)置串口波特率為9600bps
ioctl(sfd,FIOFLUSH,0); //清空輸入輸出緩沖
ioctl(sfd,SIO_HW_OPTS_SET,CS8|STOPB|PARENB|PARODD);
//設(shè)置 8 位數(shù)據(jù)位,2位停止位,帶校驗(yàn)位,奇校驗(yàn)
}
5.4 串口接收數(shù)據(jù)
int accept _com1(void) //從串口1接收數(shù)據(jù)函數(shù)
{ while(1)
{ char * accept _buf;
FD_ZERO(&fds_data);//位碼置零
FD_SET(sfd,&fds_data);//初始化位碼
width=sfd +1;
//任務(wù)阻塞等待讀串口準(zhǔn)備完畢;
if(select(width,&fds_data,NULL,NULL,NULL)==ERROR)
return(ERROR);
read(sfd, accept _buf,sizeof(accept _buf)); //從串口讀字符
printf("accept message is : %s \n\n", accept _buf); //輸出接收到的信息
}
}
5.5 串口發(fā)送數(shù)據(jù)
int send_com1(void) //向串口1發(fā)送數(shù)據(jù)函數(shù)
{ char *send_buf =" Data had accept!"; //待發(fā)送數(shù)據(jù)
//任務(wù)阻塞等待寫(xiě)串口準(zhǔn)備完畢
if(select(width,NULL,&data_fds,NULL,NULL==ERROR)
return(ERROR) ;
if(FD_ISSET(sfd,&fds_data)) //檢查串口準(zhǔn)備好就向串口寫(xiě)數(shù)據(jù)
write(sfd,send_buf,sizeof(send_buf)) ;
}
5.6 關(guān)閉串口
close(sfd);
6結(jié)束語(yǔ)
RS-232串口通信雖速率不高,但RS-422標(biāo)準(zhǔn)串行口通信則采用了雙線傳輸,大大增加了抗共模干擾的能力,最大數(shù)據(jù)傳輸速度可以達(dá)到10Mb/s,這對(duì)于遠(yuǎn)程數(shù)據(jù)交換具有極大的優(yōu)勢(shì)。
本文描述了在實(shí)時(shí)操作系統(tǒng)VxWorks中利用串口實(shí)現(xiàn)數(shù)據(jù)通信的方法,并給出了示例程序,目前已經(jīng)在我們開(kāi)發(fā)的風(fēng)洞測(cè)控系統(tǒng)中獲得了應(yīng)用。該方法可將其串口通信可適用于工業(yè)控制等多方面,具有廣泛的適應(yīng)性。在嵌入式實(shí)時(shí)操作系統(tǒng)中使用串口通信,不僅可擴(kuò)展嵌入式設(shè)備通信能力,而且可擴(kuò)大其的應(yīng)用范圍。
]]>本監(jiān)控系統(tǒng)采用TI公司的TPS3307-33D來(lái)作為電源檢測(cè)IC。該器件的Reset有效電源復(fù)位電壓值定義為VDD=1.1V。TPS3307-33D可同時(shí)監(jiān)視兩種獨(dú)立電壓,還可控制另外一種電壓,這種電壓可以獨(dú)立調(diào)整并在內(nèi)部與復(fù)位邏輯電路相連。
3 通信平臺(tái)的嵌入式系統(tǒng)設(shè)計(jì)
本設(shè)計(jì)的軟件系統(tǒng)包括底層軟件和系統(tǒng)軟件兩部分,其中底層軟件主要是DSP圖像處理算法以及啟動(dòng)等運(yùn)行程序,這些程序可在CCS環(huán)境下由C語(yǔ)言編寫(xiě)并進(jìn)行匯編優(yōu)化,CCS是TI公司發(fā)布的DSP軟件運(yùn)行環(huán)境;
在系統(tǒng)軟件方面,基于PCI總線的圖像處理系統(tǒng)所面臨的難點(diǎn)頗多,其中難度最大的是PCI驅(qū)動(dòng)問(wèn)題。
3.1 系統(tǒng)軟件的設(shè)計(jì)
系統(tǒng)軟件可以選用以VxWorks為操作系統(tǒng)的嵌入式設(shè)計(jì)方法。
VxWorks操作系統(tǒng)的集成環(huán)境叫Tornado。Tor-nado集成環(huán)境是一個(gè)高效明晰的圖形化實(shí)時(shí)應(yīng)用開(kāi)發(fā)平臺(tái),它包括一套完整的、面向嵌入式系統(tǒng)的開(kāi)發(fā)和調(diào)測(cè)工具。VxWorks的優(yōu)點(diǎn)如下:
(1)具有較好的可裁減性;
(2)支持應(yīng)用程序的動(dòng)態(tài)鏈接和動(dòng)態(tài)下載;
(3)具有較好的兼容性;
(4)具有很高的可靠性和穩(wěn)定性;
(5)具有很好的實(shí)時(shí)性;
VxWorks的多任務(wù)機(jī)制對(duì)任務(wù)的控制采用優(yōu)先級(jí)搶占和輪轉(zhuǎn)調(diào)度機(jī)制,從而充分保證了實(shí)時(shí)性,并可用同樣的硬件配置滿足更強(qiáng)的實(shí)時(shí)性要求,以便為應(yīng)用開(kāi)發(fā)留下更大的余地。
PCI設(shè)備有三種物理存儲(chǔ)空間:配置空間、存儲(chǔ)器空間和I/O空間。其中配置空間是長(zhǎng)度為256字節(jié)的一段連續(xù)空間,空間定義如圖4所示,在配置空間中, 只讀空間包括設(shè)備標(biāo)識(shí)、供應(yīng)商代碼、修改版本、分類(lèi)代碼以及頭標(biāo)類(lèi)型。其中供應(yīng)商代碼用來(lái)標(biāo)識(shí)設(shè)備供應(yīng)商的代碼;設(shè)備標(biāo)識(shí)用來(lái)標(biāo)識(shí)某一特殊的設(shè)備;修改版 本標(biāo)識(shí)設(shè)備的版本號(hào);分類(lèi)代碼用來(lái)標(biāo)識(shí)設(shè)備的種類(lèi);而頭標(biāo)類(lèi)型用來(lái)標(biāo)識(shí)頭類(lèi)型以及是否為多功能設(shè)備。除供應(yīng)商代碼之外,其他字段的值可由供應(yīng)商分配。
基地址寄存器最重要的功能是分配PCI設(shè)備的系統(tǒng)地址空間。在基地址寄存器中,bit0(最低位)可用來(lái)標(biāo)識(shí)到底是存儲(chǔ)器空間還是I/O地址空間;刂 寄存器映射到存儲(chǔ)器空間時(shí),bit0為“0”,而當(dāng)其映射到I/O地址空間時(shí),bit0為“1”。
在驅(qū)動(dòng)PCI設(shè)備時(shí),首先是PCI設(shè)備的查找。嵌入式操作系統(tǒng)一般都提供有相應(yīng)的API函數(shù)查找。而在VxWorks操作系統(tǒng)中,通過(guò)函數(shù) pciFindDevicePCI_VENDOR_IDPCI_DEVICEindex &pciBus &pciDevice,&pciFunc_可以找到供應(yīng)商代碼為PCI_VENDOR_ID、設(shè)備標(biāo)識(shí)為PCI_DEVICE的第n(index+1)個(gè) 設(shè)備,并且返回總線號(hào)、設(shè)備號(hào)以及功能號(hào),然后分別保存于&pciBus、&pciDevice、&pci-Func中。
其次是PCI設(shè)備的配置。通過(guò)操作系統(tǒng)提供的API函數(shù)可以訪問(wèn)PCI設(shè)備的配置空間,從而完成PCI設(shè)備基址寄存器的配置、中斷配置、以及ROM基地址 寄存器的配置,最終得到PCI存儲(chǔ)器空間和I/O地址空間的映射以及設(shè)備中斷號(hào)等。在VxWorks操作系統(tǒng)中,訪問(wèn)PCI設(shè)備配置空間的API函數(shù)有: pciConfigOutLong和pciConfigInLong等,它們可分別完成對(duì)PCI設(shè)備配置空間的讀寫(xiě)操作。
然后是根據(jù)PCI設(shè)備的配置參數(shù)來(lái)編寫(xiě)不同設(shè)備的初始化程序、中斷服務(wù)程序以及對(duì)PCI設(shè)備存儲(chǔ)空間的訪問(wèn)程序。
3.2 遠(yuǎn)程控制與通信鏈路
由于基于串行口的PPP協(xié)通信方式現(xiàn)已被各種ISP所接受。而且VxWorks系統(tǒng)也支持PPP協(xié)議,因此,在VxWorks下通過(guò)Modem建立與ISP的物理連接,然后再完成設(shè)備的PPP數(shù)據(jù)鏈路設(shè)置,就可以通過(guò)Internet實(shí)現(xiàn)遠(yuǎn)程控制。
]]>
2 VxWorks操作系統(tǒng)簡(jiǎn)介
Vxworks就是一個(gè)由WRS公司推出的嵌入式實(shí)時(shí)操作系統(tǒng),具有多任務(wù)、可裁減、可靠性好、實(shí)時(shí)性高等特點(diǎn), 是業(yè)界公認(rèn)的性能出色的一種實(shí)時(shí)操作系統(tǒng)。VxWorks實(shí)時(shí)操作系統(tǒng)由400多個(gè)相對(duì)獨(dú)立的、短小精煉的目標(biāo)模塊組成,用戶(hù)可根據(jù)需要選擇適當(dāng)模塊來(lái)裁剪和配置系統(tǒng),這有效地保證了系統(tǒng)的安全性和可靠性。系統(tǒng)的鏈接器可按應(yīng)用的需要自動(dòng)鏈接一些目標(biāo)模塊。這樣,通過(guò)目標(biāo)模塊之間的按需組合,可得到許多滿足功能需求的應(yīng)用。VxWorks操作系統(tǒng)的基本構(gòu)成模塊主要包括以下部分:高效的實(shí)時(shí)內(nèi)核Wind、兼容實(shí)時(shí)系統(tǒng)標(biāo)準(zhǔn)POSIX、I/O系統(tǒng)、本機(jī)文件系統(tǒng)、文件I/O系統(tǒng)、網(wǎng)絡(luò)特性、虛擬內(nèi)存(可選單元VxVMI)、共享內(nèi)存(可選單元VxMP)、駐留目標(biāo)工具、Wind基類(lèi)、工具庫(kù)、性能優(yōu)化、目標(biāo)代理、板級(jí)支持包、VxWorks仿真器(VxSim)。
VxWorks中與構(gòu)建實(shí)時(shí)多任務(wù)系統(tǒng)有關(guān)的內(nèi)容如下:
1)wind內(nèi)核任務(wù)調(diào)度策略
Wind內(nèi)核采用基于優(yōu)先級(jí)的搶占式調(diào)度法作為它的缺省策略,同時(shí)它也提供了輪轉(zhuǎn)調(diào)度法。
基于優(yōu)先級(jí)的搶占式調(diào)度,具有很多優(yōu)點(diǎn)。這種調(diào)度方法為每個(gè)任務(wù)指定不同的優(yōu)先級(jí)。沒(méi)有處于阻塞或懸置態(tài)的最高優(yōu)先級(jí)任務(wù)將一直運(yùn)行下去。當(dāng)更高優(yōu)先級(jí)的任務(wù)由就緒態(tài)進(jìn)入運(yùn)行時(shí),系統(tǒng)內(nèi)核立即保存當(dāng)前任務(wù)的上下文,切換到更高優(yōu)先級(jí)的任務(wù)。而輪轉(zhuǎn)調(diào)度法分配給處于就緒態(tài)的每個(gè)同優(yōu)先級(jí)的任務(wù)一個(gè)相同的執(zhí)行時(shí)間片。
2)信號(hào)量
VxWorks信號(hào)量是提供任務(wù)間通信、同步和互斥的最優(yōu)選擇,也是提供任務(wù)間同步和互斥的主要手段。VxWorks 提供3 種信號(hào)量來(lái)解決不同的問(wèn)題。
a. 二進(jìn)制信號(hào)量:二進(jìn)制信號(hào)量(Binary)能夠滿足任務(wù)間的互斥和同步,需要的系統(tǒng)開(kāi)銷(xiāo)最小。當(dāng)一個(gè)任務(wù)調(diào)用semTake()請(qǐng)求一個(gè)信號(hào)量時(shí),如果此時(shí)信號(hào)量可用,信號(hào)量會(huì)被清零,并且任務(wù)立即繼續(xù)執(zhí)行;如果信號(hào)量不可用,任務(wù)會(huì)被阻塞來(lái)等待信號(hào)量。
b. 互斥:互斥信號(hào)量(Mutex)用來(lái)實(shí)現(xiàn)對(duì)共享資源的保護(hù),當(dāng)兩個(gè)以上的任務(wù)共享同一塊內(nèi)存緩沖區(qū)或同一個(gè)I/O設(shè)備之類(lèi)的資源時(shí),可能會(huì)發(fā)生競(jìng)爭(zhēng)狀態(tài);コ庑盘(hào)量可以通過(guò)對(duì)共享資源上鎖,實(shí)現(xiàn)高效的互斥訪問(wèn)。
c. 計(jì)數(shù)器信號(hào)量:計(jì)數(shù)器信號(hào)量(Count)是實(shí)現(xiàn)任務(wù)同步和互斥的另一種手段。計(jì)數(shù)器信號(hào)量除了像二進(jìn)制信號(hào)量那樣工作外,還保持對(duì)信號(hào)量釋放次數(shù)的跟蹤。
3) 中斷服務(wù)程序
VxWorks的所有中斷服務(wù)程序使用同一中斷堆棧,它在系統(tǒng)啟動(dòng)時(shí)就已根據(jù)具體的配置參數(shù)進(jìn)行了分配和初始化,因此,必須保證它的大小,以使它能滿足最壞的多中斷情況。為了快速響應(yīng)中斷,中斷服務(wù)程序ISR運(yùn)行在特定的空間,不同于其它任何任務(wù),中斷處理沒(méi)有任務(wù)的上下文切換。中斷也有缺陷:ISR不運(yùn)行在常規(guī)的任務(wù)上下文,它沒(méi)有任務(wù)控制塊。對(duì)于ISR的基本約束就是它們不能激活那些可能使調(diào)用程序阻塞的函數(shù)。
3 實(shí)時(shí)多任務(wù)程序設(shè)計(jì)
在一個(gè)實(shí)時(shí)系統(tǒng)中,中斷處理是至關(guān)重要的,系統(tǒng)通過(guò)中斷機(jī)制響應(yīng)外部事件,并對(duì)外部事件作出處理,系統(tǒng)對(duì)中斷的響應(yīng)速度和中斷服務(wù)程序的處理速度直接反映了實(shí)時(shí)系統(tǒng)的性能。VxWorks提供函數(shù)intconnect(),它允許將指定的C函數(shù)與任何中斷相聯(lián)系。這個(gè)指定的C函數(shù)就是這個(gè)中斷的中斷服務(wù)程序, 中斷服務(wù)程序必須盡快結(jié)束,以免阻塞低優(yōu)先級(jí)的中斷,它不同于普通的任務(wù)模塊,必須滿足特殊的要求就是不許阻塞。為了既保證中斷服務(wù)程序盡快結(jié)束而且又避免ISR在調(diào)用函數(shù)時(shí)受到約束,這時(shí)可以使用信號(hào)量來(lái)將中斷與任務(wù)相聯(lián)系,用任務(wù)來(lái)完成IRS的功能,建立實(shí)時(shí)多任務(wù)系統(tǒng)。
具體的做法為,先利用函數(shù)taskSpamn()來(lái)創(chuàng)建多個(gè)任務(wù),建立多任務(wù)環(huán)境,與中斷相聯(lián)系的任務(wù)處于高優(yōu)先級(jí),利用semTake(semID)使該任務(wù)等待信號(hào)量而處于阻塞狀態(tài),只有當(dāng)相應(yīng)的中斷到來(lái)時(shí),中斷服務(wù)程序執(zhí)行semGive(semID)給出信號(hào)量,任務(wù)得到相應(yīng)的信號(hào)量而執(zhí)行。任務(wù)間通信利用互斥信號(hào)量實(shí)現(xiàn)內(nèi)存共享。
下面以一個(gè)數(shù)據(jù)采集的程序?qū)嵗齺?lái)說(shuō)明這種實(shí)時(shí)多任務(wù)程序的設(shè)計(jì)方法。
對(duì)于一個(gè)需要定周期采樣并且還要等待外部數(shù)據(jù)準(zhǔn)備好后,讀入數(shù)據(jù)并與采樣數(shù)據(jù)融合的系統(tǒng),我們進(jìn)行了如下設(shè)計(jì),系統(tǒng)劃分為三個(gè)任務(wù),按優(yōu)先級(jí)高低排列的任務(wù)為:
a. 采樣與數(shù)字濾波(tsample);
b. 讀入數(shù)據(jù)與數(shù)據(jù)處理(tdataprocess);
c. 系統(tǒng)監(jiān)控(tmonitor)。
其中,tsample和tdataprocess通過(guò)信號(hào)量分別與定時(shí)中斷和外部數(shù)據(jù)準(zhǔn)備好中斷相聯(lián)系,它們之間的通信利用互斥信號(hào)量實(shí)現(xiàn)內(nèi)存共享。當(dāng)沒(méi)有中斷到來(lái)時(shí),任務(wù)得不到信號(hào)量而處于阻塞狀態(tài),執(zhí)行tmonitor;當(dāng)中斷到來(lái)時(shí),中斷服務(wù)程序產(chǎn)生信號(hào)量,相應(yīng)的高優(yōu)先級(jí)任務(wù)得到信號(hào)量而搶先執(zhí)行,當(dāng)高優(yōu)先級(jí)的任務(wù)執(zhí)行完后再執(zhí)行低優(yōu)先級(jí)任務(wù)。程序如下:
1)主程序創(chuàng)建三個(gè)任務(wù)和兩個(gè)中斷連接。
STATUS main (void)
{…
tidsample=taskSpawn("tsample",200,0,STACK_SIZE,(FUNCPTR)sample,0,0,0,0,0,0,0,0,0,0); tiddataprocess=taskSpawn("tDataprocess",210,0,STACK_SIZE,(FUNCPTR)dataprocess,0,0,0,0,0,0,0,0,0,0);
…}
2) 中斷服務(wù)程序只產(chǎn)生相應(yīng)的信號(hào)量。
void intSample(void){semGive(sampleSemID);}
void intDataprocess(void){semGive(dataprocessSemID);}
3)高優(yōu)先級(jí)任務(wù)等待信號(hào)量而處于阻塞狀態(tài),要取得相應(yīng)的中斷服務(wù)程序發(fā)出的信號(hào)量才能運(yùn)行。
void sample (void)
{semTake(sampleSemID,WAIT_FOREVER);
…}
void dataprocess (void)
{semTake(DataprocessSemID,WAIT_FOREVER);
…}
該程序在WxSim下運(yùn)行,在軟件邏輯分析儀WindView下顯示的運(yùn)行結(jié)果如圖1—4。
圖 3 圖 4
其中,圖3顯示的運(yùn)行過(guò)程是,任務(wù)tmonitor執(zhí)行à中斷intrupptà中斷服務(wù)程序給出信號(hào)量semGive(sampleSemID)à中斷tintà中斷服務(wù)程序給出信號(hào)量semGive(dataprocessSemID)à任務(wù)tsample得到信號(hào)量semTake(sampleSemID)à任務(wù)tsample執(zhí)行完后退出à任務(wù)dateprocess得到信號(hào)量semTake(dataprocessSemID)à任務(wù)tdataprocess執(zhí)行完后退出à任務(wù)tmonitor繼續(xù)執(zhí)行。
圖4顯示的運(yùn)行過(guò)程是:任務(wù)tmonitor執(zhí)行à中斷tintà中斷服務(wù)程序給出信號(hào)量semGive(dataprocessSemID)à任務(wù)dataprocess得到信號(hào)量semTake(dataprocessSemID)à任務(wù)tdataprocess執(zhí)行à中斷intrupptà中斷服務(wù)程序給出信號(hào)量semGive(sampleSemID)à任務(wù)tsample得到信號(hào)量 semTake(sampleSemID)à任務(wù)tsample執(zhí)行完后退出à任務(wù)tdataprocess繼續(xù)執(zhí)行,執(zhí)行完后退出à 任務(wù)tmonitor繼續(xù)執(zhí)行。
由運(yùn)行結(jié)果可以看出,與中斷對(duì)應(yīng)的任務(wù)在得到信號(hào)量后沒(méi)有立即執(zhí)行,當(dāng)中斷服務(wù)程序返回中斷點(diǎn)后,有幾微秒的延遲(Pentium ,100M),這是由于任務(wù)切換上下文造成的,這一延遲量對(duì)于系統(tǒng)的實(shí)時(shí)性影響不大,是可以接受的,程序的運(yùn)行結(jié)果達(dá)到了預(yù)期要求。
4 結(jié)束語(yǔ)
本文作者創(chuàng)新點(diǎn):在VxWorks實(shí)時(shí)操作系統(tǒng)中,使用信號(hào)量將中斷與任務(wù)相聯(lián)系,中斷服務(wù)程序只產(chǎn)生信號(hào)量,保證了中斷服務(wù)程序盡快結(jié)束,以免阻塞低優(yōu)先級(jí)的中斷;用任務(wù)來(lái)完成中斷服務(wù)程序所需要完成的功能,避免了VxWorks對(duì)中斷服務(wù)程序的約束。在軟件邏輯分析儀WindView下看到的程序運(yùn)行結(jié)果表明,該方法建立實(shí)時(shí)多任務(wù)系統(tǒng)是可行的
]]>關(guān)鍵詞:Rhapsody VxWorks 自動(dòng)取款機(jī)
引 言
隨著嵌入式應(yīng)用的不斷增長(zhǎng),嵌入式系統(tǒng)需求的復(fù)雜性、不確定性不斷提高,系統(tǒng)規(guī)模也逐步擴(kuò)大;而產(chǎn)品的研發(fā)周期又在很快地縮短,給嵌入式應(yīng)用軟件的開(kāi)發(fā)帶來(lái)了新的挑戰(zhàn)。同時(shí),嵌入式軟件的開(kāi)發(fā)者必須面對(duì)由于芯片性能的增長(zhǎng)、嵌入式操作系統(tǒng)平臺(tái)等技術(shù)方面不斷變化所帶來(lái)的各種壓力。嵌入式軟件開(kāi)發(fā)環(huán)境的發(fā)展,使一直“深埋”于系統(tǒng)的嵌入式應(yīng)用軟件變得開(kāi)放而易于開(kāi)發(fā),從而促進(jìn)了嵌入式技術(shù)的廣泛應(yīng)用。
1 基于UML的嵌入式軟件開(kāi)發(fā)環(huán)境結(jié)構(gòu)
??圖1所示為一種支持基于UML(Unified Modeling Language,統(tǒng)一建模語(yǔ)言)的迭代式開(kāi)發(fā)方法的開(kāi)發(fā)環(huán)境的結(jié)構(gòu),虛框部分為基于UML的軟件開(kāi)發(fā)環(huán)境。
??系統(tǒng)分析和設(shè)計(jì)用UML來(lái)描述,對(duì)系統(tǒng)建模;實(shí)現(xiàn)過(guò)程利用代碼自動(dòng)生成技術(shù)來(lái)實(shí)現(xiàn);測(cè)試過(guò)程將依賴(lài)于生成的代碼,通過(guò)在代碼中拆裝一些用于支持模型調(diào)試的調(diào)試信息來(lái)實(shí)現(xiàn);而代碼的編譯、鏈接則采用目標(biāo)系統(tǒng)的操作系統(tǒng)開(kāi)發(fā)環(huán)境來(lái)完成,代碼的運(yùn)行與源程序級(jí)的調(diào)試仍然采用一般的嵌入式軟件調(diào)試環(huán)境。
??Rhapsody是一個(gè)基于UML的面向嵌入式實(shí)時(shí)應(yīng)用開(kāi)發(fā)的集成、可視化環(huán)境。軟件開(kāi)發(fā)者可以在這個(gè)環(huán)境里進(jìn)行分析、設(shè)計(jì)、實(shí)現(xiàn)及驗(yàn)證。Rhapsody支持基于模型的調(diào)試;提供專(zhuān)門(mén)為實(shí)時(shí)嵌入式應(yīng)用設(shè)計(jì)的可執(zhí)行的框架,可以產(chǎn)生基于VxWorks、POS、OSE等多種操作系統(tǒng)的C語(yǔ)言、C++語(yǔ)言、Java語(yǔ)言的源程序。本文所給出的自動(dòng)取款機(jī)系統(tǒng)的模型正是基于Rhapsody設(shè)計(jì)的。
2 自動(dòng)取款機(jī)系統(tǒng)模型的設(shè)計(jì)
2.1 需求分析
??我們?cè)O(shè)計(jì)的自動(dòng)取款機(jī)系統(tǒng)要滿足如下要求:
??在自動(dòng)取款機(jī)系統(tǒng)中,當(dāng)顧客在自動(dòng)取款機(jī)操作面板上插入信用卡并輸入密碼和現(xiàn)金支取數(shù)額(每次最多只能取一千元)后,由自動(dòng)取款機(jī)讀取卡上的內(nèi)容,并把相應(yīng)信息傳送到銀行。銀行把自動(dòng)取款機(jī)送來(lái)的信息與銀行帳號(hào)上的信息進(jìn)行比較,如果兩者一致,則銀行傳送確認(rèn)信息到自動(dòng)取款機(jī),由自動(dòng)取款機(jī)輸出現(xiàn)金,然后顧客取出卡和現(xiàn)金;如果兩者不一致,則要求顧客再次輸入密碼和現(xiàn)金支取數(shù)額,然后重復(fù)上述操作;若密碼輸入三次不正確,自動(dòng)取款機(jī)就會(huì)吞掉信用卡,顧客就不能取出信用卡和現(xiàn)金。
??該自動(dòng)取款機(jī)系統(tǒng)包括1個(gè)鍵盤(pán)(10個(gè)數(shù)字鍵、ENTER鍵和CANCEL鍵)、1個(gè)LCD液晶顯示屏、1個(gè)插卡孔和1個(gè)現(xiàn)金出口;通過(guò)雙絞線與銀行中的電腦進(jìn)行串行通信。該自動(dòng)取款機(jī)系統(tǒng)不包括銀行中的電腦,只是通過(guò)軟件與銀行中的上位機(jī)進(jìn)行串行通信。
2.2 可視化建模
??建模是面向?qū)ο蠓治龊驮O(shè)計(jì)的核心,也是分析和設(shè)計(jì)過(guò)程中最基本和最關(guān)鍵的活動(dòng)之一。UML不僅適用于以面向?qū)ο蠹夹g(shù)描述的任何類(lèi)型的系統(tǒng),而且適用于系統(tǒng)開(kāi)發(fā)的不同階段。根據(jù)開(kāi)發(fā)過(guò)程中不同階段的具體要求,利用UML不同類(lèi)型的圖來(lái)描述系統(tǒng)的各種靜態(tài)結(jié)構(gòu)模型和動(dòng)態(tài)行為模型。下面介紹如何利用基于UML的面向嵌入式實(shí)時(shí)應(yīng)用開(kāi)發(fā)的集成可視化環(huán)境Rhapsody創(chuàng)建自動(dòng)取款機(jī)系統(tǒng)的模型。
圖3 取出現(xiàn)金的黑匣子場(chǎng)景
第一步:根據(jù)要求建立用例圖。
??圖2所示為用例圖。圖中給出了自動(dòng)取款機(jī)系統(tǒng)的主要用途,并表明由誰(shuí)使用自動(dòng)取款機(jī)系統(tǒng)。有一個(gè)主要成員——顧客。一個(gè)用例圖應(yīng)該具有這樣的系統(tǒng)功能:對(duì)操作者而言,它返回可觀察的結(jié)果但并不顯示系統(tǒng)的內(nèi)在結(jié)構(gòu)。
??自動(dòng)取款機(jī)系統(tǒng)的主要用途是“取出現(xiàn)金”用例。顧客參與其中的兩個(gè)實(shí)例是“輸入密碼”和“取出現(xiàn)金”。這兩個(gè)實(shí)例都包含了另一個(gè)用例“讀取卡上內(nèi)容并驗(yàn)證”。對(duì)每一個(gè)用例而言,我們都可以增加文本描述。假如需要的話,這些用例能夠被細(xì)化成另一張更多用例的圖。這些用例并沒(méi)有顯示任何內(nèi)在的結(jié)構(gòu),僅是一個(gè)功能性的視圖。
第二步:設(shè)計(jì)黑匣子場(chǎng)景。
??建立了一個(gè)用例圖后,下一步便是細(xì)化用例,即設(shè)計(jì)一些黑匣子場(chǎng)景。這些黑匣子場(chǎng)景的主要作用是表明模型和對(duì)象之間的相互關(guān)系。把整個(gè)系統(tǒng)看作一個(gè)整體,對(duì) “取出現(xiàn)金” 用例,我們細(xì)化為圖3所示的場(chǎng)景。(由于每次最多只能取一千元,所以最多只需要按鍵4次。)
??圖3所示的場(chǎng)景能被MSD(消息序列表)捕獲,用來(lái)描述在顧客和自動(dòng)取款機(jī)系統(tǒng)之間的通信行為。當(dāng)創(chuàng)建這樣的圖表時(shí),關(guān)于系統(tǒng)的更多細(xì)節(jié)被隱藏了;同時(shí),這些場(chǎng)景幫助我們更好地理解使用者如何使用報(bào)警系統(tǒng)以及需要做哪些事情?偠灾,每一用例都有很多的場(chǎng)景需要捕獲,每一個(gè)場(chǎng)景都是用例的一個(gè)有效的實(shí)例。
第三步:設(shè)計(jì)子系統(tǒng)圖。
??下一步是如何把模型分割成子系統(tǒng)。在UML中,一個(gè)子系統(tǒng)作為一個(gè)封裝顯示,即主要是一個(gè)類(lèi)的集合。圖4的子系統(tǒng)圖表明自動(dòng)取款機(jī)系統(tǒng)已經(jīng)被分解成兩個(gè)基本的部分:自動(dòng)柜員機(jī)封裝(AtmerPkg)和硬件封裝(HardharePkg)。同時(shí)也表明:自動(dòng)柜員機(jī)封裝是完全獨(dú)立于實(shí)際的硬件和硬件封裝的,并且實(shí)現(xiàn)了Ihardware接口能夠用于連接自動(dòng)柜員機(jī)封裝。接口類(lèi)Ihardware描述了對(duì)自動(dòng)柜員機(jī)封裝的所有必需的操作,實(shí)現(xiàn)了應(yīng)用與硬件環(huán)境的隔離。
??一旦在自動(dòng)柜員機(jī)封裝和硬件封裝之間定義了接口類(lèi),每一個(gè)子系統(tǒng)就能同步和獨(dú)立地細(xì)化為更多的子系統(tǒng)。每一個(gè)子系統(tǒng)都知道它和其它子系統(tǒng)之間的接口。例如,我們可以開(kāi)始分析自動(dòng)柜員機(jī)子系統(tǒng)圖,而不需要知道關(guān)于硬件的更多情況。
第四步:設(shè)計(jì)對(duì)象模型圖。
??對(duì)自動(dòng)柜員機(jī)封裝而言,我們?cè)O(shè)想有一個(gè)AtmerController類(lèi),其中包含Keypad類(lèi)、Card類(lèi)、LCD類(lèi)和Cash類(lèi),這些類(lèi)表示如圖5所示。
??圖5表明:AtmerController類(lèi)作為一個(gè)聚合類(lèi),包含了其它類(lèi)的實(shí)例。我們也能看出,我們能選擇顯示“Keypad”類(lèi)的不同的操作和屬性。在上面的例子中,假如一個(gè)實(shí)例被AtmerControlle類(lèi)創(chuàng)建,那么它將創(chuàng)建Keypad類(lèi)的一個(gè)實(shí)例theKeypad、LCD類(lèi)的一個(gè)實(shí)例theLCD、Cash類(lèi)的一個(gè)實(shí)例theCash以及Card類(lèi)的一個(gè)實(shí)例theCard。假如AtmerController類(lèi)的實(shí)例被刪除,這些包含的實(shí)例也同時(shí)被刪除。
??Ihardware類(lèi)也有一些純虛函數(shù),所以為了測(cè)試AtmerController類(lèi),必須忽略這些操作。圖6表示:ATM包含了AtmerController類(lèi)的一個(gè)實(shí)例和從Ihardware類(lèi)繼承并忽略了其操作的Hw類(lèi)的一個(gè)實(shí)例。
第五步:生成白匣子場(chǎng)景。
??生成了一個(gè)新類(lèi)AtmerController后,就可以開(kāi)始為每一個(gè)黑匣子場(chǎng)景生成白匣子場(chǎng)景。消息序列表將用于獲取以上不同場(chǎng)景的類(lèi)的實(shí)例之間的通信行為。例如,圖7消息序列描述了顧客輸入支取現(xiàn)金數(shù)額并取出現(xiàn)金的場(chǎng)景。
??消息通常對(duì)應(yīng)于對(duì)象模型中操作和操作的返回值。消息值對(duì)應(yīng)于類(lèi)的屬性或是類(lèi)操作的返回值。消息可以是同步的,也可以是異步的。從圖中可以看出,這些類(lèi)都有動(dòng)態(tài)行為:它們正在處理定時(shí)事件;調(diào)用其它類(lèi)的操作;接受事件。對(duì)UML來(lái)說(shuō),這些動(dòng)態(tài)行為都可以用一個(gè)狀態(tài)圖來(lái)表示。
第六步:創(chuàng)建狀態(tài)圖。
??以顧客輸入密碼過(guò)程為例,創(chuàng)建狀態(tài)圖,如圖8所示。通常,當(dāng)一個(gè)問(wèn)題很復(fù)雜時(shí),它往往被分解成一些簡(jiǎn)單的問(wèn)題,這也正是對(duì)顧客輸入密碼過(guò)程要做的事情。圖8所示的狀態(tài)圖描述了顧客輸入密碼過(guò)程中的行為。
圖7 顧客輸入支取數(shù)據(jù)并取出現(xiàn)金的白匣子場(chǎng)景
2.3 屬性、操作和事件
??屬性來(lái)源于需求文檔中定義的數(shù)據(jù),應(yīng)該簡(jiǎn)單,不考慮設(shè)計(jì)和實(shí)現(xiàn)的細(xì)節(jié)。每個(gè)類(lèi)都可能有定義在其上的事件和操作。事件對(duì)應(yīng)于明確的瞬時(shí)發(fā)生的影響類(lèi)的動(dòng)態(tài)行為。操作對(duì)應(yīng)于類(lèi)的服務(wù)和功能。Rhapsody中有3種事件。
① 信號(hào)事件:對(duì)應(yīng)于實(shí)例間的異步通信。
② 時(shí)間事件:這種事件在進(jìn)入一個(gè)狀態(tài)并且經(jīng)過(guò)一個(gè)指定的時(shí)間后觸發(fā)。
③ 觸發(fā)操作:觸發(fā)操作是同步的操作,通過(guò)能夠迅速得到響應(yīng)的事件得到執(zhí)行。觸發(fā)操作沒(méi)有實(shí)現(xiàn)代碼,卻可以作為類(lèi)的狀態(tài)圖轉(zhuǎn)移的觸發(fā)器。當(dāng)調(diào)用觸發(fā)操作時(shí),同時(shí)產(chǎn)生響應(yīng)的事件。
2.4 生成代碼
??一般嵌入式應(yīng)用中有60%~90%的代碼用于內(nèi)務(wù)處理(如狀態(tài)圖的實(shí)現(xiàn)、任務(wù)間的通信等),這些代碼在設(shè)計(jì)新的系統(tǒng)時(shí)一般都可以重用。這種重用一般是通過(guò)實(shí)時(shí)框架來(lái)實(shí)現(xiàn)的。Rhapsody就提供了這樣一個(gè)實(shí)時(shí)框架,它提供了一套嵌入式和實(shí)時(shí)應(yīng)用專(zhuān)門(mén)選擇和優(yōu)化的設(shè)計(jì)模板。嵌入式應(yīng)用程序一般都運(yùn)行在嵌入式操作系統(tǒng)的平臺(tái)上,而實(shí)時(shí)框架就是一個(gè)在操作系統(tǒng)之上應(yīng)用程序之下的中間件。應(yīng)用程序的編寫(xiě)或自動(dòng)產(chǎn)生都基于有統(tǒng)一接口的實(shí)時(shí)框架,這樣就使應(yīng)用軟件的開(kāi)發(fā)與具體的平臺(tái)無(wú)關(guān),解決了嵌入式應(yīng)用軟件的移植問(wèn)題。
??一旦畫(huà)出其余的圖表并創(chuàng)建好不同類(lèi)的實(shí)例后,就能進(jìn)行代碼的生成和模型的測(cè)試工作。在Rhapsody中,需要進(jìn)行一些配置,以告訴Rhapsody從哪些類(lèi)生成代碼及使用什么樣的環(huán)境。首先,使用Microsoft環(huán)境(Windows操作環(huán)境和Visual C++編譯器)。然后,代碼在Rhapsody中生成和編譯,以產(chǎn)生可執(zhí)行程序。
2.5 使UML模型有效
??Rhapsody能使用自動(dòng)生成的代碼,所以,當(dāng)實(shí)際的代碼運(yùn)行時(shí),它能返回一些信息給調(diào)試工具,以便Rhapsody進(jìn)行模型的測(cè)試。通過(guò)模型級(jí)調(diào)試、驗(yàn)證,可以盡早發(fā)現(xiàn)系統(tǒng)的設(shè)計(jì)錯(cuò)誤或缺陷,從而較早地確定或降低項(xiàng)目的風(fēng)險(xiǎn)。
2.6 測(cè)試模型
??一旦自動(dòng)柜員機(jī)封裝被手工產(chǎn)生的事件測(cè)試通過(guò)并觀察發(fā)生的情況后,就可以利用如微軟的Visual C++產(chǎn)生一個(gè)GUI。用于創(chuàng)建GUI的類(lèi)從Ihardware類(lèi)繼承而來(lái),選中set選項(xiàng),當(dāng)按鈕被按下時(shí),調(diào)用ON操作。GUI也能促使模型在模型級(jí)再次被調(diào)試。
3 在VxWorks上運(yùn)行
??模型是系統(tǒng)整體的抽象。軟件開(kāi)發(fā)的最終形式必須生成程序代碼,模型畢竟是一些漂亮的藍(lán)圖。雖然它對(duì)軟件的設(shè)計(jì)有很大的作用,但用戶(hù)的最終目的是希望得到可執(zhí)行的程序。對(duì)于嵌入式實(shí)時(shí)系統(tǒng),代碼與系統(tǒng)要求(時(shí)間約束、資源的限制等)是緊密聯(lián)系的,用最終形式的源程序驗(yàn)證系統(tǒng)的模型更準(zhǔn)確。
??Rhapsody可利用軟件自動(dòng)生成技術(shù)的成果,根據(jù)模型可以自動(dòng)生成具有產(chǎn)品質(zhì)量的代碼。這種代碼既可以作為系統(tǒng)模型驗(yàn)證的代碼,也是系統(tǒng)最后提交的代碼。所以產(chǎn)生的代碼是基于某個(gè)具體平臺(tái)的代碼,通過(guò)編譯即可運(yùn)行在該平臺(tái)上。本文采用的是美國(guó) Wind River System 公司推出的一個(gè)實(shí)時(shí)操作系統(tǒng)VxWorks。它是一個(gè)運(yùn)行在目標(biāo)機(jī)上的高性能、可裁剪的嵌入式實(shí)時(shí)操作系統(tǒng)。
??一旦自動(dòng)取款機(jī)系統(tǒng)被設(shè)計(jì)、實(shí)現(xiàn)和測(cè)試后,它就能在實(shí)時(shí)多任務(wù)操作系統(tǒng)VxWorks上實(shí)現(xiàn)。1個(gè)鍵盤(pán)、1個(gè)LCD液晶顯示屏、1個(gè)插卡孔、1根與銀行的上位機(jī)相連的雙絞線和1個(gè)輸出現(xiàn)金口經(jīng)由I/O板連接到1個(gè)目標(biāo)板上。
??從Ihardware類(lèi)繼承而來(lái)并選中set選項(xiàng)而創(chuàng)建新類(lèi)HwIrq。這些操作的實(shí)例可以被寫(xiě)進(jìn)Rhapsody中。為了寫(xiě)到I/O板中,使用VxWorks系統(tǒng)的操作sysOutByte。
??HwIrq類(lèi)已經(jīng)被設(shè)置成一個(gè)活動(dòng)類(lèi),所以它能在自己的線程運(yùn)行,線程的參數(shù)被配置如下:線程名為tRhpHw,堆棧長(zhǎng)度為4096字節(jié),優(yōu)先級(jí)為180。
??HwIrq.cpp的部分程序見(jiàn)本刊網(wǎng)絡(luò)補(bǔ)充版(http://www.dpj.com.cn)。
4 結(jié) 論
??本文運(yùn)用基于UML的嵌入式實(shí)時(shí)應(yīng)用軟件開(kāi)發(fā)環(huán)境Rhapsody來(lái)設(shè)計(jì)和實(shí)現(xiàn)自動(dòng)取款機(jī)系統(tǒng)的模型。與傳統(tǒng)的嵌入式軟件開(kāi)發(fā)方法相比,具有明顯的優(yōu)勢(shì)。它大大縮短了產(chǎn)品的開(kāi)發(fā)周期,解決了嵌入式應(yīng)用軟件的移植問(wèn)題,使軟件的開(kāi)發(fā)工作主要集中在高層的建模和模型的測(cè)試及驗(yàn)證上,從而使軟件開(kāi)發(fā)工作的焦點(diǎn)從編碼轉(zhuǎn)到了設(shè)計(jì)上。
]]>1 引言
摩托羅拉公司生產(chǎn)的MPC系列CPU基于PowerPCTM結(jié)構(gòu),它由三個(gè)模塊組成:即PowerPCTM內(nèi)核、系統(tǒng)接口單元(SIU)及通信處理模塊(CPM)[1]。三個(gè)模塊均采用32 位內(nèi)部總線。主處理器是PowerPCTM內(nèi)核,能夠?qū)崿F(xiàn)內(nèi)存管理,具有指令和數(shù)據(jù)Cache。系統(tǒng)接口單元中,存儲(chǔ)器控制單元可支持多種高性能的存儲(chǔ)器,包括SDRAM和Flash。CPM是一個(gè)RSIC處理器,具有串行通信控制器、波特率發(fā)生器等,支持多種協(xié)議的命令集,可以配置成多種通信處理模式。
VxWorks是一種實(shí)時(shí)性非常強(qiáng)的嵌入式操作系統(tǒng),具有高性能的內(nèi)核、良好的持續(xù)發(fā)展能力、以及友好的功能強(qiáng)大的開(kāi)發(fā)環(huán)境,使該系統(tǒng)越來(lái)越被用戶(hù)認(rèn)可。
目前,基于MPC860/VxWorks系統(tǒng)的應(yīng)用越來(lái)越廣泛,因此,本文對(duì)基于MPC860/VxWorks系統(tǒng)的開(kāi)發(fā)的一般流程進(jìn)行了研究。
2 開(kāi)發(fā)平臺(tái)
2.1 開(kāi)發(fā)方式介紹
進(jìn)行嵌入式系統(tǒng)開(kāi)發(fā)有多種方式,常用的方式有兩種:
(1)先進(jìn)行硬件設(shè)計(jì)開(kāi)發(fā),然后通過(guò)仿真器在目標(biāo)板上調(diào)試程序,如單片機(jī)常用的開(kāi)發(fā)方法;或者在主機(jī)上編寫(xiě)完用戶(hù)程序,將其直接編譯入內(nèi)核,整體下載入目標(biāo)板,通過(guò)主機(jī)上的交叉調(diào)試器對(duì)目標(biāo)機(jī)上的程序進(jìn)行調(diào)試,如嵌入式實(shí)時(shí)多任務(wù)系統(tǒng)開(kāi)發(fā)。
(2)軟硬件同時(shí)開(kāi)發(fā),通常一些嵌入式操作系統(tǒng)都有一個(gè)集成開(kāi)發(fā)環(huán)境,包括目標(biāo)機(jī)仿真器,可以在開(kāi)發(fā)硬件的同時(shí),在仿真器上開(kāi)發(fā)調(diào)試應(yīng)用程序,最后進(jìn)行聯(lián)合調(diào)試。
第二種方式開(kāi)發(fā)時(shí)間短,但不夠直觀,容易出錯(cuò),即使仿真成功,但在下載到目標(biāo)板后,通常還需要調(diào)試排錯(cuò)。在有硬件環(huán)境的情況下,通常采用第一種方式,尤其是開(kāi)發(fā)需要對(duì)硬件進(jìn)行直接操作的底層驅(qū)動(dòng)程序。
這里我們?cè)O(shè)計(jì)一款基于MPC860的嵌入式硬件環(huán)境,它同時(shí)具有幾種通信接口:BDM接口、串口和網(wǎng)口。系統(tǒng)開(kāi)發(fā)采用第一種開(kāi)發(fā)方式,軟件開(kāi)發(fā)流程主要包括:引導(dǎo)程序的燒寫(xiě)、下載vxworks鏡像和應(yīng)用程序下載調(diào)試等幾個(gè)主要方面。
2.2 Tornado集成開(kāi)發(fā)環(huán)境
Tornado是嵌入式實(shí)時(shí)領(lǐng)域里最新一代的開(kāi)發(fā)調(diào)試環(huán)境,提供了高效明晰的圖形化的實(shí)時(shí)應(yīng)用開(kāi)發(fā)平臺(tái),它包括一套完整的面向嵌入式系統(tǒng)的開(kāi)發(fā)和調(diào)測(cè)工具[2]。在Tornado II中,包括高性能的實(shí)時(shí)操作系統(tǒng)VxWorks、原代碼編輯器、C/C++編譯器、高性能的調(diào)試器、圖形化的瀏覽器,集成的模擬器等工具和組件。
最主要的特點(diǎn)是:Tornado支持動(dòng)態(tài)鏈接和加載,允許開(kāi)發(fā)者增量式地加載目標(biāo)模塊到目標(biāo)系統(tǒng)。動(dòng)態(tài)鏈接和加載目標(biāo)模塊的能力作為T(mén)ornado結(jié)構(gòu)的核心,使開(kāi)發(fā)者避免了在宿主機(jī)上鏈接應(yīng)用到內(nèi)核,然后再下載整個(gè)可執(zhí)行體到一個(gè)靜態(tài)環(huán)境的這樣通常采用的步驟。這樣,就大大地縮短了每個(gè)編輯—測(cè)試—調(diào)試的周期。
Tornado II工具提供一個(gè)高度可視化和自動(dòng)化的開(kāi)發(fā)環(huán)境,加快了基于VxWorks的應(yīng)用開(kāi)發(fā)。
3 開(kāi)發(fā)方案
3.1 系統(tǒng)引導(dǎo)程序編程與bootrom燒寫(xiě)
(1)系統(tǒng)引導(dǎo)程序編程
目標(biāo)系統(tǒng)啟動(dòng)工作首先要進(jìn)行系統(tǒng)初始化,對(duì)不同的CPU,系統(tǒng)初始化的基本步驟是類(lèi)似的,主要步驟如下:
啟動(dòng);
禁止中斷;
放boot type(引導(dǎo)類(lèi)型)到堆棧;
清空指令和數(shù)據(jù)緩存。
VxWorks 系統(tǒng)的 PowerPC BSP系統(tǒng)開(kāi)機(jī)后,處理器是從romInit()函數(shù)開(kāi)始執(zhí)行,這是romInit.s 中的第一段程序。在romInit()函數(shù)中必須完成以上功能,這些功能程序通常使用匯編語(yǔ)言來(lái)寫(xiě)。在romInit()程序中開(kāi)始執(zhí)行C程序之前必須盡可能少的加載設(shè)備。引導(dǎo)程序結(jié)束時(shí),得到C程序romStart()在ROM中的地址,保證romInit執(zhí)行結(jié)束后,系統(tǒng)跳轉(zhuǎn)執(zhí)行romStart(),將文本和數(shù)據(jù)段從ROM復(fù)制到RAM中。
在系統(tǒng)初始化程序段中,可加入串口初始化程序和驅(qū)動(dòng)程序,使系統(tǒng)引導(dǎo)結(jié)束后可支持使用串口傳輸命令和信息。加入下載命令程序段,以便于下載VxWorks內(nèi)核鏡像文件。
(2)bootrom燒寫(xiě)
bootrom燒寫(xiě)方式有多種,可以使用編程器編程,但對(duì)于在線系統(tǒng)調(diào)試,為方便修改,現(xiàn)在使用較多的是JTAG 調(diào)試器和BDM調(diào)試器。我們的系統(tǒng)采用的是MPC系列的CPU MPC860,它提供有BDM接口。因此可以很方便的使用BDM 調(diào)試工具編程。
MPC BDM調(diào)試工具通過(guò)宿主機(jī)的打印口與MPC BDM接口電纜相連,然后加到目標(biāo)板的BDM接口上。連接BDM和目標(biāo)板的電源,(此時(shí)也可以將串口線和網(wǎng)線連接到主機(jī)上)。在燒寫(xiě)程序之前,將以上編寫(xiě)的程序編譯成二進(jìn)制目標(biāo)代碼拷貝到c:\sds74\cmd\init下。
打開(kāi)SDS74調(diào)試軟件,首先要下載燒寫(xiě)boot的文件,然后執(zhí)行run/go命令,大約需要幾分鐘,boot燒寫(xiě)完成。
將boot燒好后,拔掉bdm和目標(biāo)板的電源以及bdm電纜,然后再插上目標(biāo)板的電源,boot將運(yùn)行,正常時(shí)會(huì)在主機(jī)的串口超級(jí)終端顯示如下信息:BOOT>,此時(shí)可以說(shuō)boot燒寫(xiě)成功。
3.2下載和運(yùn)行VxWorks內(nèi)核鏡像
在可引導(dǎo)的MPC860嵌入式平臺(tái)上,使用串口和網(wǎng)絡(luò)傳輸數(shù)據(jù),進(jìn)行BSP和應(yīng)用程序調(diào)試。相對(duì)于使用串口傳輸數(shù)據(jù),使用網(wǎng)絡(luò)傳輸具有速度快,因此使用串口進(jìn)行發(fā)送命令和返回信息,使用網(wǎng)口傳輸數(shù)據(jù)[6](如圖1)。
主機(jī) 目標(biāo)機(jī)
WindRiver公司提供了很多基于不同硬件平臺(tái)的典型的板級(jí)支持包BSP。因此,開(kāi)發(fā)基于VxWorks的實(shí)用板級(jí)支持包是盡量獲得一個(gè)與目標(biāo)板硬件環(huán)境相近的參考板級(jí)支持包和相關(guān)代碼模板,再根據(jù)目標(biāo)板硬件環(huán)境,完成板級(jí)支持包包含的驅(qū)動(dòng)程序及設(shè)備初始化,從而完成板級(jí)支持包的開(kāi)發(fā)[4]。
啟動(dòng)Tornado II集成開(kāi)發(fā)環(huán)境,使用工程向?qū)?chuàng)建一個(gè)可啟動(dòng)工程(bootable VxWorks image)項(xiàng)目,選擇基于ads860的BSP。在這個(gè)工程項(xiàng)目里可以進(jìn)行BSP的基本配置、VxWorks的基本配置、網(wǎng)卡配置等,結(jié)合實(shí)際電路和應(yīng)用進(jìn)行修改,創(chuàng)建用戶(hù)自己的BSP以支持特定硬件。前述bootrom程序也可由此生成。在此階段可以借助WDB調(diào)試代理和Tornado工具輔助開(kāi)發(fā),也可以選擇在線仿真器ICE輔助開(kāi)發(fā)。
BSP 調(diào)試完成,編譯此工程項(xiàng)目為一個(gè)VxWorks內(nèi)核鏡像文件*.img,在以后的應(yīng)用程序調(diào)試過(guò)程中可通過(guò)Tornado的一個(gè)部件 ftp server下載。下載方法如下:
首先連接主機(jī)與目標(biāo)板的網(wǎng)線和串口線,目標(biāo)板上電后,在超級(jí)終端窗口3秒以?xún)?nèi)按回車(chē)鍵進(jìn)入boot shell;否則,目標(biāo)機(jī)系統(tǒng)會(huì)進(jìn)入自動(dòng)尋找并運(yùn)行程序狀態(tài)。
此時(shí)啟動(dòng)和配置ftp server,選擇Security菜單中的user/rights命令,添加一個(gè)用戶(hù)名如target,密碼target,設(shè)置主目錄為C:\;然后點(diǎn)擊Done。ftp server配置完成。
現(xiàn)在需要設(shè)置主機(jī)ip地址。將主機(jī)ip設(shè)為192.168.1.1,子網(wǎng)掩碼255.255.255.0。將調(diào)試好的VxWorks鏡像文件*.img拷貝到C:\。
最后,在主機(jī)的串口超級(jí)終端中輸入設(shè)置好的下載命令@,目標(biāo)板開(kāi)始從主機(jī)的ftp server下載*.img(vxworks的ram鏡像)。
下載完成,*.img文件自動(dòng)運(yùn)行,在超級(jí)終端窗口顯示vxworks鏡像在目標(biāo)板啟動(dòng)成功的信息,此時(shí)vxworks內(nèi)核已經(jīng)成功裝載到目標(biāo)板,可以同主機(jī)的tornado(vxworks的集成開(kāi)發(fā)環(huán)境)進(jìn)行連接了。
3.3 在tornado中編寫(xiě)和運(yùn)行應(yīng)用程序
當(dāng)上述環(huán)境配置成功后就可以進(jìn)行應(yīng)用程序開(kāi)發(fā)了。在tornado集成開(kāi)發(fā)環(huán)境中可以開(kāi)發(fā)并調(diào)試各種應(yīng)用程序,添加程序并編譯成功后就可以下載到目標(biāo)板上進(jìn)行調(diào)試了。下面通過(guò)一個(gè)應(yīng)用程序調(diào)試示例加以說(shuō)明。
4 開(kāi)發(fā)應(yīng)用程序示例
4.1 開(kāi)發(fā)并編譯程序
啟動(dòng)Tornado II集成開(kāi)發(fā)環(huán)境,使用工程向?qū)?chuàng)建一個(gè)可下載工程(downloadable application modules)項(xiàng)目project1,在創(chuàng)建過(guò)程中選擇工具鏈(toolchain)為PPC860gnu。在工程項(xiàng)目中編寫(xiě)或添加應(yīng)用程序源文件,如一個(gè)Hello.c文件。
#include "vxworks.h"
#include "drv/multi/ppc860Siu.h"
void root()
{
printf("hello!How are you?\n"); /*在終端輸出此信息*/
}
#define PD10 (0x0020)
#define PD09 (0x0040)
#define RUNLIGHT PD10
#define LINKLIGHT PD09
void RunLight(void)
{
int immrVal = vxImmrGet();
*PDDIR(immrVal)|=RUNLIGHT;
while(1)
{
*PDDAT(immrVal) ^=RUNLIGHT;
taskDelay(sysClkRateGet()/2);/*delay 0.5 second*/
}
}
void run()
{
taskSpawn ("RunLight", 100,0 /*switchTaskOptions*/,0x1000,
(FUNCPTR)RunLight, 0,0,0,0,0,0,0,0,0,0);
} /*通過(guò)以上函數(shù)創(chuàng)建并激活一個(gè)新任務(wù),點(diǎn)亮系統(tǒng)指示燈*/
4.2 配置和運(yùn)行target server
使用Tornado編譯器編譯成功后下載。下載之前首先要配置和運(yùn)行target server,在菜單tool/target server/configure中,先點(diǎn)擊new新建一個(gè)配置如configuration1, 然后開(kāi)始配置。
在target server proportion 項(xiàng)的“Back End”的選項(xiàng)中選擇wdbrpc;
在target server proportion 項(xiàng)的“Core File and Symbols”的選項(xiàng)中設(shè)置vxworks鏡像文件位置為C:\;
在target name/ip address輸入目標(biāo)板的ip 地址192.168.1.254;
配置完成,點(diǎn)擊Launch運(yùn)行;
下面可以下載和運(yùn)行應(yīng)用程序了。
4.3下載和運(yùn)行程序
在工程上點(diǎn)擊右鍵,選擇download project1.out下載應(yīng)用程序到目標(biāo)板,然后可以在Tornado中的shell里運(yùn)行應(yīng)用程序了,如在shell中運(yùn)行hello.c中的root函數(shù)(在shell中打印hello!How are you?)和run(目標(biāo)板的run燈會(huì)閃亮)。
在每次下載調(diào)試應(yīng)用程序或添加新的應(yīng)用程序時(shí)都不需要把它們和vxworks內(nèi)核編譯到一起,這樣節(jié)省了開(kāi)發(fā)和調(diào)試時(shí)間。
5 總結(jié)
本文描述了基于嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks的開(kāi)發(fā)方法,憑借性能優(yōu)良的VxWorks和高度集成的開(kāi)發(fā)環(huán)境,VxWorks的應(yīng)用已成為新的研究熱點(diǎn)。在開(kāi)發(fā)過(guò)程中使用相近的BSP開(kāi)發(fā)用戶(hù)自己的板級(jí)支持包,難度降低了并縮短了開(kāi)發(fā)時(shí)間,使用ftp server下載VxWorks內(nèi)核鏡像,使用Torndo 工具編譯、調(diào)試和下載應(yīng)用程序。通過(guò)這樣的流程對(duì)應(yīng)用程序的開(kāi)發(fā)帶來(lái)了極大的方便,該方法已得到廣泛應(yīng)用。
本文作者創(chuàng)新點(diǎn):對(duì)基于VxWorks嵌入式操作系統(tǒng)在MPC8XX系列cpu上的開(kāi)發(fā)過(guò)程進(jìn)行了具體而實(shí)用的描述。有一定的應(yīng)用價(jià)值。