99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式應(yīng)用開(kāi)發(fā)應(yīng)用架構(gòu)有什么作用?嵌入式程序設(shè)計(jì)的一些思路

Q4MP_gh_c472c21 ? 來(lái)源:未知 ? 作者:易水寒 ? 2018-08-12 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

如果沒(méi)有好的架構(gòu),移植將會(huì)是一件很痛苦的事情。

如果沒(méi)有好的架構(gòu),復(fù)用是最大的難題,沒(méi)法更大限度的復(fù)用原有的代碼。

如果沒(méi)有好的架構(gòu),一旦驅(qū)動(dòng)改了,所有的地方都要改,費(fèi)時(shí)費(fèi)力且很容易出錯(cuò)。

如果沒(méi)有好的架構(gòu),應(yīng)用層中穿插著硬件驅(qū)動(dòng)層的代碼,看著會(huì)是一片混亂,邏輯不清,代碼維護(hù)起來(lái)會(huì)很困難。

現(xiàn)在的小朋友都愛(ài)玩搭積木的游戲,一個(gè)模塊一個(gè)模塊的拼裝起來(lái),快速組成各種不同的模型?,F(xiàn)在的產(chǎn)品設(shè)計(jì)也很少?gòu)牧汩_(kāi)始。大都復(fù)用現(xiàn)有成熟的模塊,專注于某個(gè)擅長(zhǎng)領(lǐng)域。

要做到嵌入式應(yīng)用的代碼邏輯清晰,且避免重復(fù)的造輪子,沒(méi)有好的應(yīng)用架構(gòu)怎么行!

把API分為驅(qū)動(dòng)層和應(yīng)用層API,而不是所有程序都調(diào)用驅(qū)動(dòng)層API。(整個(gè)應(yīng)用中都調(diào)用驅(qū)動(dòng)層API會(huì)導(dǎo)致應(yīng)用中驅(qū)動(dòng)調(diào)用隨處可見(jiàn),無(wú)法移植和最大限度的復(fù)用)

先把一個(gè)應(yīng)用進(jìn)行功能模塊劃分,并對(duì)整體結(jié)構(gòu)進(jìn)行分層,然后設(shè)計(jì)出功能獨(dú)立的各個(gè)模塊(如算法模塊,文件庫(kù)模塊,通信庫(kù)模塊),在模塊之上開(kāi)放公共接口。

驅(qū)動(dòng)層提供出公共接口供上層調(diào)用。各個(gè)功能模塊可以獨(dú)立編譯(如算法模塊純ANSI C,可在任意平臺(tái)復(fù)用),或者調(diào)用驅(qū)動(dòng)層接口(文件庫(kù)模塊調(diào)用了驅(qū)動(dòng)讀寫Flash),總而言之,言而總之,封裝出各個(gè)功能獨(dú)立的可復(fù)用的功能模塊。

總體分 硬件驅(qū)動(dòng)層-->功能模塊層-->應(yīng)用接口層-->業(yè)務(wù)邏輯層-->應(yīng)用層

總體結(jié)構(gòu)示意框圖:

應(yīng)用層,為程序的總體的運(yùn)行框架,組織調(diào)用業(yè)務(wù)邏輯??梢杂媚撤N嵌入式操作系統(tǒng)實(shí)現(xiàn)幾種任務(wù) 。如定時(shí)任務(wù),卡處理任務(wù),菜單任務(wù),通信任務(wù)。

業(yè)務(wù)邏輯層,如CPU卡處理,交通部卡處理,銀聯(lián)卡處理,M1卡處理,通信記錄上傳,黑名單下載,票價(jià)參數(shù)下載等。

應(yīng)用接口層,提供公共的api接口供應(yīng)用接口供上層調(diào)用。這些接口也可由下層的功能模塊開(kāi)放出來(lái),應(yīng)用接口層負(fù)責(zé)匯總。

功能模塊層,可以封裝不同的功能模塊。如算法庫(kù),文件庫(kù),通信庫(kù),銀聯(lián)庫(kù),向上提供應(yīng)用接口層的接口,向下調(diào)用驅(qū)動(dòng)接口。

硬件驅(qū)動(dòng)層,由各個(gè)驅(qū)動(dòng)模塊組成,向上提供統(tǒng)一的接口。

遵循一些約定:1.每個(gè)模塊提供出的接口要統(tǒng)一,后續(xù)只能增,不能改原來(lái)的接口。

2.模塊與模塊之間相互獨(dú)立,互不影響,不能相互調(diào)用,只能調(diào)用它下層的接口。

3.由模塊構(gòu)成層,層與層之間不能跨級(jí)調(diào)用。如在應(yīng)用層中不能看到直接調(diào)用驅(qū)動(dòng)層的代碼。

4.模塊中又可以繼續(xù)分層,如接口層,驅(qū)動(dòng)層,硬件層。

如果驅(qū)動(dòng)變動(dòng)了,或者換不同平臺(tái),只需更改驅(qū)動(dòng)層,應(yīng)用層不受影響。

如果功能模塊變動(dòng)了,只需升級(jí)功能功能模塊,其他的模塊不受影響,應(yīng)用層也不受影響。

按照這種邏輯設(shè)計(jì)好之后,主要的工作就是在業(yè)務(wù)邏輯層。應(yīng)用層則為程序的總體流程和框架,主要調(diào)用業(yè)務(wù)邏輯層實(shí)現(xiàn)不同的功能。

我們現(xiàn)在的代碼結(jié)構(gòu),基本是按這個(gè)思路來(lái)的。

硬件驅(qū)動(dòng)層-->功能模塊層-->應(yīng)用接口層-->業(yè)務(wù)邏輯層-->應(yīng)用層。

看看以下兩種風(fēng)格的代碼,你更喜歡哪個(gè)。

另一種風(fēng)格:

同樣是保存參數(shù),非要拆成AlgCRC16 ,WritePraFlash( (unsigned char *)&NetPra , NETPRA_ADDR , sizeof(_NetPra) )兩步嗎?

還有AH_Para_Verify這個(gè),在應(yīng)用層中真是多余啊,檢測(cè)失敗又從Flash讀取。關(guān)于參數(shù),一開(kāi)機(jī)就應(yīng)該檢測(cè)合法性了。

既然都是要保存參數(shù),就應(yīng)該做個(gè)封裝,如上圖所示,把系統(tǒng)用到的不同參數(shù)做個(gè)規(guī)劃。應(yīng)用層調(diào)用APP_Open_UseFile 或者APP_Read_UseFile,而不是直接的去讀寫Flash。

來(lái)看看赫赫有名的谷歌的android架構(gòu),雖然很復(fù)雜,但從框圖上看,也像是搭積木,各個(gè)功能模塊獨(dú)立,層次分明。最低層建立在linux Kernel基礎(chǔ)上,然后是各個(gè)組件庫(kù)libraries,再往上是應(yīng)用框架和應(yīng)用。

以NC_FileLib,文件庫(kù)模塊為例,如果要用在其他平臺(tái),如EH0918手持機(jī)設(shè)備,只需要移植幾個(gè)硬件層接口即可。

NC_FileSys文件庫(kù),跟硬件相關(guān)的接口在Hook文件夾,重新實(shí)現(xiàn)以下幾個(gè)函數(shù)即可:void HW_FRAM_Init( void )unsigned int HW_FRAM_Read( unsigned int addr,unsigned int size,unsigned char *buffer)unsigned int HW_FRAM_Write( unsigned int addr,unsigned int size,unsigned char *buffer )//擦除FLASH一頁(yè) (FLASH擦除的最小單元)unsigned int HW_Flash_PageErase( unsigned int page )unsigned int HW_Flash_Read( unsigned int addr, unsigned int size, unsigned char *buffer )unsigned int HW_Flash_NotEraseWrite( unsigned int addr, unsigned int size, unsigned char *buffer )//擦除FLASH一頁(yè) (FLASH擦除的最小單元)unsigned int HW_Flash_PageErase( unsigned int page )

按照以上模塊化設(shè)計(jì)思想,很容易實(shí)現(xiàn)一模擬pos機(jī):

以開(kāi)發(fā)一個(gè)智能pos應(yīng)用為例:一個(gè)智能pos涉及到的功能模塊有:讀寫卡功能,保存與讀取消費(fèi)記錄,查找保存黑名單,界面顯示,菜單顯示,通信下載參數(shù)上傳記錄等。

電腦上實(shí)現(xiàn)一模擬pos用到的功能模塊有 文件存儲(chǔ)模塊,卡處理模塊,算法模塊,銀聯(lián)庫(kù)模塊。我把這些模塊移植到電腦上。

