在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在嵌入式軟件開發中使用C++語言構建應用框架

電子設計 ? 來源:單片機與嵌入式系統應用 ? 作者:段丙華 ? 2020-09-16 17:42 ? 次閱讀

1 框架概述

1.1 什么是框架

國外著名的軟件設計大師Ralph Johnson對面向對象技術進行了長期而深入的研究。在他的主頁中,對框架進行了如下定義:A framework is a reusable design expressed as a set of abstract classes and the way their instances collaborate.It is a reusable design for all or part of a software system.(框架是整個系統或系統的一部分的可重用性設計,由一組抽象出來的類及其實例間的相互作用方式組成。)

框架把一個系統有機地分解成一組相對獨立的構件,并定義了各個構件間的接口和作用關系,符合軟件工程中設計的模塊化、獨立化和信息隱藏等特征。框架提供了一個大粒度的重用技術,即不僅支持源代碼級的重用,而且支持分析和設計以及體系結構的重用,因而被認為是一種最有前途的面向對象技術。

框架必須是健壯的、可擴展的、靈活的,它要求基于開放或共享標準。框架的設計要力求做到完備性、靈活性、可擴展性、可理解性,同時抽象能用于不同的場合;用戶能輕松地添加和修改功能,定制框架;用戶和框架的交互清晰,文檔齊全。框架設計的一個核心問題就是發現可重用的設計和“熱點”,以保證框架具備充分的靈活性,使用戶能在已有構件的基礎上生成應用程序,實現“零代碼編寫”的理想目標。

1.2 如何設計框架

目前框架的設計大都采用實踐法。實踐法是指從若干個具體的典型應用中,抽象出現似點來構建框架;框架反過來又應用于不同的問題,并在解決不同問題的過程中得到更新;在框架的設計和實現的兩步中,不斷反復,等到框架逐漸成熟時,需要修改和反復的內容就會越來越小。具體步驟為:分析問題域,確定所需框架,從一類應用而不是單個的程序去分析、比較各種不同的軟件解決方案,尋求這些方案的共性和每個程度的唯一性特性。這些共性,尤其是那些經常被多個程序使用的部分將成為框架的基礎。然后,定義框架體系結構并設計,包括設計用戶與框架間的交互、給用戶提供的最終工具等。

框架的實現:包括框架核心類的實現、框架的測試、框架的試運行、框架的反復更新。

框架的部署:包括文檔的提供和分發過程、為用戶提供技術支持、維護和更新框架。

2 嵌入式框架EFC

框架技術在桌面軟件的開發中得到了廣泛的應用,但在嵌入式開發領域,由于嵌入式開發的多樣性及嵌入式操作系統的多樣性,目前還沒有一套完整的開發框架可供使用。因此,在嵌入式軟件開發中常常是從底層做起,應用程序和RTOS密不可分。這樣的開發方式不但效率不高,也不利于軟件的移植。

EFC(Embedded Foundation Classes)即嵌入式基礎類庫,借鑒Microsoft公司的MFC(微軟基礎類庫—桌面系統框架庫的工業標準)構建的一套在ARM平臺 Nucleus plus操作系統下的嵌入式開發框架。由于框架全部采用C++開發,沒有和處理器相關的匯編代碼,所以在其它硬件平臺可不加修改地使用。如果更換不同的操作系統,則需要修改操作系統抽象層的部分代碼;但由于EFC提供給上層應用程序的接口不變,所以應用程序不需要修改代碼。

就軟件的層次來說,EFC是一個操作系統之上、應用程序之下的中間件,如圖1所示。在EFC中有一個操作系統抽象層,對RTOS進行了抽象和封裝,提供包括任務(task)、/O驅動(driver)、定時器timer)、信號量(semaphore)、消息隊列(quecue)、事件(event group)、郵箱(mailBox)、管道(pipe)以及高級中斷(HISR)等基本服務的封裝。為上層應用程序提供更高級的統一編程接口,它樣就使應用軟件的開發與具體的軟件平臺無關,解決了嵌入式應用軟件的移植問題。

