www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]摘要:介紹某嵌入式Java運行平臺的總體框架;在此基礎(chǔ)上,詳細討論為該平臺開發(fā)的數(shù)據(jù)庫(DB)引擎組件的框架和結(jié)構(gòu)組成,描述該組件實現(xiàn)的SQL子集和數(shù)據(jù)表達方式以及邏輯算法

摘要:介紹某嵌入式Java運行平臺的總體框架;在此基礎(chǔ)上,詳細討論為該平臺開發(fā)的數(shù)據(jù)庫(DB)引擎組件的框架和結(jié)構(gòu)組成,描述該組件實現(xiàn)的SQL子集和數(shù)據(jù)表達方式以及邏輯算法的設(shè)計思路;提出該組件今后的改進設(shè)想。 關(guān)鍵詞:數(shù)據(jù)庫引擎 Java 嵌入式系統(tǒng) 引言 隨著嵌入式系統(tǒng)CPU硬件從8位到32位的發(fā)展,嵌入式系統(tǒng)軟件的開發(fā)環(huán)境也得到迅猛的發(fā)展,編程語言從10多年以前的匯編為主流發(fā)展到現(xiàn)在C、C++、 Java為主流。另外,面向?qū)ο笤O(shè)計技術(shù)、組件技術(shù)等在嵌入式系統(tǒng)軟件設(shè)計中的應(yīng)用也日益引起人們的重視。 在嵌入式系統(tǒng)軟件開發(fā)領(lǐng)域,Java是一門較新的異軍突起的編程語言。其優(yōu)點是語言本身簡潔優(yōu)美,完全按照面向?qū)ο笏枷朐O(shè)計,并且語言引入許多較為先進的特性,如多線程、自動內(nèi)存管理和垃圾回收,非常適合于大規(guī)模復(fù)雜軟件系統(tǒng)的開發(fā)。其不足點是與硬件結(jié)合不夠緊密,同時代碼運行速度較慢。此外,對于內(nèi)存的使用,程序難于管理和控制。 由于采用Java編程具有如上所述的眾多優(yōu)點,越來越多的嵌入式系統(tǒng)采用Java技術(shù)來構(gòu)造軟件系統(tǒng)。本文在介紹基于日本某自動售貨機產(chǎn)品的控制板的 Java運行平臺基礎(chǔ)上,詳細討論筆者為其平臺開發(fā)的DB引擎的組成和設(shè)計思路。