只是功能上的實(shí)現(xiàn),完成刷卡消費(fèi),記錄存儲(chǔ),記錄上傳,黑名單,票價(jià)下載等功能。界面為Dos窗口。后續(xù)如果用QT把界面也做出來(lái),就是一功能齊全的模擬POS機(jī),不過(guò)得把荒廢多年的C++重新拾起來(lái)了。可以繼續(xù)完善做一個(gè)上位機(jī)模擬pos,改變編譯器在上位機(jī)仿真調(diào)試并交叉編譯后運(yùn)行在真實(shí)POS上。

關(guān)于卡處理模塊的實(shí)現(xiàn),由于電腦上沒(méi)讀卡頭,于是用外接讀卡器。把讀卡器串口接電腦上。電腦上做一讀寫卡服務(wù),提供TCP接口的讀寫卡接口。

移植文件庫(kù),嵌入式程序中是操作的flash,在電腦上把文件庫(kù)中用到的接口用讀寫文件的形式替換。

移植算法庫(kù),算法庫(kù)都是c寫的,直接用gcc在windows平臺(tái)重新編譯即可。

各個(gè)功能模塊,又可以進(jìn)一步細(xì)分為子模塊。

拿通信庫(kù)舉例:嵌入式設(shè)備都需要支持各種不同的通訊模塊。比如硬件設(shè)備有A701、A801、B502等,通訊模塊有GL868、MG323、MC8630、N710、ZIGBEE等,這些設(shè)備分別支持全部或部分通訊模塊。

整體架構(gòu)分為如下:

驅(qū)動(dòng)大致分為三層:1、接口層:為用戶提供統(tǒng)一的接口,比如:Connect、TxData、RxData、Disconnect等。2、驅(qū)動(dòng)層:向接口層暴露統(tǒng)一的接口,這些接口用于完成實(shí)際的連接斷開(kāi)和數(shù)據(jù)收發(fā)等,比如:DevConnect、DevTxData、RxData、Disconnect等。該層只會(huì)和支持的通訊模塊相關(guān),不會(huì)直接訪問(wèn)任何硬件功能,包括串口通訊、GPIO控制全部通過(guò)底層的設(shè)備層實(shí)現(xiàn)。3、設(shè)備層:向驅(qū)動(dòng)層提供統(tǒng)一的接口,這些接口通過(guò)訪問(wèn)物理硬件來(lái)實(shí)現(xiàn)和模塊的通訊,比如:XXXPowerOn、SerialSend、SerialReceive等,并定義該設(shè)備支持哪些模塊。

對(duì)于部分編寫通訊模塊驅(qū)動(dòng)常用的功能,模塊中提供了一系列的輔助函數(shù),避免重復(fù)勞動(dòng)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19678

    瀏覽量

    317788
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1624

    瀏覽量

    64079
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3826

    瀏覽量

    83027