如何在嵌入式軟件開發中使用C++語言構建應用框架

在圖1中,各模塊之間有交界表明模塊之間有接口關系。EFC、應用程序以及RTOS都和硬件驅動有接口:EFC要使用一部分核心驅動(例如實時時鐘的驅動、ARM串口和網口的驅動、I2C總線的驅動等);應用程序中調用的驅動是針對具體設備的;RTOS所需要的驅動就是系統的BSP部分。

EFC的靜態結構圖(類圖)如圖2所示。類圖是在UML(統一建模語言)中用類和它們之間的關系描述系統的一種圖示。類用類名、類的屬性以及操作來表示,在圖中為簡單起見,省略了屬性和操作;類與類之間的關系使用不同的連線表示,圖中帶空心三角箭頭的連線表示繼承關系,兩端帶數字的連線表示關聯關系。在類圖中,類的屬性/方法的可見性使用“+”、“-”及“#”表示:“+”表示公共的(public),“-”表示私有的(private),“#”表示受保護的(protected)。

從圖2中可以看出,CMessage、CRTApp、CDevice、Cboard及Cinterface都派生于公共的類 CRTObject。CRTApp對象中有受保護的CMessage、CEventLog、Cuser及CDevice各一個。CDevice對象中有一個或多個CBoard對象,相應的每個CBorad對象中有0個到多個CxxxInterace對象。

2.1 基本數據類型

構建一個框架,需要一些基本的元素,這些元素要在框架的構造以及應用程序開發中大量使用。這些基本數據類型包括字符串類CString、集合類 CArray、Clist及Cmap。CString包括一個長度可變的字符序列,提供使用非常直觀方便的運算符(例如+,+=,=,==,!=)和一些 Todouble()、Tolong()、Tohex()等);CArray是具有內建索元素很快的檢索速度;Clist為其所存儲的每一個元素,都提供了兩個指針,分別指向位于其前和其后的元素,形成一個雙向鏈表,這使得插入和刪除操作十分快捷;CMap為其存儲的每個數據都附帶一個關鍵字,并以關鍵字所組成的一個hash表作為索引,從而使得元素搜索、增加和刪除操作都具有很高的效率。

2.2 RTOS的抽象和封裝

CRTObject是一個EFC中最基礎的類,它不但是EFC中CRTApp、CDevice等類的基類,而且可以作為所有使用EFC的嵌入式開發人員定義新的類的超類。CRTObject類在EFC中主要承擔RTOS抽象和封裝任務。它提供了下面一些最基本的功能:

*CRTObject對RTOS的常用對象進行了封裝,提供包括Task、Driver、Timer、Event Group、Semaphore、Queue、Pipe、Mailbox等的創建、刪除、查找等功能的成員函數。這些函數提供了一個簡單有效的方法來使用 RTOS的對象。使用這些函數能夠保證對象創建與銷毀的安全性,而不會造成內存泄漏。

*CRTObject提供了對RTTI(Run-Time Type Information,運行時類型信息)的支持,在新的C++標準中,RTTI已經是C++的一個功能,但并不是所有的編譯器都提供支持這些新特性,ADS1.2就不支持。所以在這里參考MFC,通過宏的方式為每個類定義一個CRuntimeClass類型的靜態常量和相關的成員函數。 CRuntimeClass結構保證了類型的靜態常量和相關的成員函數。CRuntimeClass結構保存了類的名稱、大小等信息,這樣我們就能在程序運行時確定對象的具體類型。

*CRTObject還提供了把類的成員函數作為任務及定時器的回調函數的功能。在Nucleus中,任務和定時器的回調函數只能是全局函數或者類的靜態成員函數,這在面向對象的開發中很不方便。這里通過把成員函數指針和對象的this指針作為參數傳遞給RTOS,在RTOS調用公共回調函數時再取出來。通過函數指針的方式去調用類的成員函數,這樣把有派生于CRTObject的類就可方便地使用成員函數作為任務、定時器等對象的回調函數。

