嵌入式系統上訊息機制的實現(很經典的分析)

2021-05-09 16:22:41 字數 3295 閱讀 7414

摘要:圖形使用者介面是嵌入式系統中重要部分,是使用者與系統進行互動的樞紐,如何建立乙個有效的訊息機制,實現訊息從使用者到系統的傳遞,以及系統對訊息的處理如何再反映到圖形使用者介面是嵌入式系統開發的重要環節。本文通過對 minigui的訊息機制的分析後,介紹一種簡單的基於嵌入式系統的訊息機制的實現方法,其相對於專業的 gui中介軟體中的訊息機制簡單許多,但是也有著完善的結構,便於系統整合在一起,非常適用於一些輕量級圖形使用者介面的嵌入式應用。

廣告插播資訊

維庫最新熱賣晶元: sg3524bn

w27e257-12

tms320c32pcma40

pt2257

es1989s

pbss5350z

ca3130m

hcpl-3121

ir2172

m52036sp

1引言嵌入式系統,作為計算機兩大分支之一,從不同的角度影響著人們的生活,尤其是在通訊、工控、電子等領域發揮著越來越重要的作用。嵌入式裝置之所以為眾多使用者樂於接受,是因為嵌入式裝置有著自然的人機互動介面,較小的尺寸、微功耗和低成本的特點。同時,這些特點也要求嵌入式產品設計者相應降低處理器的效能,限制記憶體容量和復用介面晶元,這就相應提高了對嵌入式軟體設計技術要求。如,選用最佳的程式設計模型和不斷改進演算法。這也正是本文的目的,提出乙個訊息機制實現的模型,並具有良好的可擴充套件性和維護性。

2 對minigui中的訊息機制分析

minigui下的通訊是一種類似於 win32的訊息機制,執行在 minigui-threads模式下時,執行緒間的訊息傳遞模型如下圖所示,其中的 desktop執行緒充當乙個微伺服器,所有的訊息在 event執行緒獲取出來以後就會投遞給 desktop執行緒,然後再分發到目的應用程式主視窗上面。

minigui-threads 中每個執行緒建立的第乙個主視窗,其託管視窗必須是桌面,即 hwnd_desktop,該執行緒的其他視窗,必須由屬於同一執行緒的已有主視窗作為託管視窗。系統在託管視窗為 hwnd_desktop時建立新的訊息佇列,而在指定非桌面的視窗作為託管視窗時,使用該託管視窗的訊息佇列,也就是說,同一執行緒中的所有主視窗應該使用同乙個訊息佇列。通過對 minigui開源學習版本版本 1.6.2源**的分析,其訊息機制模型大致如下:

a)  event執行緒中的 void* eventloop (void* data)函式通過巨集ial_waitevent等待底層事件發生,ial_waitevent實際上是呼叫當前系統所指定的 ial引擎的 wait函式,收到具體的事件觸發訊息後,eventloop再呼叫 parseevent函式來解析這個事件訊息, parseevent解析後,再往 desktop的訊息佇列中傳送相應的訊息, eventloop從 parseevent返回後,單次迴圈結束,再次回到 ial_waitevent,如此反覆迴圈。

b)  desktop執行緒在佇列中收到訊息後,根據訊息種類處理分別處理,再將訊息發往當前活動視窗(活動視窗控制代碼__mg_active_mainwnd)的訊息佇列。

c) 其它視窗執行緒中,一般會有如下格式的迴圈來處理訊息

while (getmessage (&msg, hmainwnd)) getmessage 函式從控制代碼為hmainwnd的視窗的訊息佇列當中獲得訊息,然後呼叫 translatemessage函式將某些訊息如 msg_keydown 和 msg_keyup 翻譯成字元訊息 msg_char ,最後呼叫 dispatchmessage 函式將訊息傳送到指定的視窗,或者理解為 dispatchmessage呼叫指定視窗的視窗過程,並傳遞訊息及其引數。

