實用單片機系統(tǒng)MS3_第1頁
實用單片機系統(tǒng)MS3_第2頁
實用單片機系統(tǒng)MS3_第3頁
實用單片機系統(tǒng)MS3_第4頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實用單片機系統(tǒng)MS3程序分析作者:閆瑤目錄:1.MS3簡介 2.MS3程序架構分析3.思想總結MS3簡介 1.平臺化 MS3是一個注重于基礎與實用,為使用者提供必要和通用的各種函數(shù),軟件架構清晰,完全開源的軟件平臺。 這個平臺讓開發(fā)者基于一定的基礎上進行開發(fā),便于使用者快速且高效的完成各種不同的項目。 2.資源概況 MS3致力于簡潔、實用的軟件架構。 數(shù)據(jù)封裝格式上普遍采用枚舉與結構體,清晰明了,便于閱讀;采用動態(tài)靈活的指針結構,節(jié)省系統(tǒng)空間,簡化程序;采用16進制的消息處理機制;獨特的軟件定時器設計;具有統(tǒng)一和標準化的按鍵處理機制。 3.進版說明 相比前兩個版本,MS3在消息機制上有改進,采

2、用16位結構;軟件定時器上有了比較大的改進,采用回調函數(shù)形式,并且支持中斷內回調和中斷外回調 ;去掉了很多具體的應用,留下一個內核可以適用于一個最小系統(tǒng)。MS3程序架構分析 MS3這個平臺的核心在于“消息機制”。 從主程序Main()的結構可以看出,初始化init_process()之后程序即進入大循環(huán),在這個循環(huán)體中進行的是兩種操作:取消息和根據(jù)消息類型選擇待執(zhí)行的程序分支。 MS3平臺架構的核心內容是其“消息機制”的處理,但其特色不僅僅于此。介紹完消息機制后,我們會介紹“軟件虛擬定時器”的原理及使用 。 主程序main( )結構:目前程序中通過枚舉方式定義了如下消息類型: MSG_NULL

3、 - /*have no message*/ MSG_KEY - /*key message*/ MSG_UART - /*uart message*/ MSG_RTC - /*real time counter message*/ MSG_MSTIMER - /*timer message*/ MSG_TEST - /*special for test message*/程序進入循環(huán)體后,首先通過MSG_GET_MSG(&Msg) 讀取消息,然后根據(jù)消息類型選擇程序分支。可以看出MS3消息機制的結構很清晰,程序的執(zhí)行即通過該消息機制。 MS3中定義隊列 u16MsgArrayMSG_

4、ARRAY_SIZE 來存放消息,消息被定義為U16數(shù)據(jù)類型, 高8位存放消息類型,低8位存放消息值。 入消息和取消息 從主程序段中看出,針對消息隊列的操作主要是取消息動作,那下面看一下MS3中對入消息和取消息分別是怎么操作的。 整體來說,入消息時將消息類型及消息值分別入隊列;取消息則取出數(shù)據(jù)類型為16位的消息。 入消息: 首先判斷消息隊列是否已滿。若滿則返回;未滿則保存當前中斷使能狀態(tài),同時關中斷。 將消息類型(MsgType)、消息值(Val)分別入隊列。 開中斷。 取消息 #define MSG_GET_MSG(pU16) msg_get_out(pU16) 從宏定義可以看出,主程序中取

5、消息動作即是通過左邊的函數(shù)執(zhí)行的。 取消息時首先判斷隊列是否為空。為空則返回0 x0000;不為空則保存中斷使能狀態(tài),并且關中斷。取出數(shù)據(jù)類型為pU16的消息?;謴椭袛嗍鼓軤顟B(tài),返回。 消息機制的執(zhí)行 結合入消息和取消息,我們可以這樣理解Main()內循環(huán)體的執(zhí)行狀況。 首先,向u16MsgArray內取消息,分支選擇語句switch(MSG_TYPE(Msg)則提取出消息的消息類型,根據(jù)不同類型執(zhí)行相應程序分支,其中也包括隊列中無消息時對應的消息類型MSG_NULL。因為當隊列中消息時的返回值為0 x0000,故執(zhí)行MSG_NULL分支。 時鐘節(jié)拍的引入 以上了解到消息機制的執(zhí)行狀況,但在程

6、序初始化之后,消息隊列是默認為空的。這樣,雖然循環(huán)體內一直會取消息并判斷消息類型,但將始終執(zhí)行MSG_NULL程序段。 那么MS3是如何執(zhí)行我們需要執(zhí)行的任務的呢?那就是前面提到的入消息?,F(xiàn)在我們來看看哪些地方,我們進行入消息的操作了。 在這之前我們要介紹一下MS3的系統(tǒng)時鐘節(jié)拍。 時鐘節(jié)拍 MS3以T2為硬件定時器,具有較高的優(yōu)先級,整個系統(tǒng)必須依賴它來運行。按鍵檢測,軟件虛擬定時器,例行任務程序都要靠它來實現(xiàn)。T2作為系統(tǒng)時鐘,20ms進入一次中斷,中斷內調用timer2_process(),因此系統(tǒng)時鐘節(jié)拍為20ms。這樣每次系統(tǒng)時鐘節(jié)拍到了之后,程序進入timer2_process()

7、。此進程中,首先檢測是否有軟件虛擬定時器(后續(xù)將詳細介紹)在工作,若有則進入軟件定時器服務程序;若無則運行例行任務程序。 例行任務程序 例行任務程序中包括:key_check()鍵盤例行程序和rtc_soft_routine()實時時鐘例行程序。 在這兩個例行程序中均有:MSG_SEND_MSG()這個函數(shù),這就是前面提到的入消息操作。 既然有入消息操作了,那么主程序循環(huán)體中的取消息操作就將取到當前消息隊列中的消息。并按需求執(zhí)行相對應的程序段。 消息機制小結 前面針對消息機制,分析了程序的執(zhí)行過程。在這里將前面提到的內容做個歸納。 程序開始運行后,首先執(zhí)行初始化操作,包括:端口初始化、中斷初始

8、化、FLASH初始化、實時時鐘初始化等等,其中包括最重要的系統(tǒng)時鐘初始化timer0_init()。 初始化完畢后,MS3進入消息機制管理階段,此階段程序循環(huán)向u16MsgArray 內取消息,將取出的消息通過MSG_TYPE( )得到消息類型,在分支選擇語句中根據(jù)消息類型執(zhí)行相應程序段。以上消息機制一直循環(huán)貫穿于整個系統(tǒng)的運行中。 除了不斷循環(huán)的消息機制管理外,那就是例行任務程序以系統(tǒng)節(jié)拍為周期,根據(jù)需要向消息隊列中送人待執(zhí)行的消息。 這樣,MS3在程序前后臺兩方面的配合下,通過消息機制正常運轉。 軟件虛擬定時器 本文檔開始的時候,我們提到過“軟件虛擬定時器”這個名詞,那么它有什么作用,并且

9、如何使用呢?下面這部分就將詳細介紹 -軟件虛擬定時器。 *在初讀MS3,還沒有完全理解軟件虛擬定時器作用的時候,感覺它沒什么特別的地方,但一旦后來理解其含義時,才感覺它是很有意思的一個東西。 軟件虛擬定時器的引入 現(xiàn)在理解“軟件虛擬定時器”之后,感覺作者在MS2程序分析中舉的“鬧鐘”的例子是很恰當?shù)?,并且利于初學者對其概念進行理解。 首先我想說說平時我們使用鬧鐘的目的。假設一個電子表有鬧鐘的功能,我們使用鬧鐘就是想在我們定的一段時間之后得到提醒,在定好時間之后,我們就不愿意時時刻刻的去查看定時的時間是否要到了,希望電子表能自動提醒我們。同時在這段時間之內我們還想讓電子表正常提供顯示時間的功用。

10、 在MS3中使用軟件虛擬定時器也是一樣的目的,我們想要一個任務在一定時間之后被執(zhí)行,在我們定好時間之后我們又不愿去管理它,那么虛擬時鐘管理程序就會在定時時間到了的時候,自動將待執(zhí)行的程序加入的MS3的消息機制執(zhí)行。這就是MS3的另一特色。 以上是從思想和概念上向大家介紹“軟件虛擬定時器”,接下來我們看看MS3中軟件虛擬定時器是如何具體操作的。 軟件虛擬定時器的建立現(xiàn)在分析一下 U8 MSTimerStart( ) 這個函數(shù)。 一旦有類似于前文提到的”鬧鐘”程序要執(zhí)行,則要通過該函數(shù)建立一個軟件虛擬定時器。程序開始首先要檢查MSTimerID這個參數(shù),以便確認當前有幾個虛擬定時器正在被使用。一旦

