<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 面向設(shè)備編程-嵌入式微系統(tǒng)連載之六

          面向設(shè)備編程-嵌入式微系統(tǒng)連載之六

          作者: 時間:2014-09-10 來源:網(wǎng)絡(luò) 收藏

            結(jié)構(gòu)體封裝了整個系統(tǒng)層,讓App很容易基于跨平臺,那么內(nèi)部該如何組織?

          本文引用地址:http://www.ex-cimer.com/article/262756.htm

            

           

            公司推薦嵌入式開發(fā)遵循CMSIS架構(gòu),用戶應(yīng)用程序可以調(diào)用實時內(nèi)核(OS)、中間件等,也可以直接調(diào)用底層硬件基于CMSIS標準的函數(shù)接口,比如ST公司發(fā)布的STM32的硬件驅(qū)動LIB庫,甚至直接訪問最底層的寄存器。這種架構(gòu)編程比較靈活,對于規(guī)模不大的嵌入式系統(tǒng)比較適合,但這樣的一個架構(gòu)分層還比較模糊,應(yīng)用層幾乎可以訪問所有的系統(tǒng)層資源,比較任意。各種底層接口沒有封裝,規(guī)模一大很容易引起重名、相互調(diào)用,若更換處理器芯片,整個系統(tǒng)層都要重新設(shè)計,不便于移植。為了解決這些問題,需要引入新的概念:設(shè)備,基于設(shè)備把底層的硬件驅(qū)動函數(shù)按功能封裝起來,這樣可以把系統(tǒng)層內(nèi)部理清、分層次、模塊化、可移植。

            

           

            設(shè)備這個詞,我們是經(jīng)常接觸的,我們知道PC機的組成,就是由中央處理器、內(nèi)存、硬盤、主板、電源、顯示器等幾樣組成,這是物理上講的,若從Windows操作系統(tǒng)角度看,我們可以看Windows的設(shè)備管理器。一臺PC機在Windows XP的眼中由DVD驅(qū)動器、IDE控制器、處理器、磁盤驅(qū)動器、電池等等組成,每一個設(shè)備里面又細分為很多小設(shè)備。所以設(shè)備是Windows XP管理的基本對象。

            

           

            在VS.Net架構(gòu)的C#編程角度看,系統(tǒng)層System由各種功能子類組成,子類下面又分子類。應(yīng)用層開發(fā)程序,就是面向System各種類開發(fā)即可,所以類是C#編程的基礎(chǔ)單元。

            無論設(shè)備還是類,它們都是表征一組具有相對完整功能的集合。比如一個人,由頭、四肢、五臟六腑組成,這些部件都是相對完整的功能集,而頭呢,又由大腦、眼睛、鼻子、耳朵等組成,它們的功能也是相對完整的。相對于類這個概念來說,嵌入式人員更容易接受設(shè)備這個名詞,因為有很多實際的對應(yīng)物存在,比如LCD、按鍵、存儲器、串口、ADC、定時器、IO等等,都是具體的一個設(shè)備,它們有非常明確的功能定義,基本上各個項目都需要這些設(shè)備組合起來完成,只是不同的項目可能涉及的設(shè)備種類不同罷了,但基本上脫離不了這么幾種。所以我們可以認為一個系統(tǒng)層System就是由不同的設(shè)備組成的,系統(tǒng)層內(nèi)的中間件也是由設(shè)備來支持的,而設(shè)備則需要編寫設(shè)備驅(qū)動代碼,需要調(diào)用各種硬件驅(qū)動接口函數(shù)來實現(xiàn),比如ST公司發(fā)布的STM32硬件驅(qū)動庫來完成。

            

           

            中低端嵌入式編程,因為資源比較緊張,為了節(jié)省資源,代碼編寫比較緊湊,所以長期以來應(yīng)用層與系統(tǒng)底層是分不清的,這就導(dǎo)致經(jīng)常一個人既要懂上層應(yīng)用,又要懂底層驅(qū)動,對開發(fā)者的要求較高,這也增加了項目的開發(fā)難度。而現(xiàn)在高性能嵌入式芯片的出現(xiàn),可以不再被資源約束,所以引入設(shè)備概念,讓嵌入式編程真正意義上解決了一人打天下的尷尬局面,對于應(yīng)用層開發(fā)人員來說,他們雖然不懂底層硬件驅(qū)動,但可以很容易理解設(shè)備這個功能接口,輕松完成項目需求,而對于底層驅(qū)動人員來說,一個個明確獨立的設(shè)備,更有助于自己清晰的編寫底層驅(qū)動,適合多人協(xié)助開發(fā)。所以msOS,可以認為是面向設(shè)備開發(fā)的架構(gòu)。

            每一個設(shè)備,都有一個對應(yīng)的結(jié)構(gòu)體封裝,因為中低端嵌入式系統(tǒng)規(guī)模不大,為了方便應(yīng)用查看,所以直接封裝在System的Device里面。

            

           

            只有在System的Device中的基礎(chǔ)設(shè)備才可以被應(yīng)用層訪問、調(diào)用,而設(shè)備內(nèi)的其它函數(shù),都需要定義為Static類型,防止被外部調(diào)用。

            一個設(shè)備驅(qū)動的代碼編寫一般的講要分為五部分,以LCD設(shè)備為例:

            1、 建立一個按鍵設(shè)備文件device_lcd.c。

            2、 在device_lcd.c中編寫lcd設(shè)備驅(qū)動代碼,除了外部接口函數(shù)之外,其它的都需要定義為Static類型的靜態(tài)函數(shù),防止被外部函數(shù)調(diào)用。

            3、 在SystemStruct的Device中添加Lcd設(shè)備結(jié)構(gòu)體,內(nèi)部包含接口函數(shù)指針。

            4、 在Lcd設(shè)備初始化函數(shù)InitializeLcd中把Lcd設(shè)備的接口函數(shù)指針與Lcd設(shè)備的接口函數(shù)關(guān)聯(lián)起來:System.Device.Lcd.DisplayString = LcdDisplayString;

            5、 有些需要基于系統(tǒng)節(jié)拍運行的設(shè)備,比如按鍵、定時器設(shè)備,需要由系統(tǒng)節(jié)拍提供系統(tǒng)節(jié)拍服務(wù)程序:KeySystick100Service();TimerSystick1000Service();

            引入設(shè)備概念,把系統(tǒng)層分為一個個相對獨立的模塊,內(nèi)部的函數(shù)都通過Static封裝了,只是保留了設(shè)備接口與外界聯(lián)系,這樣大大簡化了系統(tǒng)的復(fù)雜度,調(diào)理更加清晰,可以支撐項目做的更大更強。封裝之后的設(shè)備功能相對完整,獨立性強,那么它是如何運轉(zhuǎn)的呢?必須要有一套支撐設(shè)備運行的規(guī)范。

            1、 設(shè)備一般分為兩類,一類不需要系統(tǒng)節(jié)拍支撐它運行的,比如Lcd、IO等設(shè)備,它們由上層函數(shù)直接調(diào)用接口即可。還有一類需要由系統(tǒng)節(jié)拍設(shè)備支撐其運行的,比如按鍵和定時器設(shè)備,按鍵是基于每秒100次的按鍵掃描獲取按鍵值,定時器是基于每秒1000次的系統(tǒng)節(jié)拍實現(xiàn)多路虛擬定時器。所以這一類設(shè)備,需要由系統(tǒng)節(jié)拍設(shè)備提供支持,它們的工作基于系統(tǒng)節(jié)拍之上運行,系統(tǒng)節(jié)拍設(shè)備是它們運行的基礎(chǔ)。device_systick.c是系統(tǒng)節(jié)拍設(shè)備,它是相對比較特殊的基礎(chǔ)設(shè)備。

            2、 調(diào)用方式分為三種:上層與下層可以直接調(diào)用,下層對上層提供了兩種方式,一是利用OS的消息機制實現(xiàn)信息上傳,二是采用注冊機制,實現(xiàn)類似處理器中斷的方式,給上層提供信息。

          c語言相關(guān)文章:c語言教程




          關(guān)鍵詞: 嵌入式微系統(tǒng) System ARM

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();