當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語(yǔ)言設(shè)計(jì)模式——硬件代理
1. 抽象
硬件代理模式使用結(jié)構(gòu)體封裝硬件設(shè)備,硬件有可能是內(nèi)存、傳感器設(shè)備、IO設(shè)備等,但無(wú)論什么樣的設(shè)備,硬件代理的作用就是隱藏硬件的操作細(xì)節(jié),向客戶(hù)應(yīng)用程序提供初始化、配置、讀寫(xiě)數(shù)據(jù)、打開(kāi)與關(guān)閉等操作的編程接口。
2. 解決的問(wèn)題
如果每個(gè)用戶(hù)程序都直接在程序中訪問(wèn)操作底層硬件,當(dāng)更換了相同功能的不同硬件設(shè)備時(shí),有可能硬件接口并不一致,而且對(duì)硬件的操作與控制方式也并不一樣,這種情況下,就要修改每一個(gè)用戶(hù)程序,導(dǎo)致程序不容易維護(hù)。
通過(guò)提供位于實(shí)際硬件與用戶(hù)程序之間的代理,就可以極大程度避免因?yàn)楦鼡Q硬件而影響程序的設(shè)計(jì),有效減少對(duì)程序的修改。
為了方便維護(hù),客戶(hù)程序可以不用關(guān)心設(shè)備的具體通信細(xì)節(jié),這些細(xì)節(jié)都要在硬件代理的內(nèi)部私有方法中實(shí)現(xiàn)。
3. 模式結(jié)構(gòu)
硬件代理模式的基本組成結(jié)構(gòu)圖表示如下:
圖 硬件代理模式
4. 協(xié)作角色
4.1. 硬件設(shè)備
硬件設(shè)備描述了實(shí)際的硬件,所以不會(huì)為這個(gè)元素編寫(xiě)C語(yǔ)言代碼,放在圖里只是為了方便理解。
硬件設(shè)備和代理之間的關(guān)系就是通過(guò)通信端口、內(nèi)存地址映射或者中斷等方式互相關(guān)聯(lián)起來(lái)。
4.2. 硬件代理
這個(gè)是設(shè)計(jì)模式中主要的部分,也是一個(gè)主要的類(lèi)。
其中包含了描述設(shè)備所使用的數(shù)據(jù),以及操作設(shè)備的時(shí)候可以使用的函數(shù)。
以上圖為例,這個(gè)硬件代理包含了一個(gè)void類(lèi)型的變量hardware,用來(lái)描述設(shè)備的屬性,這里為了方便表達(dá),使用了void類(lèi)型,實(shí)際應(yīng)用的時(shí)候,會(huì)使用相應(yīng)的類(lèi)型,包括基本類(lèi)型和組合類(lèi)型(結(jié)構(gòu)體、聯(lián)合體),但是多數(shù)情況下硬件代理使用結(jié)構(gòu)體會(huì)比較多一點(diǎn)。這些數(shù)據(jù)屬性也可以叫做“類(lèi)屬性”。
除了數(shù)據(jù)屬性,硬件代理里面還定義了如下函數(shù):
init() ——多用于對(duì)硬件設(shè)備的初始化操作
open() ——用于對(duì)設(shè)備的打開(kāi)操作
close() ——用于關(guān)閉設(shè)備
read() ——用于從設(shè)備中讀取數(shù)據(jù)
write() ——用于往設(shè)備寫(xiě)數(shù)據(jù)
這里定義的函數(shù)僅僅是為了方便理解,實(shí)際應(yīng)用的時(shí)候,根據(jù)不同的硬件所支持的不同操作,定義不同的函數(shù),這些函數(shù)也可以叫做“類(lèi)方法”。
在C語(yǔ)言中,類(lèi)的定義與使用需要一定的構(gòu)造技巧,類(lèi)的聲明使用.h頭文件封裝,類(lèi)方法的定義使用.c源文件進(jìn)行封裝。
上圖所表示的HWProxy代理就可以用如下兩個(gè)文件來(lái)描述:
HWProxy.h文件:
/****************************************************
* HWProxy.h
* Created on: 03-五月-2017 下午 5:19:38
* Implementation of the Class HWProxy
* Original author: LvXin
****************************************************/
#ifndef _HWProxy_H
#define _HWProxy_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct HWProxy HWProxy_t;
struct HWProxy {
void hardware;
};
int close (HWProxy_t *me);
int init (HWProxy_t *me);
int open (HWProxy_t *me);
int read (HWProxy_t *me);
int write (HWProxy_t *me, int data);
#ifdef __cplusplus
}
#endif
#endif /*!defined(_HWProxy_H)*/
HWProxy.c文件:
/****************************************************
* HWProxy.c
* Created on: 03-五月-2017 下午 5:19:38
* Implementation of the Class HWProxy
* Original author: LvXin
****************************************************/
#include "HWProxy.h"
int close(HWProxy_t *me)
{
return 0;
}
int init(HWProxy_t *me)
{
return 0;
}
int open(HWProxy_t *me)
{
return 0;
}
int read(HWProxy_t *me)
{
return 0;
}
int write(HWProxy_t *me, int data)
{
return 0;
}
這是一個(gè)簡(jiǎn)單的硬件代理的框架,這里要強(qiáng)調(diào)的是所有的對(duì)外開(kāi)放的聲明,指示類(lèi)的東西全都要放在.h文件中,而所有定義類(lèi)的東西,比如靜態(tài)變量、函數(shù)定義等,全都要放在.c文件中。私有的數(shù)據(jù)或者方法要用static做限定,并且不要放在.h文件里。
5. 效果
硬件代理模式非常簡(jiǎn)單,具有封裝硬件接口,以及屏蔽硬件編碼細(xì)節(jié)的優(yōu)點(diǎn)。
可以實(shí)現(xiàn)不改變用戶(hù)代碼,只修改硬件代理的細(xì)節(jié),就可以從根本上改變具體硬件,提供了非常好的靈活性。因?yàn)橛布牟僮骷?xì)節(jié)都被封裝到了硬件代理的具體方法里,用戶(hù)代碼只需要直接調(diào)用硬件代理提供的函數(shù)接口,就可以實(shí)現(xiàn)對(duì)設(shè)備的操作。