1 Java運行環(huán)境平臺 圖1所示為Java運行環(huán)境的總體框架示意圖。本系統(tǒng)為克服Java的解釋執(zhí)行機制所引起的執(zhí)行速度慢的問題,在硬件上采用了Sun公司開發(fā)的Pico Java芯片。它能夠直接執(zhí)行Java的二進制代碼,使Java的執(zhí)行速度提高一個數(shù)量級以上。在硬件層的上面是OS層,本系統(tǒng)采用的是ITRON(日本東京大學(xué)坂村鍵教授設(shè)計的一種嵌入式操作系統(tǒng),雖然在日本以外的市場影響不大,但在日本本地市場,占有率達90%以上)。由于ITRON規(guī)格制定得比較早,并且為兼顧低端嵌入式應(yīng)用的場合,ITRON總體上功能比較簡單,并未把諸如TCP/IP、文件系統(tǒng)等內(nèi)容包含在其里面,因此與嵌入式Linux等不一樣的是,TCP/IP、文件系統(tǒng)是以獨立的組件形式存在的。在OS層的上面是JVM層。與其它一般Java虛擬機不同的是,本系統(tǒng)的Java執(zhí)行代碼不需要由JVM解釋執(zhí)行,而是由CPU硬件直接執(zhí)行。在JVM的上層是自動售貨機的基礎(chǔ)平臺類庫和公共組件層。本文介紹的DB引擎組件正是處于這一層。該層的上面是應(yīng)用程序?qū)樱糜趯崿F(xiàn)自動售貨機的各種控制、管理機能。 2 嵌入式系統(tǒng)DB引擎 2.1 DB引擎組件的引入 眾所周知,在臺式機領(lǐng)域,DB是一個十分關(guān)鍵的基礎(chǔ)軟件。以往嵌入式系統(tǒng)的軟件可能更側(cè)重于與硬件的交互與控制,但隨著對嵌入式系統(tǒng)功能需求的日益復(fù)雜化,嵌入式系統(tǒng)軟件中,信息、數(shù)據(jù)的保存與管理的比重也日益增加。在這樣的背景下,嵌入式系統(tǒng)軟件開發(fā)中,通過引入DB組件,對實現(xiàn)軟件整體框架結(jié)構(gòu)的組件化與簡單化,有著十分明顯而重要的意義。 2.2 DB引擎組件的總體框架 如圖2所示,將整個DB組件設(shè)計為3層結(jié)構(gòu),分別為JDBC接口層、SQL解釋層和動作執(zhí)行層。這3層之間呈單向依賴關(guān)系。也就是說,SQL解釋層依賴于動作執(zhí)行層,但動作執(zhí)行層不依賴于其上面的兩層,可以單獨存在而直接被使用。如果用戶以使用方便為主要目的,可采用完全配置方式,應(yīng)用程序通過JDBC接口層存取數(shù)據(jù)。反之,如果用戶對空間和效率要求較高,可僅配置動作執(zhí)行層組件,應(yīng)用程序直接調(diào)用動作執(zhí)行層的API進行數(shù)據(jù)的檢過和更新等操作。 (1)JDBC接口層 如前文所述是可選組件,旨在為應(yīng)用程序提供一個標準的DB調(diào)用接口。 (2)SQL解釋層 本DB組件實現(xiàn)的SQL解釋層,只實現(xiàn)了標準SQL的一個小子集,主要完成select、delete、insert、update、create table、drop table等功能。其中數(shù)據(jù)操作語句(select、delete、insert、update)的解釋要點之一是where條件子句的解釋執(zhí)行,類似于數(shù)學(xué)表達式求值算法。本文采用簡單直觀的“算符優(yōu)先法”。該算法使用兩個工作棧,一個稱作OPTR棧,用以寄存運算符;另一個稱作OPND棧,用以寄存操作數(shù)或運算結(jié)果。算法的基本思想是: ①首先置操作數(shù)棧為空,表達式起始符“#”為運算棧的棧底元素;