11、查找到尚空閑的虛擬定時器,則在對應位置上向MSTimerArrayi.delay和MSTimerArrayi.pCallBack中存入所需延時的時間和待執(zhí)行函數(shù)的函數(shù)指針。找到這個空閑的位置,并且存入相應參數(shù)后,通過SETBIT(MSTimerID, i)將當前空閑位置1,表明此處已使用虛擬定時器,并通過return(i)返回。 *MS3中允許用戶最多建立八個軟件虛擬定時器。 軟件虛擬定時器服務程序 一旦建立軟件虛擬定時器后,參數(shù)MSTimerID將為非零,表明當前有虛擬定時器工作。那么如下timer2_process( )中 if 語句將滿足“MSTimerID0”的條件,這樣MSTimer

12、Service( )將會被調用。 當有軟件虛擬定時器工作時,一旦系統(tǒng)時鐘節(jié)拍到時,則調用MSTimerService( )服務程序。程序中對定時器參數(shù)MSTimerID從低位開始檢測,若判定當前位有虛擬定時器工作,并且定時時間未到,則將定時時間減1,然后循環(huán)檢測下一位,直到當前位無虛擬定時工作為止。 在檢測過程中,當某個虛擬定時器定時時間到了之后,則根據(jù)該虛擬定時器被建立時MSTimerMode的設定值,為1則將消息類型MSG_MSTIMER及待執(zhí)行函數(shù)的函數(shù)地址均入消息隊列;為0則在中斷中執(zhí)行對應的函數(shù)。然后清除該虛擬定時器對應的參數(shù)MSTimerID 。 以上為一個系統(tǒng)時鐘節(jié)拍所執(zhí)行的操作

13、。達到的效果是每個虛擬定時器的定時時間都減1。在若干個時鐘節(jié)拍之后,若無新的虛擬定時器被建立,則所有虛擬定時都將執(zhí)行完畢。 通過以上介紹,應該可以知道虛擬定時器服務程序的目的。 它是將建立的需要延時一定時間之后再執(zhí)行的程序,在定時時間到達后將其加入到消息隊列中。由主程序的消息機制來管理,以達到執(zhí)行相應程序的目的。 這就是MS3中消息機制和軟件虛擬定時器的關系。 另外,軟件虛擬定時器可以實現(xiàn)嵌套,即軟件定時器里可以嵌套新的軟件定時器。 按鍵處理機制 MS3中包含統(tǒng)一和標準化的按鍵處理機制。 按鍵處理程序包含在例行任務中,每個系統(tǒng)節(jié)拍 到時都會進行按鍵檢查。由于以20ms的系統(tǒng)時鐘為執(zhí) 行周期,故

14、我們常遇到的“20ms按鍵去抖”處理可以在 MS3中有較好的處理。 MS3有兩種按鍵處理風格,一種針對PC機制,另一種針對MCU機制,在預處理階段用戶可對這兩種風格進行選擇。下面以PC風格的具體例程看一下MS3的按鍵處理機制。 每個MS3系統(tǒng)時鐘節(jié)拍內都會執(zhí)行key_check()。 首先,檢查按鍵使能是否打開,未開則返回;然后,讀取按鍵返回信息,若無按鍵操作,則返回,故不會浪費系統(tǒng)資源;若有按鍵,則按鍵計數(shù)器keycounter+,當滿足短按鍵操作條件,且非誤操作,則將按鍵消息入消息隊列;當滿足長按鍵操作條件,同樣將按鍵消息入消息。 按鍵處理中加入“用于連續(xù)兩個按鍵速度過快導致按鍵混亂”的處理機制,保證按鍵處理可靠。 到此,MS3的程序架構可以說簡單的分析完畢了。 我是一名單片機程序的初學者,初次接觸MS3時感覺很有壓力,這么“復雜”的程序不知什么時候才能夠搞明白。因為初次接觸,一開始讀的時候有些吃力,邊學邊讀,時間不是很長,花了半天時間就讀完了,雖然沒有理解其真正的思想,但畢竟有了一個初步的了解。 在這個過程中,將自己理解的東西都記錄下來了。因為不是很明白,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論