外設驅動庫開發筆記0:EPD總體設計

在產品開發過程中,不可避免需要使用很多外部的元件及傳感器,這些元器件也許是板載的,也許是板外的,但不管怎樣,爲其開發驅動程序都是必須的。每次都需要爲這些元器件編寫驅動程序。但每次重複編寫調試很麻煩,於是我們就考慮能否將這些驅動設計爲能在不同場合複用以減少重複勞動。因此我們就計劃設計一個通用的驅動庫,可以重複使用並可以不斷擴展。

1、開發目標

首先,我們的目的就是要開發我們常用些元器件的驅動,並使用一定的模式規範化這些驅動使其達到可複用的目標。

對於這些驅動很多時候我們會稱其爲板級支持或者硬件抽象。但我們考慮的並不僅僅是板上的設備。我們希望以容易理解容易使用的方式來設計這些驅動。讓使用者可以不需要了解更多的實現細節,而像調用庫函數一樣簡單的使用。

還有我們也希望可以在不同的平臺上使用。爲了達到這裏目的,我們將每個設備獨立設計,某一特定對象與外界的耦合只有硬件接口部分,其它部分儘量保持各自的獨立。

所以,總結一下我們的開發目標有3點:一是,規範設計;二是,容易使用;三是,不依賴於具體平臺。

2、總體設計

依據我們的開發目標,我們從三個方面來設計:一是,對象的抽象化,我們從每種設備的特性抽象出相應的對象類型;二是,以對象爲依據進行訪問,我們開發的庫函數在調用時,以參數的形式將具體對象傳給函數,並通過對象返回數據;三是,對象的初始化問題,每一個具體對象都有其特殊性,在使用之前需要調用初始化函數配置具體的對象。

首先,我們看對象的抽象化。每一類對象都肯定具備2方面的特性:某些特定的屬性和某些特定的操作。比如:設備可能會有地址,狀態等。我們將這類屬性抽象爲字段,每個具體的對象會給與這些字段特定的值。還有我們需要對對象進行讀寫等操作,而且這些操作依賴於具體的操作平臺,我們將這些依賴於具體平臺的操作定義爲方法,以回調函數的方式操作對象。就是說這些操作實在驅動函數內部沒有辦法實現的,而且是基於硬件平臺的基本操作,如串口的數據發送。具體的抽象結構如下圖所示:

接着,我們來考慮對象的初始化操作。對象的初始化通過調用初始化函數來實現。有一些數據必須以參數的形式傳遞給初始化函數,包括對象方法的回調函數指針、需要指定初值的字段值以及初始化設備需要指定的配置參數。採用初始化函數是爲了避免必須初始化的參數被遺忘。如回調函數指針、設備地址等。

最後,我們來設計按對象訪問。我們抽象對象的目的就是爲了能獨立訪問同類型對象。所以我們在設計訪問函數時,將對象作爲參數傳遞我們要調用的函數。這樣我們在訪問多個對象時,各個對象的訪問是互不打擾的。所以我們將抽象的對象定義爲我們希望的結構類型。

3、應用方式

我們已經設計了對象和具體的實現方式。我們還需要考慮一下其應用方式。根據前面的設計,我們要使用某一驅動也需要做三方面的工作:聲明對象、初始化對象、執行對象調用。具體如下:

先說對象的聲明,每類對象根據實際情況聲明對象,名稱無限制,只要符合變量的命名規則就好。

聲明變量後,還需要對該對象初始化纔可以使用。每一類對象都有一個初始化函數。在具體應用中調用此函數對對象進行初始化,初始化的參數根據要求以參數形式傳遞給初始化函數。

初始化完成之後就可以在具體應用中調用相應的函數獲取對象參數。調用的函數一般以對象指針爲實參,調用完成後可以通過對象的屬性得到數據。

此外,所用的對象頭文件都彙集在擴展外設配置文件中,所以我們需要將配置文件添加到我們的應用中,並通過宏定義添加我們需要用到對象的頭文件,將宏參數定義爲0則不使用,定義爲1則使用。然後還需要將我們使用的對象的源文件添加到我們的應用項目中就可以了。

4、總結說明

本套驅動程序完全開源,並會根據使用情況隨時修正和新增。並將源碼公佈到GitHUBhttps://github.com/foxclever/ExPeriphDriver

歡迎關注:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章