②依此讀入表達式中每個Token。若是操作數(shù),則進OPND棧adk是運算符,則和OPTR棧的棧頂運算符比較優(yōu)先權(quán)后作相應(yīng)操作,直至整個表達式求值完畢(即OPTR棧的棧頂元素和當前讀入的Token均為“#”。 本文實現(xiàn)的SQL子集描述如下: 預(yù)定義 :=<日期> := :=[,[,[…]]] :=[,[…] ]] := =│==│!=│<>│>│>=│<│<= :=[,[,[…]]] <統(tǒng)計函數(shù)名>:=MIN│MAX│COUNT│SUM <統(tǒng)計函數(shù)>:=<統(tǒng)計函數(shù)>() <統(tǒng)計list>:=<統(tǒng)計函數(shù)>,[,<統(tǒng)計函數(shù)>[,<統(tǒng)計函數(shù)>[…]]] <數(shù)據(jù)類型>:=INT│UNMBER│CHAR│DATE :=文遞歸定義式 :=() :=NOT :=OR :=AND SQL文定義式 ①SELECT*|FROM[WHERE][ORDER BY[ASC|DESC]] ②SELECT<統(tǒng)計list>FROM[WHERE] ③UPDATESET[WHERE] ④INSERT INTO[()]VALUES() ⑤DELETE FROM[WHERE] ⑥CREATE TABLE(<數(shù)據(jù)類型>[,<數(shù)據(jù)類型>[,<數(shù)據(jù)類型>[…]]]) ⑦DROP TABLE注:|表示多選個,<>表示某定義項目,[]表示可選項目,…代表循環(huán)省略表示。 (3)動作執(zhí)行層 動作執(zhí)行層是整個DB組件的核心和關(guān)鍵,因為所有的DB操作最終都由該層完成,同時用戶也可以跳過上面的兩層,直接調(diào)用該層的API,以實現(xiàn)相同的數(shù)據(jù)操作功能。下面介紹其主要設(shè)計要點和思路。 2.3 數(shù)據(jù)的表達與存儲 由于嵌入式系統(tǒng)的資源十分有限,不能引入復(fù)雜的算法和數(shù)據(jù)存儲格式,同時由于Java對二進制數(shù)據(jù)的處理十分不便,本文最終采用CSV格式來保存表數(shù)據(jù)。其要點是: ①各字段數(shù)據(jù)之間采用「,」分開; ②如果字段數(shù)據(jù)本身包含有「,」,則將整個字段數(shù)據(jù)用引號「」括起來; ③如果字段數(shù)據(jù)本身包含有引號「”」,則將引號「”」改寫為兩個重疊的引號「””」,依次類推。其次,每個記錄占文本文件的個行,每一個數(shù)據(jù)表與一個物理數(shù)據(jù)文件一一對應(yīng)。 采用這種方式處理的優(yōu)點是: ①全部數(shù)據(jù)都是采用字符串保存,Java處理起來十分方便; ②對不定長字段的保存處理與定長字段處理統(tǒng)一,不需要額外的附加處理,而且存儲效率高; ③對多字節(jié)文字的處理程序不需要額外的編碼轉(zhuǎn)換處理,由JVM平臺本身的功能可以自動完成。 當然,采用這種處理方式也存在其不足之處: ①由于在數(shù)據(jù)文件中,每條記錄的長度不定,數(shù)據(jù)即使局部更新,也必須重寫整個文件; ②由于同樣原因,單條記錄的檢索難于直接定位,而必須讀入整個數(shù)據(jù)文件。 為彌補由此產(chǎn)生的性能下降,本文采用數(shù)據(jù)Cache加以克服。也就是說,盡可能將數(shù)據(jù)緩存在內(nèi)存中,通過減少對物理文件的讀寫操作來提高數(shù)據(jù)的性能。 2.4 多線程數(shù)據(jù)存取的同步與互斥 在Java虛擬機環(huán)境下,沒有多進程的概念,但對于多任務(wù)的處理提供了多線程的手段。本DB引擎組件是公共組件,供上層多個應(yīng)用程序組件共同使用。由于上層的每個應(yīng)用程序組件本身由一個或數(shù)個線程來執(zhí)行,因此,DB引擎組件必須考慮多個線程同時存取某個數(shù)據(jù)時可能引起的沖突問題。對于該問題的解決辦法,一般是采用DB鎖定的方法。關(guān)于DB鎖定,進一步細分的話,可區(qū)分為讀鎖和寫鎖;根據(jù)鎖定粒度的粗細可分為按表鎖、按Page鎖、按記錄鎖等,不一而足。 為設(shè)計和實現(xiàn)的簡單起見,本DB引擎組件提供按表鎖定的方式,同時不區(qū)分讀寫鎖之間的區(qū)別。這樣,大大簡化了SQL語句的分析和處理過程,并且可以直接把鎖定操作與表的open操作相關(guān)聯(lián),鎖解除與表的close操作相關(guān)聯(lián)。實現(xiàn)時,對應(yīng)表對象Table的每一個實例,設(shè)置一個field變量,用于保存鎖定狀態(tài),再利用Java語言提供的synchronized手段同,可以較為方便地實現(xiàn)數(shù)據(jù)表的鎖定功能。代表示例如下: //表鎖定。為了避免死鎖,有超時判斷邏輯 synchronized void lock()throws DBError{ long t2,t1; t1=System.currentTimeMillis(); //由于可能出現(xiàn)在wait語句被喚醒而卻得不到表鎖的情況,為提高超時邏輯判斷精度,采用循環(huán) while(isLocked){ try{ wait(DBError.TIMEOUT/10); }catch(Exception e){e.printStackTrace();} //超時判斷 t2=System.currentTimeMillis(); if(t2-t1>DBError.TIMEOUT)break; } //發(fā)生超時退出循環(huán)情況,拋出例外 if(isLocked){ throw new DBError(DBError.TIMEOUT_ERR,name); } //設(shè)定鎖定標志 isLocked=true; } //表打開操作 //參數(shù)ro只讀打開標志 void open(Boolean ro)throws DBError{ lock(); readOnly=ro; //表數(shù)據(jù)讀入 load(); } //表關(guān)閉操作(同時釋放鎖) public synchronized void close() throws DBError{ if(isLocked==false)return; //關(guān)閉前,保存數(shù)據(jù) if(isDirty)save(); if(isUnload)unload(); //釋放鎖,通知其它等待線程 isLocked=false; notify(); } 圖3 DB引擎組件主要類的關(guān)系 2.5 DB組件實現(xiàn)的結(jié)構(gòu)設(shè)計 圖3所示為DB引擎組件的主要類之間的關(guān)系。其中,Database為數(shù)據(jù)庫類,用于描述和管理整個數(shù)據(jù)庫對象Table為數(shù)據(jù)表類,用于描述和管理表對象;TableData用于描述和管理保存表數(shù)據(jù)的物理介質(zhì)(文件);Field為字段類,用于描述和管理字段類型信息;Record為記錄類,描述一條數(shù)據(jù)記錄。為簡化處理,本組件將Database類設(shè)計為singleton模式,即本組件只能創(chuàng)建一個Database實例。這對于嵌入式系統(tǒng)來說,大部分場合已經(jīng)足夠。與數(shù)據(jù)庫的一般物理概念相對應(yīng),1個Database實例包含n個Table實例,1個Table實例包含n個Field實例。同時,1個Table實例包含1個TableData實例,1個TableData實例包含n個Record實例。 Connection類用于管理用戶訪問數(shù)據(jù)庫的會話(Session)過程。對應(yīng)一個用戶的一次會話過程,生成一個Connection實例。 Connection類對象保存著當前Session打開的Table列表,當用戶提交執(zhí)行某SQL語句而需要鎖定某個Table時,系統(tǒng)首先檢查該表是否已經(jīng)在當前Session已打開的Table列表中。如果已經(jīng)被打開,則不需要進行重復(fù)的鎖定操作,直接反回對應(yīng)的Table對象實例。反之,如果尚未包含在打開的Table列表中,表明當前Session尚未打開和鎖定該表,必須執(zhí)行該表的打開和鎖定操作(如果該表已被其它Session打開,則必須等待到其它Session翻放該表為止)。 本DB組件還支持commit與rollback事務(wù)處理。能夠在如此微小的DB組件實現(xiàn)事務(wù)處理,主要得益于上述的Session管理框架。在 Table類commit與rollback處理基礎(chǔ)上,當一個Session執(zhí)行commit或rollback操作時,對包含在打開列表中的每個 Table實例,調(diào)用執(zhí)行相應(yīng)的commit或rollback處理即可。 3 結(jié)語與展望 本DB組件已實際運行了大約兩年時間。這期間除了對該組件進行一些功能追加以外,主體框架上基本保持不變,從而在一定程序上表明了該設(shè)計框架的可行性和合理性。該組件編譯以后,class文件形成的jar包大小約為68KB,短小精度悍,便于使用。當然,該DB組件目前仍然存在一些不足:首先,較為關(guān)鍵的一點是速度問題。一直以來,Java的執(zhí)行速度問題就是受批語的缺點所在,因此采用它實現(xiàn)自然也避免不了這人瓶頸。今后改進的思路之一是,將其中Java 處理效率不高的部分移出Java,采用C實現(xiàn);二者通過JNI手段加以連接,以提高總體的運行速度。第二點需要改進的地方是表鎖定的粒度問題。由于目前只能整個表進行鎖定,并且不區(qū)分讀鎖定與寫鎖定,因此粒度較粗。雖然這樣實現(xiàn)起來較為簡單,但在多任務(wù)處理環(huán)境中可能增加不必要的時間等待。最后,JDBC 接口的實現(xiàn)目前還不完全,需要加以完善。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅(qū)動電源設(shè)計中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計成為提升電機驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設(shè)計、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