嵌入式軟件開發人員的日常活動是為他們正在開發的軟件組件設計界面。界面描述了可以與組件進行的交互、其行為以及其輸入和輸出。不幸的是,許多經過深思熟慮的界面使得開發人員更難有效地使用它們。本文將探討所有嵌入式開發人員都應該遵循的設計軟件界面的五個技巧。
技巧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個功能,這表明組件試圖做得太多了!此時,嵌入式開發人員應該仔細研究是否應該將組件拆分為多個具有更明確目的的組件。這樣做可以提高組件的代碼結構、可移植性和可重用性。開發人員更有可能更好地記住界面!
技巧3——使用TDD來指定接口
對于想要編寫可測試代碼并避免“以后調試”編碼實踐的開發人員來說,測試驅動開發是一個極好的工具。然而,TDD確實有進一步的用途,因為我們可以用它來創建測試,以驗證接口如何如預期的那樣運行。
在界面設計過程的早期,開發人員通常會創建一個他們想要包含的函數或方法的列表。然后,他們會對這些函數的輸入和輸出進行初步猜測。一旦創建了初始列表,開發人員應該為他們的組件創建一個測試列表,用于證明他們的組件工作正常。
有了初始測試列表,嵌入式開發人員可以開始構建需要構建接口的單元測試。當他們完成每個測試時,他們會發現他們最初的界面設計會進化以滿足系統的需求。當測試完成時,將會發生兩件事。首先,一系列測試將描述如何與組件和界面交互。第二,組件將準備好生產。
技巧4——使界面可擴展
當使用C與硬件交互時,例如與數字輸入/輸出外設交互,我們可以構建一個接口,允許我們通過擴展向驅動程序添加功能。例如,在界面中包含以下兩個函數:
Dio_RegisterRead
Dio_RegisterWrite
這兩個功能將提供對硬件外設寄存器的低級訪問。開發人員可以根據手頭的應用程序構建任意數量的自定義模塊和接口,擴展驅動程序提供的簡單數字輸入/輸出接口。在這種情況下,仔細的規劃使我們可以輕松地擴展接口,而無需修改我們的底層驅動程序。
技巧5——必要時抽象接口
近80%的嵌入式軟件開發人員使用C語言開發他們的嵌入式系統。乍一看,如果不先創建復制和粘貼的接口模板,嵌入式開發人員很難重用他們的接口。使用C似乎不像我們在C++中那樣提供抽象。在C++中,我們可以用虛方法創建一個類來定義我們的抽象接口。當我們需要更改底層代碼時,我們希望抽象接口。例如,如果我想讓我的數字輸入/輸出驅動器為兩個不同的微控制器工作。
在C語言中,我們可以用一點小技巧在我們的接口中獲得類似的行為。訣竅是不要將我們的接口定義為頭中的原型函數列表,而是將我們的接口定義為如下結構中的函數指針列表:
typedef struct
{
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;
當我們定義結構變量時,我們可以按如下方式分配將被調用的函數:
const Dio_t Dio =
{
Dio_Init,
Dio_Read,
Dio_Write
};
通過更改結構初始化,我可以輕松地更改我正在訪問的底層驅動程序。例如,在嵌入式開發中,對于STM32微控制器,我可以使用以下內容:
const Dio_t Dio =
{
STM32_Dio_Init,
STM32_Dio_Read,
STM32_Dio_Write
};
對于MSP430,我可能會使用以下內容:
const Dio_t Dio =
{
MSP430_Dio_Init,
MSP430_Dio_Read,
MSP430_Dio_Write
};
此時,應用程序代碼并不關心底層的Dio函數調用是什么!如果我想初始化Dio,我只需調用:
Dio.Init(Config);
很酷的是,它看起來很像我在調用類中的方法,但我使用的是C。我還有一個很好的抽象,可以將應用程序代碼與底層硬件調用解耦。這是雙贏!
結論
開發人員在實現新模塊時總是會創建新的接口。訣竅是這樣做,使界面自然、令人難忘且易于擴展。經常會有人試圖創建界面并繼續前進;然而,接口可能是組件的基本元素。一旦界面設置好,進行更改可能會導致巨大的麻煩和更改的努力。
這篇文章探討了一些基本技巧,以幫助你設計嵌入式軟件界面。遵循這些最低限度的最佳實踐將幫助你設計難忘且可擴展的界面,并防止嵌入式開發人員在開發過程中被絆倒。