嵌入式開發中設計介面的5個技巧

嵌入式軟體開發人員的日常活動是為他們正在開發的軟體元件設計介面。介面描述了可以與元件進行的互動、其行為以及其輸入和輸出。不幸的是,許多經過深思熟慮的介面使得開發人員更難有效地使用它們。本文將探討所有嵌入式開發人員都應該遵循的設計軟體介面的五個技巧。

技巧1–使用通用介面語言

在設計介面時,儘量遵循行業標準術語和技術,以使介面令人難忘。儘管現在大多數IDE都有一些程式碼補全的智慧,但它並不總是有效的。當開發人員“處於流程中”時,被迫檢視介面可能會中斷開發。

例如,如果你正在設計數字輸入/輸出介面,你可以考慮定義介面函式和方法名稱,如:

Dio_Init

Dio_Write

Dio_Read

Dio_DeInit

更符合面向物件範例的更好介面是:

Dio_Create

Dio_Write

Dio_Read

Dio_Destroy

我們希望避免不明確的硬體介面的名稱。

技巧2–限制介面的大小

人類的大腦只能在短期的“RAM”中儲存7-12條資訊。如果需要更多的資訊,記憶就變得更加困難。將介面的大小限制在10-12通常足以滿足元件的需要。

如果介面擴充套件到超過10到12個功能,這表明元件試圖做得太多了!此時,嵌入式開發人員應該仔細研究是否應該將元件拆分為多個具有更明確目的的元件。這樣做可以提高元件的程式碼結構、可移植性和可重用性。開發人員更有可能更好地記住介面!

嵌入式開發中設計介面的5個技巧

技巧3——使用TDD來指定介面

對於想要編寫可測試程式碼並避免“以後除錯”編碼實踐的開發人員來說,測試驅動開發是一個極好的工具。然而,TDD確實有進一步的用途,因為我們可以用它來建立測試,以驗證介面如何如預期的那樣執行。

在介面設計過程的早期,開發人員通常會建立一個他們想要包含的函式或方法的列表。然後,他們會對這些函式的輸入和輸出進行初步猜測。一旦建立了初始列表,開發人員應該為他們的元件建立一個測試列表,用於證明他們的元件工作正常。

有了初始測試列表,嵌入式開發人員可以開始構建需要構建介面的單元測試。當他們完成每個測試時,他們會發現他們最初的介面設計會進化以滿足系統的需求。當測試完成時,將會發生兩件事。首先,一系列測試將描述如何與元件和介面互動。第二,元件將準備好生產。

技巧4——使介面可擴充套件

當使用C與硬體互動時,例如與數字輸入/輸出外設互動,我們可以構建一個介面,允許我們透過擴充套件向驅動程式新增功能。例如,在介面中包含以下兩個函式:

Dio_RegisterRead

Dio_RegisterWrite

這兩個功能將提供對硬體外設暫存器的低階訪問。開發人員可以根據手頭的應用程式構建任意數量的自定義模組和介面,擴充套件驅動程式提供的簡單數字輸入/輸出介面。在這種情況下,仔細的規劃使我們可以輕鬆地擴充套件介面,而無需修改我們的底層驅動程式。

嵌入式開發中設計介面的5個技巧

技巧5——必要時抽象介面

近80%的嵌入式軟體開發人員使用C語言開發他們的嵌入式系統。乍一看,如果不先建立複製和貼上的介面模板,嵌入式開發人員很難重用他們的介面。使用C似乎不像我們在C++中那樣提供抽象。在C++中,我們可以用虛方法建立一個類來定義我們的抽象介面。當我們需要更改底層程式碼時,我們希望抽象介面。例如,如果我想讓我的數字輸入/輸出驅動器為兩個不同的微控制器工作。

在C語言中,我們可以用一點小技巧在我們的介面中獲得類似的行為。訣竅是不要將我們的介面定義為頭中的原型函式列表,而是將我們的介面定義為如下結構中的函式指標列表:

typedefstruct

{

bool(*Init)( const DioConfig_t * const Config);

bool(*Read)(const DioObj_t * const, DioData_t * const DioData);

bool(*Write)(const DioObj_t * const, DioData_t * const DioData);

}Dio_t;

當我們定義結構變數時,我們可以按如下方式分配將被呼叫的函式:

constDio_t Dio =

{

Dio_Init,

Dio_Read,

Dio_Write

};

透過更改結構初始化,我可以輕鬆地更改我正在訪問的底層驅動程式。例如,在嵌入式開發中,對於STM32微控制器,我可以使用以下內容:

constDio_t Dio =

{

STM32_Dio_Init,

STM32_Dio_Read,

STM32_Dio_Write

};

對於MSP430,我可能會使用以下內容:

constDio_t Dio =

{

MSP430_Dio_Init,

MSP430_Dio_Read,

MSP430_Dio_Write

};

此時,應用程式程式碼並不關心底層的Dio函式呼叫是什麼!如果我想初始化Dio,我只需呼叫:

Dio。Init(Config);

很酷的是,它看起來很像我在呼叫類中的方法,但我使用的是C。我還有一個很好的抽象,可以將應用程式程式碼與底層硬體呼叫解耦。這是雙贏!

結論

開發人員在實現新模組時總是會建立新的介面。訣竅是這樣做,使介面自然、令人難忘且易於擴充套件。經常會有人試圖建立介面並繼續前進;然而,介面可能是元件的基本元素。一旦介面設定好,進行更改可能會導致巨大的麻煩和更改的努力。

這篇文章探討了一些基本技巧,以幫助你設計嵌入式軟體介面。遵循這些最低限度的最佳實踐將幫助你設計難忘且可擴充套件的介面,並防止嵌入式開發人員在開發過程中被絆倒。