硬件抽象層(Hardware Abstraction Layer, HAL)是一個輕量級嵌入式運(yùn)行時環(huán)境,它為用戶應(yīng)用程序和底層硬件提供了一個簡單的設(shè)備驅(qū)動程序接口。HAL應(yīng)用程序接口(API)與ANSI C標(biāo)準(zhǔn)庫綜合在一起,可使用類似C語言的庫函數(shù)來訪問硬件設(shè)備或文件,如printf()、fopen()、fwrite()等函數(shù)。軟件工程師可非常方便的使用這些函數(shù)來與底層硬件通信,而無須關(guān)心底層硬件實現(xiàn)細(xì)節(jié)。
HAL可以看作是一個支持應(yīng)用程序開發(fā)的軟件平臺,它提供API函數(shù)接口,屏蔽硬件訪問細(xì)節(jié),雖然占用了一些額外的資源,但是大大增加了應(yīng)用程序的開發(fā)速度和可移植性。用戶只要利用HAL提供的各種函數(shù)就可以編寫應(yīng)用程序。
HAL作為Nios II處理器系統(tǒng)的設(shè)備驅(qū)動程序包,為系統(tǒng)中的外圍設(shè)備提供了一致的接口。Nios II SBT從SOPC信息文件(.sopcinfo)中提取系統(tǒng)信息,生成一個針對于該硬件配置的定制的HAL板級支持包(BSP)。當(dāng)硬件配置信息發(fā)生改變時,HAL設(shè)備驅(qū)動配置也會自動隨之更改,從而避免了由于底層硬件的變化而產(chǎn)生的編程錯誤。Nios II SBT為用戶自動創(chuàng)建和管理HAL設(shè)備驅(qū)動程序,用戶不用創(chuàng)建或拷貝HAL文件,也不用編輯HAL中的任何源代碼。
HAL為用戶提供以下支持:
集成了newlib ANSI C標(biāo)準(zhǔn)庫,允許調(diào)用類似C標(biāo)準(zhǔn)庫函數(shù);
提供訪問Nios II系統(tǒng)中每個設(shè)備的驅(qū)動程序;
提供HAL API,用于標(biāo)準(zhǔn)的函數(shù)接口如設(shè)備訪問、中斷處理以及ALARM等;
提供系統(tǒng)初始化函數(shù),為main()函數(shù)和C庫函數(shù)建立運(yùn)行時環(huán)境;
提供設(shè)備初始化函數(shù),在main()函數(shù)之前,分配設(shè)備空間并初始化所有的外圍設(shè)備;
Nios II HAL的結(jié)構(gòu)如圖下所示。

Nios II HAL的結(jié)構(gòu)
由上圖可以看出,用戶應(yīng)用程序在硬件抽象層和C標(biāo)準(zhǔn)庫函數(shù)上,這說明用戶應(yīng)用程序要訪問硬件設(shè)備至少有4中方法:
調(diào)用C標(biāo)準(zhǔn)庫函數(shù),如printf()和fwrite();
調(diào)用硬件抽象層的API函數(shù),如write();
調(diào)用設(shè)備驅(qū)動程序,如alt_avalon_uart_write();
直接訪問設(shè)備寄存器,如IOWR_ALTERA_AVALON_UART_RXDATA(base, data);
HAL I/O操作宏

前兩種方法的抽象度最高,可移植性最好,對用戶來說最容易實現(xiàn),但是需要最多的額外開銷;第三種方法抽象度較低,有一定的移植性,額外開銷較少,但還需要用戶考慮對設(shè)備寫數(shù)據(jù)前的其他硬件操作;最后一種方法完全是對硬件的直接訪問,需要用戶關(guān)注設(shè)備的每個硬件細(xì)節(jié),無額外開銷。
對于I/O外設(shè),HAL提供了一些宏定義來訪問其中的寄存器,這些宏在
另外,在HAL中還定義了常用的數(shù)據(jù)類型,這些定義在alt_type.h文件中,下面是alt_types.h文件內(nèi)容的片段,從中我們可以看出,所有的數(shù)據(jù)類型都是以alt_開頭,若是無符號類型,那么數(shù)據(jù)類型中含有“u”表示unsigned的意思,最后會用數(shù)據(jù)的位數(shù)來結(jié)尾,如8、16、32、64。使用這些HAL數(shù)據(jù)類型可以很方便的看出變量的數(shù)據(jù)類型,比如,alt_u8 key_data 就表示key_data是一個8位的無符號數(shù)據(jù)。

使用HAL開發(fā)應(yīng)用程序
基于HAL的軟件工程的創(chuàng)建和管理與Nios II SBT緊密相關(guān),下圖為Nios II SBT工程結(jié)構(gòu)。

Nios II SBT工程結(jié)構(gòu)
從上圖可以看出,一個Nios II SBT工程包括2個工程:用戶應(yīng)用程序工程和HAL BSP工程。用戶應(yīng)用程序工程包含所有的用戶程序代碼文件,最終的可執(zhí)行映像由此工程生成。HAL BSP工程中包含所有與硬件處理器系統(tǒng)相關(guān)的接口信息。
在第一次編譯Nios II SBT過程中,編譯工具會根據(jù)硬件系統(tǒng)信息生成一個描述硬件信息的system.h文件,如代碼1.1所示。該文件是HAL的基礎(chǔ),它提供了關(guān)于Nios II系統(tǒng)硬件的描述,是硬件和軟件之間的橋梁。對應(yīng)用程序開發(fā)來說,并不是system.h中的所有信息都有用,因此并不一定要在應(yīng)用程序的C源代碼文件中包含system.h。
由代碼1.1可知,system.h文件給出了每個外設(shè)的詳細(xì)信息,包括以下幾部分:
外設(shè)的硬件配置;
外設(shè)的基地址;
中斷優(yōu)先級(如果外設(shè)有中斷);
外設(shè)的符號名稱;

代碼1.1 system.h文件示例
-
處理器
+關(guān)注
關(guān)注
68文章
20253瀏覽量
252237 -
嵌入式
+關(guān)注
關(guān)注
5198文章
20445瀏覽量
334008 -
接口
+關(guān)注
關(guān)注
33文章
9520瀏覽量
157021 -
硬件
+關(guān)注
關(guān)注
11文章
3595瀏覽量
69011
原文標(biāo)題:Nios II 處理器的硬件抽象層(HAL)中文解說
文章出處:【微信號:友晶FPGA,微信公眾號:友晶FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于NIOS II嵌入式處理器的LCD控制實現(xiàn)
基于Nios II和uClinux實現(xiàn)遠(yuǎn)程測控服務(wù)器的設(shè)計
基于NIOS II 軟核處理器的SOPC 技術(shù)
Cyclone II FPGA和Nios II嵌入式處理器的優(yōu)勢
基于Nios II處理器的USB接口設(shè)計
NIOS II的特性及開發(fā)設(shè)計流程
Nios II處理器-世界上最通用的處理器
Nios II處理器內(nèi)核詳解
Nios II 系列處理器配置選項
怎樣使用Nios II處理器來構(gòu)建多處理器系統(tǒng)
FPGA視頻教程之如何使用NIOS II處理器
FPGA Nios嵌入式處理器的硬件開發(fā)
深度剖析Nios II 處理器的硬件抽象層
評論