關於 embedded system 的應用程式架構,最廣為人知的模型就是「event-driven」的做法。傳統的應用程式若是採用「結構化」的方式來設計,是否能適合 embedded system 的應用還需要進一步評估。
典型的 embedded system 裝置經常需要處理圖形顯示與使用者互動,通常使用者是透過像是 touch panel 或是 GPIO 的硬體介面與應用程式溝通,再由應用程式更新圖形顯示。
因此,有沒有任何做法,可以讓我們在 Linux 系統下以直觀的「事件」方式設計程式呢?經常看到的實作方式是使用 pthread 的方式來實作,透過 pthread 來產生多個執行緒,每個執行緒負責設定一個以上的事件;所有的事件都在 parent process 裡的 software loop 做判斷處理。這是最簡本的做法。
上述所提的 parent process 負責「case」(C 的 swith 敘述)所有的事件,並做出相對應的處理,這個 process 通常也被叫做 thread manager,或是 event manager。以一個簡單的 scenario 來說明此架構的應用。
小明想寫一個程式,當使用者按下 ARM9 開發板上的按鍵後,螢幕隨即出現一張圖片;這時,小明必須先定義「按鍵事件」的變數:
int EVENT_KEY_DOWN = 0x01;
我們必須產生一個 thread,來 "polling" 硬體上的按鍵,如果底層的驅動程式是 blocking read 的實作,那麼我們只需要一個簡單的 read() 即可。當 thread 判斷到按鍵被按下後,便將事件指定為 EVENT_KEY_DOWN;此時,您的系統應該有一個主程式(也就是 thread manager)在背景執行,並不停的做 loop-and-case 事件的動作:
while (1) { switch (EVENT) { case EVENT_KEY_DOWN: ... break; case ... } }
許多軟體,像是 Nano-X,就是採取這種實作策略。不過,在特定只有「圖形顯示 v.s. 互動」的應用場合裡,這種架構並不容易寫出「互動性」良好的程式。(待續)
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw