撰寫 HAL stub 除了要具備系統程式(systems software)的觀念外(這是基礎),「思考方式的改變」也是重要的一堂課。
思考方式哪裡不同?
實作 HAL stub 的首要工作是「繼承 struct hw_module_t 抽象型別」。Class(類別)屬於一種抽象型號(ADT)。
首先,引入最重要的標頭檔(header file):
#include <hardware/hardware.h>
接著,再定義一個「MODULE ID」。這個 mdoule ID 將會被 HAL 層用來尋找 HAL stub。我們舉最簡單的裝置類型「LED」來做為範例:
#define LED_HARDWARE_MODULE_ID "led"繼承 HAL 的 struct hw_module_t 抽象型別(即 base class 的概念),並取名為 struct led_module_t(即 derived class):
struct led_module_t { struct hw_module_t common; };
以資料結構的角度來看,這裡的做法只是宣告了一個抽象資料型別(Abstract Data Type),以提升程式碼的結構化特性。但是,這裡需要以架構的角度來解釋,「Android HAL規定不要直接使用struct hw_module_t」,原文的意思是要我們做類別繼承。
實作繼承
在C語言裡實作繼承的方式,大致如下:
1. 宣告一個 data structure 將原始的基本結構包裝起來
2. 將原始的基本結構放在第一個 field
因此,可以思考如下:
struct led_module_t { struct hw_module_t common; /* Place attributes here. */ /* Place methods here. */ };
唯一,這裡的實作在OO特性上,缺乏像是public與private的封裝性。但這裡的重心是,以OO的方式思考,會如何改變過去的 C 程式寫作習慣?最明顯的地方是,程式碼的寫作風格有了很大的改變。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw