Android 的 HAL 技術, #5: 繼承 HAL 的 struct hw_module_t

jollen 發表於 December 1, 2009 10:09 PM

撰寫 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 程式寫作習慣?最明顯的地方是,程式碼的寫作風格有了很大的改變

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。