2.3 應用程序類CRTApp

CRTApp類用來定義整個應用程序對象,提供系統初始化、管理其它對象以及運行應用程序的功能。任何使用EFC框架的應用程序有且只能有一個派生于此類的對象。CRTApp對象中包含了動態創建的CMessage、CEventLog、CDevice及Cuser對象。

通過在Nucleus的入口函數Application_Initialize中創建系統初始化任務(回調函數為CRTApp類的成員函數 InitTask),來把系統控制權交給CRTApp對象,在其中完成其它對象的創建、系統的配置以及初始化任務。

2.4 文件系統

在嵌入式設備中通常使用Flash存儲器來保存程序代碼和數據,每片Flash一般由一定數量大小不等的扇區組成。它在讀取方面與普通RAM存儲器類似,可以實現隨機的讀取,但在寫入操作上卻有很大的不同。Flash中只有空白的單元才可以進行寫入操作,要向非空的單元寫入數據,需要先擦除整個扇區。所以程序中如果直接對Flash進行操作會很不方便。最好的辦法就是在其上構造一個文件系統,文件系統提供簡便、可靠的接口供上層使用,而把復雜的操作屏蔽在文件系統內部。

這里文件系統包括內存文件系統和Flash文件系統。CFile是一個抽象類,只是定義文件系統的接口函數(例如Open、Read、 Write、Seek、GetLength、Close等),具體的實現在CMemFile(內存文件)及CFlashFile(Flash文件)類中完成。

2.5 設備管理

在EFC中,設備管理由CDevice、CBoard、CInterface及其派生類完成。CDevice類代表整個設備,1個設備中包含1 到多個CBoard對象,而每個CBoard對象中又包含0個到多個接口對象(CInterface類的派生類對象)。這樣以來,嵌入式設備(僅限通信領域)都可由這幾個類組合而成,大大簡化了軟件的設計。

2.6 命令處理

CMessage類是系統的命令處理模塊,它直接派生于CRTObject類。它的功能主要是接收網管軟件通過串口或網口發送未來的各種命令,完成對設備的配置管理、性能管理、告警管理、安全管理和維護管理等管理功能。CMessage類主要有表1所列的任務。

2.7 其它模塊

CFlash類封裝對Flash芯片的操作,主要包括讀、寫、擦除等操作。從圖2可以看出,CEventLog和CFlashFile類中都包含CFlash對象;CEventLog類記錄系統中的發生的事件以及系統運行過程中產生的告警信息。為了實現掉電保存功能,這些事件都保存在Flash 芯片中;Cuser類用來對系統的用戶進行管理,防止對系統非授權的訪問。

3 使用EFC的設計方案舉例

這里以在通信和工業自動化領域使用較多的串口服務器為例,來說明使用FEC嵌入式開發框架的設計方案。串口服務器是一種可把多路異步 RS232/RS485串行數據與通過以太網口傳送的TCP/IP數據包進行相互轉換,使傳統的異步串行數據信息能通過Internet或 Intranet傳送或共享的設備。

設每個串口對應TCP/IP的一個端口,則可畫出圖3所示的靜態結構圖(圖中SerSvr是Server的簡寫)。

從圖3可以看出,共對五個類進行了派生。CSerSvrMessage類派生于CMessage類,用于通過網管對串口服務器進行管理(這里具體命令略);CserSvrDevice類派生于CDevice類,代表串口服務器設備;CserSvrDevice類對象中有一個或多個派生于 CBoard類的CserSvrBoard類對象,而每個CserSvrBoard類對象擁有一個或多個派生于CasyInterface類的 CSerSvrInterface類對象;ScerSvrApp類派生于CRTApp類,代表整個應用程序,并重載了虛函數 OnCreateMessage()及OnCreateDevice(),用來在其中創建系統的CSerSvrMessage和 CserSvrDevice類的實例來代替系統默認的CMessage和CDevice實例。

串口類 CSerSvrInterface的設計是整個設計的關鍵,在每個串口類中都有一個TCP監聽任務TCPServerTask用來作為服務器去監聽客戶端的連接;一個TCP客戶端任務TCPClientTask用來連接其它服務器。無論是通過TCPServerTask還是TCPClientTask建立連接后,就掛起這兩個任務而啟動另外兩個任務TCPSendTask和TCPRecvTask,它們分別用來通過網口發送數據和接收數據。 TCPSendTask每隔10ms(對波特率為115.2K的情況,10ms最多收到的字節數為115200/(8+2)/1000*10=115.2 字節,所以串口的FIFO應大于116字節)把從串口讀到的數據打包從網口發送出去;而TCPTecvTask使用阻塞方式讀取網口數據。在讀到數據后,根據串口發送緩沖區的情況慢慢通過串口往外發送,沒發送完之前就不進行下一次從網口的數據讀取。這樣把串口類設計成一個完備的處理類,設備中每塊板有多少串口就在CSerSvrBoard類的實例中有多少CSerSvrInterface類的實例。硬件模塊化的結構簡單地對應軟件模塊化的結構。

結語

本文講述了在嵌入式軟件開發中使用C++構建系統開發框架的方法,并給出了框架的模型和應用實例。可以看出,使用面向對象的框架技術對于提高開發效率、降低開發難度、規范開發模式、便于軟件的移植和維護方面,具有傳統面向過程的開發方法不可比擬的優勢。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5096

    文章

    19192

    瀏覽量

    308059
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73898
  • 應用程序
    +關注

    關注

    38

    文章

    3298

    瀏覽量

    57951