原文標(biāo)題:搞嵌入式應(yīng)用開(kāi)發(fā),沒(méi)有好的應(yīng)用架構(gòu)怎么行?高手分享嵌入式程序設(shè)計(jì)的一些思路

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開(kāi)發(fā)教程之程序設(shè)計(jì)開(kāi)發(fā)維護(hù)

      干貨來(lái)了,本文創(chuàng)客學(xué)院嵌入式linux培訓(xùn)講師和學(xué)員分享嵌入式程序設(shè)計(jì)和系統(tǒng)開(kāi)發(fā)與維護(hù)的相關(guān)知識(shí)點(diǎn)。希望對(duì)學(xué)習(xí)嵌入式開(kāi)發(fā)的學(xué)員有所幫助。
    發(fā)表于 05-26 14:59

    【轉(zhuǎn)】嵌入式系統(tǒng)原理及應(yīng)用教程- -嵌入式程序設(shè)計(jì)基礎(chǔ)

    嵌入式系統(tǒng)原理及應(yīng)用教程- -嵌入式程序設(shè)計(jì)基礎(chǔ) l
    發(fā)表于 12-02 22:20

    主流的嵌入式CPU架構(gòu)-ARM架構(gòu)詳解

    簡(jiǎn)單聊聊??上篇,介紹到了什么是嵌入式,以及嵌入式與單片機(jī)、PC機(jī)的區(qū)別,簡(jiǎn)單聊了聊有關(guān)嵌入式軟件學(xué)習(xí)的一些內(nèi)容。這
    發(fā)表于 12-13 06:05

    嵌入式一些日常小技巧分享

    雜記–算法學(xué)習(xí)日志+關(guān)于實(shí)驗(yàn)室部門架構(gòu)的思考+嵌入式一些日常小技巧分享算法學(xué)習(xí)日志因?yàn)閺某踔械浆F(xiàn)在直是學(xué)習(xí)嵌入式
    發(fā)表于 12-21 08:07

    嵌入式系統(tǒng)的C程序設(shè)計(jì)

    嵌入式系統(tǒng)的C程序設(shè)計(jì)
    發(fā)表于 04-07 22:42 ?86次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)的C<b class='flag-5'>程序設(shè)計(jì)</b>

    嵌入式系統(tǒng)的C程序設(shè)計(jì)

    嵌入式系統(tǒng)的C程序設(shè)計(jì)
    發(fā)表于 11-10 08:59 ?54次下載

    嵌入式系統(tǒng)的c程序設(shè)計(jì)

    嵌入式系統(tǒng)的c程序設(shè)計(jì)
    發(fā)表于 02-11 09:21 ?65次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)的c<b class='flag-5'>程序設(shè)計(jì)</b>

    嵌入式系統(tǒng)的C程序設(shè)計(jì)

    嵌入式系統(tǒng)的C程序設(shè)計(jì) 需要的朋友下來(lái)看看
    發(fā)表于 12-29 17:56 ?1次下載

    嵌入式系統(tǒng)的C程序設(shè)計(jì)

    嵌入式系統(tǒng)的C程序設(shè)計(jì),感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 10:26 ?42次下載

    嵌入式系統(tǒng)與C程序設(shè)計(jì)

    嵌入式系統(tǒng)與C程序設(shè)計(jì)
    發(fā)表于 10-30 10:20 ?13次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)與C<b class='flag-5'>程序設(shè)計(jì)</b>

    嵌入式開(kāi)發(fā)要學(xué)什么嵌入式開(kāi)發(fā)一些入門教材推薦

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式開(kāi)發(fā)要學(xué)什么嵌入式開(kāi)發(fā)一些入門教材推薦資料免費(fèi)下載教材包括了:ARM嵌入式項(xiàng)目開(kāi)發(fā)三位
    發(fā)表于 01-10 14:46 ?27次下載
    <b class='flag-5'>嵌入式開(kāi)發(fā)</b>要學(xué)什么<b class='flag-5'>嵌入式開(kāi)發(fā)</b>的<b class='flag-5'>一些</b>入門教材推薦

    嵌入式系統(tǒng)的一些基礎(chǔ)知識(shí)

    本文主要介紹嵌入式系統(tǒng)的一些基礎(chǔ)知識(shí),希望對(duì)各位幫助。
    的頭像 發(fā)表于 02-18 10:44 ?2813次閱讀

    ARM嵌入式系統(tǒng)BSP的程序設(shè)計(jì)總結(jié)

    ARM嵌入式系統(tǒng)BSP的程序設(shè)計(jì)總結(jié)(嵌入式開(kāi)發(fā)模式稱為)-該文檔為ARM嵌入式系統(tǒng)BSP的程序設(shè)計(jì)總結(jié)文檔,是
    發(fā)表于 08-04 10:37 ?4次下載
    ARM<b class='flag-5'>嵌入式</b>系統(tǒng)BSP的<b class='flag-5'>程序設(shè)計(jì)</b>總結(jié)

    嵌入式開(kāi)發(fā)):嵌入式開(kāi)發(fā)新手入門

    本篇文章整理下嵌入式開(kāi)發(fā)一些入門的基礎(chǔ)技能,都是根據(jù)以往的工程經(jīng)驗(yàn)整理,適用于之前沒(méi)做過(guò)嵌入式開(kāi)發(fā)的新手。嵌入式開(kāi)發(fā)流程般如下,
    發(fā)表于 10-14 10:58 ?79次下載
    <b class='flag-5'>嵌入式開(kāi)發(fā)</b>(<b class='flag-5'>一</b>):<b class='flag-5'>嵌入式開(kāi)發(fā)</b>新手入門

    C語(yǔ)言嵌入式培訓(xùn) 嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)

      學(xué)習(xí)嵌入式的基礎(chǔ)語(yǔ)言是C語(yǔ)言,因此先掌握C語(yǔ)言對(duì)于后續(xù)嵌入式的學(xué)習(xí)有著非常大的意義。下面講解下嵌入式C語(yǔ)言程序設(shè)計(jì)基礎(chǔ),尤其是C語(yǔ)言的一些
    發(fā)表于 11-03 21:06 ?32次下載
    C語(yǔ)言<b class='flag-5'>嵌入式</b>培訓(xùn)  <b class='flag-5'>嵌入式</b>C語(yǔ)言<b class='flag-5'>程序設(shè)計(jì)</b>基礎(chǔ)