微控制器已經達到了一個成本點和功能點,許多應用程序的開發人員不再需要編寫嚴格的裸機代碼。相反,開發人員可以編寫更高級別的代碼,類似于PC上的應用程序開發人員編寫代碼的方式。為了做到這一點,有兩種不同的機制可供嵌入式開發人員使用:API和HAL。
HAL是一個硬件抽象層,它定義了一組用于與硬件交互的例程、協議和工具。HAL專注于創建抽象的高級功能,這些功能可用于使硬件做一些事情,而不必詳細了解硬件是如何做的。對于使用多個微控制器硬件并需要將應用程序從一個平臺移植到另一個平臺的開發人員來說,這非常方便。HAL也是一種很好的方式,讓不是底層硬件專家的工程師也能編寫有用的應用程序代碼,而不需要具體的細節。
API是一個應用程序編程接口,它定義了一組用于創建應用程序的例程、協議和工具。API定義了組件及其輸入和輸出的行為和功能的高級接口。應該創建一個通用的、獨立于實現的API。這允許API在多個應用程序中使用,只需改變API的實現,而不需要嵌入式開發人員改變一般的接口或行為。
API和HALs密切相關,但在軟件開發中有兩種不同的功能。HAL位于底層驅動程序之間,為通用軟件堆棧(如RTOS)和中間件組件(如USB、以太網和文件系統)提供通用接口。HAL可以充當包裝器,用于在現有驅動程序和高級代碼之間提供公共接口,或者它可以作為驅動程序接口本身存在。API就像一個工具包,幫助高級開發人員快速生成應用程序代碼。它為控制系統的實時行為和訪問通用組件(如串行通信和文件訪問)提供了通用接口代碼。
分離這兩個概念并使用分層軟件架構可以極大地提高嵌入式軟件的可重用性。想象一下,能夠交換HAL下的每一層,并用新的硬件和驅動程序替換它。這是升級現有硬件時可能發生的情況的一個很好的例子。不需要從頭開始,只需要更新HAL下面的代碼。同樣的想法也適用于刪除HAL之上的代碼。相同的硬件,新的應用程序。其結果是,更快的嵌入式開發周期、增加的代碼重用和由于繼承而增加的健壯性。