剛剛看了HAL層驅動API函數,沒有全部看完,本文主要是談談HAL的作用。
所謂HAL層,Hardware Abstract Layer,即硬件抽象層。硬件抽象層主要是干嘛的呢?
HAL在windowsNT中就曾經提出來過,主要是用於處理不同平台之間的移植兼容性的問題。如下一段話是百度百科的內容:
HAL的作用是將操作系統的其余部分表示為抽象的硬件設備,特別是去除了真正硬件所富含的瑕疵和特質。這些設備表現為操作系統的其它部分和設備可以使用的獨立於機器的服務的形式(函數調用和宏)。通過使用HAL服務和間接硬件尋址,當移植到新的硬件上時,驅動程序和核心只需做很少的改動。移植HAL本市是直接的,因為所有的機器相關代碼都集中在一個地方,並且移植的目標是充分定義的,即實現所有的HAL服務。
感興趣的讀者可以看百度百科,了解更為詳細的信息。
如下為document中定義的內容:
This document describes the application programming interface for HAL Drivers. The API provides
application the interface to access timers, GPIO, UART and ADC. This is a platform independent API that
provides a superset of features for each service. Not all features will be available for all platforms.
在zstack中,HAL具有與windows相似的功能,,它提供了一種接口來訪問定時器,GPIO,UART,ADC。這些接口都通過相應的函數進行實現。此外,我們還應注意到在OSAL中系統也可以調用相應的函數來訪問這些資源,例如定時器。那么HAL中調用和OSAL中的調用有何區別呢?
在OSAL中,任何的資源調用都是通過一個task來調用的,或者說是某一個task在使用這個資源,例如定時器,而每一個任務都有自己的查詢時間,就是輪詢時間,過了這個時間就會被系統強制掛起,而這些資源可能在下一個task中使用。簡單的說:某一個任務中資源,例如ADC,可能被系統打斷而暫時不執行。
在HAL中,任何函數的調用都是通過阻塞的形式來實現的,或者說任何一個函數都是一個阻塞函數。什么事阻塞呢,阻塞就是獨占,一個函數為執行完畢不會釋放CPU的。假設一個函數為阻塞函數,那么這個函數就會在其調用期間獨占CPU直到執行完畢為止。
所以這樣看來,HAL的優先級比OSAL還是要高一些,它是不會理會系統的。