天天被操天天被操综合网,亚洲黄色一区二区三区性色,国产成人精品日本亚洲11,欧美zozo另类特级,www.黄片视频在线播放,啪啪网站永久免费看,特别一级a免费大片视频网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>電子通信論文>使用C++構(gòu)建嵌入式開(kāi)發(fā)框架

使用C++構(gòu)建嵌入式開(kāi)發(fā)框架

時(shí)間:2023-02-21 00:06:11 電子通信論文 我要投稿
  • 相關(guān)推薦

使用C++構(gòu)建嵌入式開(kāi)發(fā)框架

摘要:框架作為一種大粒度的重用技術(shù)在桌面軟件開(kāi)發(fā)中得到了廣泛應(yīng)用,而在嵌入式開(kāi)發(fā)領(lǐng)域,目前還沒(méi)有一套完整的標(biāo)準(zhǔn)框架可供使用。本文以通信領(lǐng)域的嵌入式軟件開(kāi)發(fā)為例,介紹使用C++語(yǔ)言,在ARM平臺(tái)Nucleusplus操作系統(tǒng)下實(shí)現(xiàn)嵌入式開(kāi)發(fā)框架EFC的方法和應(yīng)用實(shí)例。
  關(guān)鍵詞:框架C++ARMNucleusMFCEFC面向?qū)ο?br />  
  1框架概述
  
  1.1什么是框架
  
  國(guó)外著名的軟件設(shè)計(jì)大師RalphJohnson對(duì)面向?qū)ο蠹夹g(shù)進(jìn)行了長(zhǎng)期而深入的研究。在他的主頁(yè)中,對(duì)框架進(jìn)行了如下定義:Aframeworkisareusabledesignexpressedasasetofabstractclassesandthewaytheirinstancescollaborate.Itisareusabledesignforallorpartofasoftwaresystem.(框架是整個(gè)系統(tǒng)或系統(tǒng)的一部分的可重用性設(shè)計(jì),由一組抽象出來(lái)的類及其實(shí)例間的相互作用方式組成。)
  
  框架把一個(gè)系統(tǒng)有機(jī)地分解成一組相對(duì)獨(dú)立的構(gòu)件,并定義了各個(gè)構(gòu)件間的接口和作用關(guān)系,符合軟件工程中設(shè)計(jì)的模塊化、獨(dú)立化和信息隱藏等特征?蚣芴峁┝艘粋(gè)大粒度的重用技術(shù),即不僅支持源代碼級(jí)的重用,而且支持分析和設(shè)計(jì)以及體系結(jié)構(gòu)的重用,因而被認(rèn)為是一種最有前途的面向?qū)ο蠹夹g(shù)。
  
  框架必須是健壯的、可擴(kuò)展的、靈活的,它要求基于開(kāi)放或共享標(biāo)準(zhǔn)?蚣艿脑O(shè)計(jì)要力求做到完備性、靈活性、可擴(kuò)展性、可理解性,同時(shí)抽象能用于不同的場(chǎng)合;用戶能輕松地添加和修改功能,定制框架;用戶和框架的交互清晰,文檔齊全?蚣茉O(shè)計(jì)的一個(gè)核心問(wèn)題就是發(fā)現(xiàn)可重用的設(shè)計(jì)和“熱點(diǎn)”,以保證框架具備充分的靈活性,使用戶能在已有構(gòu)件的基礎(chǔ)上生成應(yīng)用程序,實(shí)現(xiàn)“零代碼編寫(xiě)”的理想目標(biāo)。
  
  1.2如何設(shè)計(jì)框架
  
  目前框架的設(shè)計(jì)大都采用實(shí)踐法。實(shí)踐法是指從若干個(gè)具體的典型應(yīng)用中,抽象出現(xiàn)似點(diǎn)來(lái)構(gòu)建框架;框架反過(guò)來(lái)又應(yīng)用于不同的問(wèn)題,并在解決不同問(wèn)題的過(guò)程中得到更新;在框架的設(shè)計(jì)和實(shí)現(xiàn)的兩步中,不斷反復(fù),等到框架逐漸成熟時(shí),需要修改和反復(fù)的內(nèi)容就會(huì)越來(lái)越小。具體步驟為:分析問(wèn)題域,確定所需框架,從一類應(yīng)用而不是單個(gè)的程序去分析、比較各種不同的軟件解決方案,尋求這些方案的共性和每個(gè)程度的唯一性特性。這些共性,尤其是那些經(jīng)常被多個(gè)程序使用的部分將成為框架的基礎(chǔ)。然后,定義框架體系結(jié)構(gòu)并設(shè)計(jì),包括設(shè)計(jì)用戶與框架間的交互、給用戶提供的最終工具等。
  
  框架的實(shí)現(xiàn):包括框架核心類的實(shí)現(xiàn)、框架的測(cè)試、框架的試運(yùn)行、框架的反復(fù)更新。
  
  框架的部署:包括文檔的提供和分發(fā)過(guò)程、為用戶提供技術(shù)支持、維護(hù)和更新框架。
  
  2嵌入式框架EFC
  
  框架技術(shù)在桌面軟件的開(kāi)發(fā)中得到了廣泛的應(yīng)用,但在嵌入式開(kāi)發(fā)領(lǐng)域,由于嵌入式開(kāi)發(fā)的多樣性及嵌入式操作系統(tǒng)的多樣性,目前還沒(méi)有一套完整的開(kāi)發(fā)框架可供使用。因此,在嵌入式軟件開(kāi)發(fā)中常常是從底層做起,應(yīng)用程序和RTOS密不可分。這樣的開(kāi)發(fā)方式不但效率不高,也不利于軟件的移植。
  
  EFC(EmbeddedFoundationClasses)即嵌入式基礎(chǔ)類庫(kù),是筆者借鑒Microsoft公司的MFC(微軟基礎(chǔ)類庫(kù)—桌面系統(tǒng)框架庫(kù)的工業(yè)標(biāo)準(zhǔn))構(gòu)建的一套在ARM平臺(tái)Nucleusplus操作系統(tǒng)下的嵌入式開(kāi)發(fā)框架。由于框架全部采用C++開(kāi)發(fā),沒(méi)有和處理器相關(guān)的匯編代碼,所以在其它硬件平臺(tái)可不加修改地使用。如果更換不同的操作系統(tǒng),則需要修改操作系統(tǒng)抽象層的部分代碼;但由于EFC提供給上層應(yīng)用程序的接口不變,所以應(yīng)用程序不需要修改代碼。
  
  圖2EFC靜態(tài)結(jié)構(gòu)圖
  
  就軟件的層次來(lái)說(shuō),EFC是一個(gè)操作系統(tǒng)之上、應(yīng)用程序之下的中間件,如圖1所示。在EFC中有一個(gè)操作系統(tǒng)抽象層,對(duì)RTOS進(jìn)行了抽象和封裝,提供包括任務(wù)(task)、/O驅(qū)動(dòng)(driver)、定時(shí)器(timer)、信號(hào)量(semaphore)、消息隊(duì)列(quecue)、事件(eventgroup)、郵箱(mailBox)、管道(pipe)以及高級(jí)中斷(HISR)等基本服務(wù)的封裝。為上層應(yīng)用程序提供更高級(jí)的統(tǒng)一編程接口,它樣就使應(yīng)用軟件的開(kāi)發(fā)與具體的軟件平臺(tái)無(wú)關(guān),解決了嵌入式應(yīng)用軟件的移植問(wèn)題。
  
  在圖1中,各模塊之間有交界表明模塊之間有接口關(guān)系。EFC、應(yīng)用程序以及RTOS都和硬件驅(qū)動(dòng)有接口:EFC要使用一部分核心驅(qū)動(dòng)(例如實(shí)時(shí)時(shí)鐘的驅(qū)動(dòng)、ARM串口和網(wǎng)口的驅(qū)動(dòng)、I2C總線的驅(qū)動(dòng)等);應(yīng)用程序中調(diào)用的驅(qū)動(dòng)是針對(duì)具體設(shè)備的;RTOS所需要的驅(qū)動(dòng)就是系統(tǒng)的BSP部分。
  
  EFC的靜態(tài)結(jié)構(gòu)圖(類圖)如圖2所示。類圖是在UML(統(tǒng)一建模語(yǔ)言)中用類和它們之間的關(guān)系描述系統(tǒng)的一種圖示。類用類名、類的屬性以及操作來(lái)表示,在圖中為簡(jiǎn)單起見(jiàn),省略了屬性和操作;類與類之間的關(guān)系使用不同的連線表示,圖中帶空心三角箭頭的連線表示繼承關(guān)系,兩端帶數(shù)字的連線表示關(guān)聯(lián)關(guān)系。在類圖中,類的屬性/方法的可見(jiàn)性使用“+”、“-”及“#”表示:“+”表示公共的(public),“-”表示私有的(private),“#”表示受保護(hù)的(protected)。
  
  從圖2中可以看出,CMessage、CRTApp、CDevice、Cboard及Cinterface都派生于公共的類CRTObject。CRTApp對(duì)象中有受保護(hù)的CMessage、CEventLog、Cuser及CDevice各一個(gè)。CDevice對(duì)象中有一個(gè)或多個(gè)CBoard對(duì)象,相應(yīng)的每個(gè)CBorad對(duì)象中有0個(gè)到多個(gè)CxxxInterace對(duì)象。
  
  2.1基本數(shù)據(jù)類型
  
  構(gòu)建一個(gè)框架,需要一些基本的元素,這些元素要在框架的構(gòu)造以及應(yīng)用程序開(kāi)發(fā)中大量使用。這些基本數(shù)據(jù)類型包括字符串類CString、集合類CArray、Clist及Cmap。CString包括一個(gè)長(zhǎng)度可變的字符序列,提供使用非常直觀方便的運(yùn)算符(例如+,+=,=,==,!=)和一些Todouble()、Tolong()、Tohex()等);CArray是具有內(nèi)建索元素很快的檢索速度;Clist為其所存儲(chǔ)的每一個(gè)元素,都提供了兩個(gè)指針,分別指向位于其前和其后的元素,形成一個(gè)雙向鏈表,這使得插入和刪除操作十分快捷;CMap為其存儲(chǔ)的每個(gè)數(shù)據(jù)都附帶一個(gè)關(guān)鍵字,并以關(guān)鍵字所組成的一個(gè)hash表作為索引,從而使得元素搜索、增加和刪除操作都具有很高的效率。
  
  2.2RTOS的抽象和封裝
  
  CRTObject是一個(gè)EFC中最基礎(chǔ)的類,它不但是EFC中CRTApp、CDevice等類的基類,而且可以作為所有使用EFC的嵌入式開(kāi)發(fā)人員定義新的類的超類。CRTObject類在EFC中主要承擔(dān)RTOS抽象和封裝任務(wù)。它提供了下面一些最基本的功能:
  
  *CRTObject對(duì)RTOS的常用對(duì)象進(jìn)行了封裝,提供包括Task、Driver、Timer、EventGroup、Semaphore、Queue、Pipe、Mailbox等的創(chuàng)建、刪除、查找等功能的成員函數(shù)。這些函數(shù)提供了一個(gè)簡(jiǎn)單有效的方法來(lái)使用RTOS的對(duì)象。使用這些函數(shù)能夠保證對(duì)象創(chuàng)建與銷毀的安全性,而不會(huì)造成內(nèi)存泄漏。
  
  *CRTObject提供了對(duì)RTTI(Run-TimeTypeInformation,運(yùn)行時(shí)類型信息)的支持,在新的C++標(biāo)準(zhǔn)中,RTTI已經(jīng)是C++的一個(gè)功能,但并不是所有的編譯器都提供支持這些新特性,ADS1.2就不支持。所以在這里參考MFC,通過(guò)宏的方式為每個(gè)類定義一個(gè)CRuntimeClass類型的靜態(tài)常量和相關(guān)的成員函數(shù)。CRuntimeClass結(jié)構(gòu)保證了類型的靜態(tài)常量和相關(guān)的成員函數(shù)。CRuntimeClass結(jié)構(gòu)保存了類的名稱、大小等信息,這樣我們就能在程序運(yùn)行時(shí)確定對(duì)象的具體類型。
  
  *CRTObject還提供了把類的成員函數(shù)作為任務(wù)及定時(shí)器的回調(diào)函數(shù)的功能。在Nucleus中,任務(wù)和定時(shí)器的回調(diào)函數(shù)只能是全局函數(shù)或者類的靜態(tài)成員函數(shù),這在面向?qū)ο蟮拈_(kāi)發(fā)中很不方便。這里通過(guò)把成員函數(shù)指針和對(duì)象的this指針作為參數(shù)傳遞給RTOS,在RTOS調(diào)用公共回調(diào)函數(shù)時(shí)再取出來(lái)。通過(guò)函數(shù)指針的方式去調(diào)用類的成員函數(shù),這樣把有派生于CRTObject的類就可方便地使用成員函數(shù)作為任務(wù)、定時(shí)器等對(duì)象的回調(diào)函數(shù)。
  
  2.3應(yīng)用程序類CRTApp
  
  CRTApp類用來(lái)定義整個(gè)應(yīng)用程序?qū)ο螅峁┫到y(tǒng)初始化、管理其它對(duì)象以及運(yùn)行應(yīng)用程序的功能。任何使用EFC框架的應(yīng)用程序有且只能有一個(gè)派生于此類的對(duì)象。CRTApp對(duì)象中包含了動(dòng)態(tài)創(chuàng)建的CMessage、CEventLog、CDevice及Cuser對(duì)象。
  
  通過(guò)在Nucleus的入口函數(shù)Application_Initialize中創(chuàng)建系統(tǒng)初始化任務(wù)(回調(diào)函數(shù)為CRTApp類的成員函數(shù)InitTask),來(lái)把系統(tǒng)控制權(quán)交給CRTApp對(duì)象,在其中完成其它對(duì)象的創(chuàng)建、系統(tǒng)的配置以及初始化任務(wù)。
  
  2.4文件系統(tǒng)
  
  在嵌入式設(shè)備中通常使用Flash存儲(chǔ)器來(lái)保存程序代碼和數(shù)據(jù),每片F(xiàn)lash一般由一定數(shù)量大小不等的扇區(qū)組成。它在讀取方面與普通RAM存儲(chǔ)器類似,可以實(shí)現(xiàn)隨機(jī)的讀取,但在寫(xiě)入操作上卻有很大的不同。Flash中只有空白的單元才可以進(jìn)行寫(xiě)入操作,要向非空的單元寫(xiě)入數(shù)據(jù),需要先擦除整個(gè)扇區(qū)。所以程序中如果直接對(duì)Flash進(jìn)行操作會(huì)很不方便。最好的辦法就是在其上構(gòu)造一個(gè)文件系統(tǒng),文件系統(tǒng)提供簡(jiǎn)便、可靠的接口供上層使用,而把復(fù)雜的操作屏蔽在文件系統(tǒng)內(nèi)部。
  
  這里文件系統(tǒng)包括內(nèi)存文件系統(tǒng)和Flash文件系統(tǒng)。CFile是一個(gè)抽象類,只是定義文件系統(tǒng)的接口函數(shù)(例如Open、Read、Write、Seek、GetLength、Close等),具體的實(shí)現(xiàn)在CMemFile(內(nèi)存文件)及CFlashFile(Flash文件)類中完成。
  
  2.5設(shè)備管理
  
  在EFC中,設(shè)備管理由CDevice、CBoard、CInterface及其派生類完成。CDevice類代表整個(gè)設(shè)備,1個(gè)設(shè)備中包含1到多個(gè)CBoard對(duì)象,而每個(gè)CBoard對(duì)象中又包含0個(gè)到多個(gè)接口對(duì)象(CInterface類的派生類對(duì)象)。這樣以來(lái),嵌入式設(shè)備(僅限通信領(lǐng)域)都可由這幾個(gè)類組合而成,大大簡(jiǎn)化了軟件的設(shè)計(jì)。
  
  2.6命令處理
  
  CMessage類是系統(tǒng)的命令處理模塊,它直接派生于CRTObject類。它的功能主要是接收網(wǎng)管軟件通過(guò)串口或網(wǎng)口發(fā)送未來(lái)的各種命令,完成對(duì)設(shè)備的配置管理、性能管理、告警管理、安全管理和維護(hù)管理等管理功能。CMessage類主要有表1所列的任務(wù)。
  
  表1CMessage類中的任務(wù)
  
  任務(wù)名稱任務(wù)處理函數(shù)說(shuō)明TCP服務(wù)器監(jiān)聽(tīng)任務(wù)TCPServerTask用于監(jiān)聽(tīng)客戶端的連接請(qǐng)求TCP響應(yīng)任務(wù)TCPEchoTask對(duì)每客戶端的連接都創(chuàng)建一響應(yīng)任務(wù)串口任務(wù)UartTask通過(guò)串口對(duì)系統(tǒng)進(jìn)行管理TFTP備分份任務(wù)TFTPClientPutTask備份應(yīng)用程序和系統(tǒng)配置文件TFTP升級(jí)任務(wù)TFTPClientGetTask用于升級(jí)應(yīng)用程序及修改用戶配置文件
  
  2.7其它模塊
  
  CFlash類封裝對(duì)Flash芯片的操作,主要包括讀、寫(xiě)、擦除等操作。從圖2可以看出,CEventLog和CFlashFile類中都包含CFlash對(duì)象;CEventLog類記錄系統(tǒng)中的發(fā)生的事件以及系統(tǒng)運(yùn)行過(guò)程中產(chǎn)生的告警信息。為了實(shí)現(xiàn)掉電保存功能,這些事件都保存在Flash芯片中;Cuser類用來(lái)對(duì)系統(tǒng)的用戶進(jìn)行管理,防止對(duì)系統(tǒng)非授權(quán)的訪問(wèn)。
  
  3使用EFC的設(shè)計(jì)方案舉例
  
  這里以在通信和工業(yè)自動(dòng)化領(lǐng)域使用較多的串口服務(wù)器為例,來(lái)說(shuō)明使用FEC嵌入式開(kāi)發(fā)框架的設(shè)計(jì)方案。串口服務(wù)器是一種可把多路異步RS232/RS485串行數(shù)據(jù)與通過(guò)以太網(wǎng)口傳送的TCP/IP數(shù)據(jù)包進(jìn)行相互轉(zhuǎn)換,使傳統(tǒng)的異步串行數(shù)據(jù)信息能通過(guò)Internet或Intranet傳送或共享的設(shè)備。
  
  設(shè)每個(gè)串口對(duì)應(yīng)TCP/IP的一個(gè)端口,則可畫(huà)出圖3所示的靜態(tài)結(jié)構(gòu)圖(圖中SerSvr是Server的簡(jiǎn)寫(xiě))。
  
  從圖3可以看出,共對(duì)五個(gè)類進(jìn)行了派生。CSerSvrMessage類派生于CMessage類,用于通過(guò)網(wǎng)管對(duì)串口服務(wù)器進(jìn)行管理(這里具體命令略);CserSvrDevice類派生于CDevice類,代表串口服務(wù)器設(shè)備;CserSvrDevice類對(duì)象中有一個(gè)或多個(gè)派生于CBoard類的CserSvrBoard類對(duì)象,而每個(gè)CserSvrBoard類對(duì)象擁有一個(gè)或多個(gè)派生于CasyInterface類的CSerSvrInterface類對(duì)象;ScerSvrApp類派生于CRTApp類,代表整個(gè)應(yīng)用程序,并重載了虛函數(shù)OnCreateMessage()及OnCreateDevice(),用來(lái)在其中創(chuàng)建系統(tǒng)的CSerSvrMessage和CserSvrDevice類的實(shí)例來(lái)代替系統(tǒng)默認(rèn)的CMessage和CDevice實(shí)例。
  
  圖3串口服務(wù)器系統(tǒng)軟件靜態(tài)結(jié)構(gòu)圖
  
  串口類CSerSvrInterface的設(shè)計(jì)是整個(gè)設(shè)計(jì)的關(guān)鍵,在每個(gè)串口類中都有一個(gè)TCP監(jiān)聽(tīng)任務(wù)TCPServerTask用來(lái)作為服務(wù)器去監(jiān)聽(tīng)客戶端的連接;一個(gè)TCP客戶端任務(wù)TCPClientTask用來(lái)連接其它服務(wù)器。無(wú)論是通過(guò)TCPServerTask還是TCPClientTask建立連接后,就掛起這兩個(gè)任務(wù)而啟動(dòng)另外兩個(gè)任務(wù)TCPSendTask和TCPRecvTask,它們分別用來(lái)通過(guò)網(wǎng)口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。TCPSendTask每隔10ms(對(duì)波特率為115.2K的情況,10ms最多收到的字節(jié)數(shù)為115200/(8+2)/1000*10=115.2字節(jié),所以串口的FIFO應(yīng)大于116字節(jié))把從串口讀到的數(shù)據(jù)打包從網(wǎng)口發(fā)送出去;而TCPTecvTask使用阻塞方式讀取網(wǎng)口數(shù)據(jù)。在讀到數(shù)據(jù)后,根據(jù)串口發(fā)送緩沖區(qū)的情況慢慢通過(guò)串口往外發(fā)送,沒(méi)發(fā)送完之前就不進(jìn)行下一次從網(wǎng)口的數(shù)據(jù)讀取。這樣把串口類設(shè)計(jì)成一個(gè)完備的處理類,設(shè)備中每塊板有多少串口就在CSerSvrBoard類的實(shí)例中有多少CSerSvrInterface類的實(shí)例。硬件模塊化的結(jié)構(gòu)簡(jiǎn)單地對(duì)應(yīng)軟件模塊化的結(jié)構(gòu)。
  
  結(jié)語(yǔ)
  
  本文講述了在嵌入式軟件開(kāi)發(fā)中使用C++構(gòu)建系統(tǒng)開(kāi)發(fā)框架的方法,并給出了框架的模型和應(yīng)用實(shí)例?梢钥闯觯褂妹嫦?qū)ο蟮目蚣芗夹g(shù)對(duì)于提高開(kāi)發(fā)效率、降低開(kāi)發(fā)難度、規(guī)范開(kāi)發(fā)模式、便于軟件的移植和維護(hù)方面,具有傳統(tǒng)面向過(guò)程的開(kāi)發(fā)方法不可比擬的優(yōu)勢(shì)。

【使用C++構(gòu)建嵌入式開(kāi)發(fā)框架】相關(guān)文章:

使用Rhapsody軟件框架和UML的實(shí)時(shí)系統(tǒng)開(kāi)發(fā)08-06

構(gòu)建特色教育新框架08-17

論企業(yè)整體激勵(lì)框架的構(gòu)建08-06

論企業(yè)整體激勵(lì)框架的構(gòu)建08-06

論企業(yè)整體激勵(lì)框架的構(gòu)建08-06

嵌入式系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)08-06

嵌入式開(kāi)發(fā)學(xué)習(xí)心得04-27

構(gòu)建小學(xué)語(yǔ)文學(xué)法指導(dǎo)框架探微08-08

構(gòu)建秘書(shū)職業(yè)資格制度框架的依據(jù)08-15