由此可見,minigui的訊息機制是相當完整的,擴充套件性,健壯性都很好,很適合開發複雜的桌面系統,但是如果在一些資源相對有限的嵌入式場合並且視窗數目不多,選單簡單,不需要視窗重疊,視窗移動等應用情況下,沒有必要使用專業 gui中介軟體。在此情況下,有必要引入乙個簡單的訊息機制,來維護系統底層事情、程式後台選單和前台顯示之間的關係。

3簡單訊息機制的實現

3.1 訊息機制結構

採用不同於minigui的訊息佇列的通訊方式,因為簡單的應用的視窗數目不多,這裡的

視窗數目的含義是每乙個在目標機上可能出現的系統選單逐級顯示介面。這個訊息機制的系統結構圖,如圖1所,結合圖說明這個簡單訊息機制的實現過程:

後續再判斷按鍵是不是但前選單需要的按鍵,如果不是,則此函式不會呼叫任何處理函式,直接返回,反之,則呼叫相應按鍵的處理子程式。

c) 經判定後,如果要處理該按鍵,就進入了相應的過程函式,每個過程函式,都有一段 refreshroutine,這個函式的作用就是根據具體的按鍵(按鍵可能觸發轉到新的選單頁面),current_win_id,pre_win_id,3個要素來更新 current_win_id,同時把原來的 current_win_id儲存到pre_win_id中,這樣新的按鍵有效後,前台顯示和後台選單的位置就同步了,之後呼叫相應的應用程式,根據應用程式返回的引數,再決定是否重新整理 screendc,即呼叫 gdi進行相應區域的重繪工作。

3.2 利用2個陣列來記錄所有選單

object* win_object、menu win_menu這2個陣列與menu之間的關係如圖 2所示。win_object是乙個結構體指標陣列,陣列的每一項,存放乙個指向 object型別的結構體陣列的指標(如mainmenu[3]),這個結構體陣列相當於乙個選單的作用,陣列的長度表示該選單下,選單項的個數,同時,id標籤也指向這個選單,如圖 2中 mainmenu_id,win_object[mainmenu_id]中就存放了乙個指向mainmenu陣列的指標。 mainmenu中的每一項指向乙個具體的object結構體,可以抽象理解為指向乙個按鈕。 win_menu陣列的作用是指示當前選單下按鈕的個數,以及當前按鈕的索引和預設按鈕的索引,如win_menu[mainmenu_id]=;表示mainmenu_id選單下,有3個按鈕,預設和當前按鈕都是button0。在object結構體中,還存放了該 object的事件處理函式指標。

可以看出,採用這種模型能把前台顯示的選單系統很直觀的表現出來,這樣,極大的方 便了後台的維護,有著相對視覺化的優點,並且具有良好的移植效能,在更換平台時,只要考慮gdi函式的重寫以及底層按鍵與結構體 event_descriptor註冊關係。適合於輕量級的嵌入式系統應用,不能應用於複雜的介面開發,如需要視窗重疊,剪貼等,也恰恰印證了嵌入式系統都有著自己特殊的應用範圍這一特殊性。

4 結 束

本文摘自http://www.dzsc.com/data/html/2009-9-7/78537.html

C語言 嵌入式系統的訊息機制

訊息響應 訊息有多種 ir key 系統及異常 訊息 處理訊息的最佳機制 佇列 訊息處理得好,直接關係到系統的耦合性及健壯性。下面給出乙個訊息機制的框架 資料結構 typedef struct qune data qune data pvmcdenc null 1 獲得外界或系統觸發,獲得訊息 將訊...

嵌入式Linux系統的移植(上)

一 核心原始碼的準備和交叉編譯環境的建立 開發環境搭建 vmware workstation軟體來做虛擬機器,vmware workstation 軟 件 可 以 在 wmeare 官 網 下 載 下 載 地 址 當前最新版 本是 vmware workstation pro 15。nfs linu...

ARM嵌入式系統上OpenCL測試

by toradex giovanni bauermeister 1 簡介 相比曾經,如今科技裝置對處理效能和速度要求越來越高。為了應對這種技術需求,許多公司發明了不少方法來獲得更好的處理效能。例如蘋果公司,發明了 open computing language opencl 2008年6月,蘋果公...