收藏 人收藏

    評論

    相關推薦

    嵌入式軟件開發應該掌握哪些知識?

    的控制,如GPIO、串口、SPI、I2C 等。這使得嵌入式軟件開發人員能夠充分利用硬件資源,滿足特定的需求。 1.2數據結構與算法 嵌入式系統通常具有有限的內存資源。通過使用合適的數據
    發表于 02-19 11:23

    嵌入式軟件開發需要學習什么?

    應用程序開發標準教程》華清遠見出版2:《嵌入式Linux C語言程序設計基礎教程》華清遠見出版3:《Linux設備驅動開發詳解》華清遠見出版
    發表于 01-31 14:45

    嵌入式軟件開發是做什么的

    /QNX+ARM匯編;  (5)GUI:VC++/VC#/LABVIEW;  上面是大致,下面就是重頭戲了,嵌入式軟件開發編程對于一個嵌入式軟件工程師,需要掌握以下技能:  1、掌握
    發表于 06-28 11:31

    嵌入式軟件開發語言的相關資料推薦

    解析嵌入式軟件開發語言嵌入式C編程在我們初學嵌入式開發的時候,總會出現一個問題。那就是
    發表于 10-27 06:30

    嵌入式軟件開發是做什么的?

    :Linux/QNX+ARM匯編; (5)GUI:VC++/VC#/LABVIEW; 上面是大致,下面就是重頭戲了,嵌入式軟件開發編程對于一個嵌入式軟件工程師,需要掌握以下技能: 1.
    發表于 12-15 16:39

    使用C++構建嵌入式開發框架

    框架作為一種大粒度的重用技術在桌面軟件開發中得到了廣泛應用,而在嵌入式開發領域,目前還沒有一套完整的標準框架可供使用。本文以通信領域的嵌入式
    發表于 05-15 15:42 ?12次下載

    什么是嵌入式軟件開發

    嵌入式軟件開發又是指什么?   隨著嵌入式軟件系統結構越來越復雜,嵌入式軟件
    發表于 04-20 08:43 ?8806次閱讀

    ARM嵌入式軟件開發

    ARM嵌入式軟件開發ARM嵌入式軟件開發ARM嵌入式軟件開發
    發表于 01-15 17:29 ?65次下載

    嵌入式 C C++語言精華文章集錦

    嵌入式 C C++語言精華文章集錦
    發表于 02-08 01:28 ?10次下載

    使用C++構建嵌入式開發框架

    使用C++構建嵌入式開發框架
    發表于 10-25 11:25 ?17次下載
    使用<b class='flag-5'>C++</b><b class='flag-5'>構建</b><b class='flag-5'>嵌入式開發</b><b class='flag-5'>框架</b>

    嵌入式開發語言有哪些_最全面嵌入式開發語言概述

    嵌入式開發語言有哪些?嵌入式開發的入門門檻還是比較高的,不僅要懂較底層軟件,對軟件專業水平要求較高,而且必須懂得硬件的工作原理,
    發表于 01-29 14:47 ?9890次閱讀
    <b class='flag-5'>嵌入式開發</b><b class='flag-5'>語言</b>有哪些_最全面<b class='flag-5'>嵌入式開發</b><b class='flag-5'>語言</b>概述

    嵌入式Linux與物聯網軟件開發C語言內核深度解析書籍的介紹

    嵌入式Linux與物聯網軟件開發——C語言內核深度解析 C語言
    發表于 05-15 18:10 ?9次下載
    <b class='flag-5'>嵌入式</b>Linux與物聯網<b class='flag-5'>軟件開發</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>內核深度解析書籍的介紹

    關于嵌入式Linux軟件開發的常用知識

    C語言嵌入式軟件開發的基礎,c佳佳在嵌入式領域也有一定的份額,但是很少,所以我們如果要做
    發表于 08-26 17:11 ?1491次閱讀

    解析嵌入式軟件開發語言嵌入式C編程

    解析嵌入式軟件開發語言嵌入式C編程在我們初學嵌入式開發的時候,總會出現一個問題。那就是
    發表于 10-20 11:51 ?7次下載
    解析<b class='flag-5'>嵌入式</b><b class='flag-5'>軟件開發</b><b class='flag-5'>語言</b>:<b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>編程

    嵌入式程序開發C語言C++究竟應該用哪個?

    嵌入式軟件程序開發中,C語言無疑是最常被使用的程序語言。不過應該明白的是,有些
    發表于 11-03 14:21 ?60次下載
    <b class='flag-5'>嵌入式</b>程序<b class='flag-5'>開發</b>,<b class='flag-5'>C</b><b class='flag-5'>語言</b>和<b class='flag-5'>C++</b>究竟應該用哪個?
    主站蜘蛛池模板: 日韩午夜在线视频不卡片 | 三级黄色在线观看 | 亚洲高清美女一区二区三区 | 爽好舒服老师快点 | 免费在线观看大片影视大全 | 久久大尺度 | 国产哺乳期奶水avav | 苍井优一级毛片免费观看 | 午夜精品影院 | 激情综合五月天丁香婷婷 | 二级黄绝大片中国免费视频 | 男人的天堂久久精品激情 | 亚色在线| 亚洲毛片大全 | 毛片a区 | 黄色网址在线播放 | 日日噜夜夜噜 | 色婷婷综合在线 | 精品福利 | xxxx性欧美高清 | 毛片区 | 色四虎 | 好硬好湿好爽再深一点h视频 | wwwa级片| 日韩毛片网 | 人人插人人草 | 性刺激的欧美三级视频 | 噜噜噜狠狠夜夜躁 | 国产精品天天爽夜夜欢张柏芝 | 成人一级网站 | 1024你懂的在线播放欧日韩 | 99视频全部免费 | 狠狠色丁香婷婷综合橹不卡 | 在线亚洲国产精品区 | h网站免费在线观看 | 精品午夜久久影视 | 黄 色 录像成 人播放免费 | 99视频全部免费 | 国产黄mmd在线观看免费 | 69日本xxxxxxxxx18| 看天堂 |