Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)-PPT課件_第1頁
Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)-PPT課件_第2頁
Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)-PPT課件_第3頁
Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)-PPT課件_第4頁
Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)-PPT課件_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第第6 6章章 Nios II Nios II應(yīng)用程序及其應(yīng)用程序及其外設(shè)外設(shè)HALHAL驅(qū)動開發(fā)驅(qū)動開發(fā)6.1 Nios II IDE簡介Nios II IDE為軟件開發(fā)提供4個主要功能:一、工程管理一、工程管理二、編輯器和編譯器二、編輯器和編譯器三、調(diào)試器三、調(diào)試器四、閃存編程器四、閃存編程器統(tǒng)一開發(fā)平臺,用于所有Nios II處理器系統(tǒng)。n硬件抽象層系統(tǒng)庫HALn輕量級IP TCP/IP庫nuC/OS-II實時操作系統(tǒng)RTOSnAltera壓縮文件系統(tǒng)一工程管理器1.新工程向?qū)?.軟件工程模板3.軟件組件6.1 Nios II IDE簡介PIO內(nèi)核結(jié)構(gòu)框圖(對話框位置:對話框位置:Fil

2、eNewC/C+ Application )工程模板工程命名指定硬件系統(tǒng)模板功能介紹二編輯器和編譯器1.文本編輯器成熟的全功能源文件編輯器,包括:語法高亮顯示C/C+程序代碼、全面的搜索工具、文件管理、在線幫助和教程、快速定位及自動糾錯、內(nèi)置調(diào)試等功能。2.C/C+編譯器Nios II IDE使用GCC編譯器,并為其提供了一個圖形化用戶界面。圖形化用戶界面為GCC編譯器提供了一個易用的按鈕式流程,同時允許開發(fā)人員手工設(shè)置高級編譯選項,使得操作更簡單方便。6.1 Nios II IDE簡介三調(diào)試器四軟件調(diào)試器(GDB):是強大的、在GNU調(diào)試器根底之上的軟件調(diào)試器。該調(diào)試器提供許多根本調(diào)試功能以

3、及一些在低本錢處理器開發(fā)套件中不會經(jīng)常用到的高級調(diào)試功能。五根本調(diào)試功能包括:運行控制、調(diào)用堆棧查看、軟件斷點、反匯編代碼查看、調(diào)試信息查看、指令集仿真器。六高級調(diào)試功能包括:硬件斷點調(diào)試ROM或閃存中的代碼、數(shù)據(jù)觸發(fā)、指令跟蹤。6.1 Nios II IDE簡介四閃存編程器五多數(shù)使用Nios II處理器的設(shè)計都需要采用閃存Flash來存儲FPGA配置數(shù)據(jù)和/或應(yīng)用程序。Nios II IDE提供了一個方便的閃存編程方法。任何連接到FPGA的兼容通用閃存接口CFI的閃存器件以及主動串行配置器件EPCS都可以通過Nios II IDE閃存編程器來燒寫。6.1 Nios II IDE簡介n6.1

4、Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)備驅(qū)動n6.9 MicroC/OS-IIn6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項(對話框位置:對話框位置:右擊右擊C/C+工程文件夾工程文件夾System Library Properties )Debug:調(diào)試模式Release:發(fā)布模式nC/C+ Build 設(shè)置6.2 設(shè)置工程系統(tǒng)庫屬

5、性和編譯選項(對話框位置:對話框位置:右擊右擊C/C+工程文件夾工程文件夾System Library Properties )C/C+ Indexer 編制程序文件索引:幫助用戶方便地找到程序文件中的相關(guān)信息。問題報告的類型:幫助用戶方便地定位錯誤。nC/C+ Indexer設(shè)置6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項( 對話框位置:對話框位置:右擊右擊C/C+工程文件夾工程文件夾System Library Properties )nSystem Library 設(shè)置6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項( 對話框位置:對話框位置:右擊右擊C/C+工程文件夾工程文件夾System Library

6、 Properties )nSystem Library 設(shè)置RTOS:指定操作系統(tǒng)。RTOS Options:對RTOS進行設(shè)置。Stdout、stderr、stdin:選擇Nios II 系統(tǒng)的C標(biāo)準(zhǔn)輸入/輸出設(shè)備。Null可節(jié)省程序空間。System clock timer:系統(tǒng)時鐘驅(qū)動所用的定時器。Timestamp timer:時間標(biāo)記驅(qū)動所用的定時器。Max file descriptors:時間標(biāo)記驅(qū)動所用的定時器。6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項( 對話框位置:對話框位置:右擊右擊C/C+工程文件夾工程文件夾System Library Properties )nSyste

7、m Library 設(shè)置用戶自己創(chuàng)立和管理連接,建議采用自動連接。Nios II IDE自動創(chuàng)立和管理連接,使用前必須指定下面選項。n可執(zhí)行代碼駐留的物理存儲器。n只讀數(shù)據(jù)駐留的物理存儲器。n可讀/寫數(shù)據(jù)駐留的物理存儲器。nHeap(堆)駐留的物理存儲器。nStack(棧)駐留的物理存儲器。選擇后,異常堆棧將駐留在單獨的物理存儲器中。n指定異常堆棧駐留的物理存儲器。n指定異常堆棧的最大空間。n6.1 Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7

8、 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)備驅(qū)動n6.9 MicroC/OS-IIn6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.3 調(diào)試/運行程序(對話框位置:對話框位置:RUNDebug /Debug As)選擇Debug的目標(biāo)器件:1.Nios II硬件硬件2.Nios II指令仿真器指令仿真器3.Nios II多處理器集多處理器集n調(diào)試器目標(biāo)連接設(shè)置-(Target Connection)6.3 調(diào)試/運行程序(對話框位置:對話框位置:RUNDebug Nios II Hardware Target Connection)n進行JTAG下載電纜的選擇。n進

9、行連接在JTAG下載電纜上帶JTAG接口器件的選擇。n進行Nios II系統(tǒng)中斷通信工具選擇。n調(diào)試器設(shè)置-(Debugger)6.3 調(diào)試/運行程序(對話框位置:對話框位置:RUNDebug Nios II Hardware Debugger)n調(diào)試器設(shè)置-(Debugger 視窗模式)6.3 調(diào)試/運行程序(Nios II IDE 切換到切換到Debug視窗模式視窗模式)n運行程序-(Debugger 視窗模式)6.3 調(diào)試/運行程序(對話框位置:對話框位置:RUNRUN /RUN As)n6.1 Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6

10、.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)備驅(qū)動n6.9 MicroC/OS-IIn6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.4 下載程序到Flash當(dāng)調(diào)試工作完成并確保程序無錯后,就可以把程序下載到Flash中了。n6.1 Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)

11、備驅(qū)動n6.9 MicroC/OS-IIn6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.5 硬件抽象層(HAL)系統(tǒng)庫嵌入式系統(tǒng)的軟件開發(fā)可分為2局部:應(yīng)用程序開發(fā):用戶軟件開發(fā)的主要局部,包括系統(tǒng)的主程序main()和其它子程序。驅(qū)動程序:直接和底層硬件的宏定義打交道。6.5 硬件抽象層(HAL)系統(tǒng)庫nHAL的構(gòu)成nHAL系統(tǒng)庫為用戶提供以下支持:n集成了ANSI C標(biāo)準(zhǔn)函數(shù)庫,允許調(diào)用類似C標(biāo)準(zhǔn)庫函數(shù);n提供訪問NiosII系統(tǒng)每個設(shè)備的驅(qū)動程序;n提供HAL API,用于標(biāo)準(zhǔn)的函數(shù)接口如設(shè)備訪問、中斷處理以及ALARM等;n提供系統(tǒng)初始化函數(shù),為main

12、()函數(shù)和C庫函數(shù)建立運行時環(huán)境n提供設(shè)備初始化函數(shù),在main()函數(shù)前,分配設(shè)備空間并初始化所有的外圍設(shè)備。Nios II HAL 的結(jié)構(gòu)6.5 硬件抽象層(HAL)系統(tǒng)庫nHAL的構(gòu)成Nios II HAL 的結(jié)構(gòu)6.5 硬件抽象層(HAL)系統(tǒng)庫nHAL的構(gòu)成HAL支持以下幾種通用的設(shè)備模型:1.字符型設(shè)備;2.文件子系統(tǒng);3.DMA設(shè)備4.定時器設(shè)備5.Flash設(shè)備;6.以太網(wǎng)設(shè)備。6.5 硬件抽象層(HAL)系統(tǒng)庫nHAL的通用設(shè)備模型Altera提供的完整HAL支持的外圍設(shè)備:1.字符型設(shè)備包括UART核、JTAG核以及LCD16207顯示控制器;2.文件子系統(tǒng)包括只讀文檔系統(tǒng)

13、;3.DMA設(shè)備包括DMA控制器核;4.定時器設(shè)備包括定時器核;5.Flash存儲器設(shè)備包括通用Flash接口芯片和主動串行配置器件EPCS控制器。6.以太網(wǎng)設(shè)備包括LAN9111以太網(wǎng)MAC/PHY控制器并且需要uC/OS-II支持。7.還有一些第三方提供的外圍設(shè)備,用戶也可以定制字節(jié)的外圍設(shè)備。n6.1 Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)備驅(qū)動n6.9 MicroC/OS-IIn6.10 N

14、ios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.6 使用HAL開發(fā)應(yīng)用程序 nNios II IDE 工程結(jié)構(gòu)Nios II IDE工程結(jié)構(gòu)6.6 使用HAL開發(fā)應(yīng)用程序 nNios II IDE 工程結(jié)構(gòu)一個Nios II IDE工程用戶工程文件夾HAL系統(tǒng)庫文件夾Nios II設(shè)備驅(qū)動6.6 使用HAL開發(fā)應(yīng)用程序 n與目標(biāo)系統(tǒng)相關(guān)的系統(tǒng)描述文件文件構(gòu)成過程一局部描述系統(tǒng)庫的設(shè)置信息;另一局部給出了每個外圍設(shè)備的相信信息;6.6 使用HAL開發(fā)應(yīng)用程序 n與目標(biāo)系統(tǒng)相關(guān)的系統(tǒng)描述文件程序清單描述的UART設(shè)備#define UART_NAME /dev/uart /UAR

15、T的設(shè)備名稱及所在路徑,open()等文件操作函數(shù)可以通/過UART_NAME開打一個UART設(shè)備#define UART_TYPE altera_avalon_uart /描述了UART內(nèi)核的類型,應(yīng)用程序員可不關(guān)心#define UART_BASE 0 x00441480 /UART設(shè)備的存放器基地址,驅(qū)動程序可以根據(jù)該地址對/UART存放器進行訪問#define UART_IRQ 1 / UART設(shè)備的中斷號,系統(tǒng)據(jù)此判別中斷來自UART設(shè)備#define UART_BAUD 115200 / 在系統(tǒng)生成過程中預(yù)設(shè)的串口波特率#define UART_DATA_BITS 8 / 描述UA

16、RT數(shù)據(jù)幀長度#define UART_FIXED_BAUD 0 /波特率是否軟件可變的標(biāo)志#define UART_PARITY N / 是否能奇偶校驗#define UART_STOP_BITS 1 / UART數(shù)據(jù)包中停止位的寬度#define UART_USE_CTS_RTS 0 /是否使用CTS和RTS信號#define UART_USE_EOP_REGISTER 0 /是否生成了EOP(End of Packet)存放器#define UART_SIM_TRUE_BAUD 0 /仿真時的波特率#define UART_SIM_CHAR_STREAM /仿真時的字符流#define

17、UART_FREQ 48000000 / Avalon總線的頻率,48MHz6.6 使用HAL開發(fā)應(yīng)用程序 n數(shù)據(jù)寬度及HAL類型定義類型說明alt_8有符號8位整數(shù)alt_u8無符號8位整數(shù)alt_16有符號16位整數(shù)alt_u16有符號16位整數(shù)alt_32無符號32位整數(shù)alt_u32有符號32位整數(shù)類型說明char8bitsshort16bitslong32bitsint32bits表6.1 HAL數(shù)據(jù)類型定義表6.2 Altera提供的GNU編譯器下的ANSI C數(shù)據(jù)類型寬度6.6 使用HAL開發(fā)應(yīng)用程序 nHAL對系統(tǒng)啟動的支持n啟動代碼用于系統(tǒng)上電復(fù)位后到運行main()函數(shù)前,

18、初始化硬件,構(gòu)建應(yīng)用程序運行時環(huán)境的過程。下面簡單地表達一下這段代碼的完成的功能:n上電或復(fù)位后的程序入口標(biāo)號是“_reset,程序先對CPU進行初始化:n初始化指令Cache,然后調(diào)用_start;n初始化數(shù)據(jù)Cache,把異常向量表裝入指令Cache;n設(shè)置堆棧指針(Stack Pointer)和全局指針(Global Pointer)存放器;n把全局變量和靜態(tài)變量區(qū)(_bss_start _bss_end)清零;n如果沒有bootloader,那么把可讀寫數(shù)據(jù)(.rwdata),只讀數(shù)據(jù)(.rodata)和異常向量表裝入RAM中;n調(diào)用alt_main()。6.6 使用HAL開發(fā)應(yīng)用程序

19、 nHAL對系統(tǒng)啟動的支持nHAL提供默認(rèn)執(zhí)行的alt_main()對CPU及外設(shè)進行初始化:n調(diào)用ALT_OS_INIT()初始化OS:默認(rèn)情況下完成對uC/OS-II的初始化,如果系統(tǒng)不使用操作系統(tǒng),那么這步不執(zhí)行。n如果使用操作系統(tǒng),那么初始化訪問HAL提供的文件系統(tǒng)的信號量alt_fd_list_lock。n初始化中斷控制器,開中斷。n調(diào)用alt_sys_init()初始化系統(tǒng)設(shè)備及軟件模塊,NiosII IDE自動創(chuàng)立管理。n把標(biāo)準(zhǔn)輸入輸出設(shè)備(stdin, stdout, stderr)映射到輸入輸出通道I/O channel上去;n調(diào)用C+的構(gòu)造器,使用the _do_ctors

20、()函數(shù)。n登記C+的解構(gòu)器;n調(diào)用main函數(shù)。6.6 使用HAL開發(fā)應(yīng)用程序 nHAL與異常處理n當(dāng)跳轉(zhuǎn)到異常處理地址后,處理器開始執(zhí)行一段由HAL插入的代碼,判斷中斷源和中斷優(yōu)先級,然后再跳轉(zhuǎn)到用戶的中斷效勞子程序(ISR)異常處理過程和中斷效勞程序6.6 使用HAL開發(fā)應(yīng)用程序 nHAL與異常處理n當(dāng)異常發(fā)生后,處理器會依次完成以下工作:n把status存放器內(nèi)容復(fù)制到estatus存放器中,保存當(dāng)前處理器狀態(tài),如果是硬件中斷,estatus存放器中的EPIE位置1;n去除status存放器的U位為0,強制處理器進入超級用戶狀態(tài);n去除status存放器的PIE位為0,禁止所有的硬件中

21、斷;n把異常返回地址寫入ea存放器r29;n跳轉(zhuǎn)到異常處理地址。6.6 使用HAL開發(fā)應(yīng)用程序 nHAL與異常處理n為了方便創(chuàng)立和維護中斷效勞程序,HAL系統(tǒng)庫提供了中斷API函數(shù)如下所示:int alt_irq_register(alt_u32 id,void* context,void (*isr)(void*, alt_u32) /注冊中斷效勞程序int alt_irq_disable(alt_u32 id) /禁止單個中斷int alt_irq_enable(alt_u32 id) /使能單個中斷alt_irq_context alt_irq_disable_all(void) /禁止

22、所有中斷,并返回一個context 值void alt_irq_enable_all(alt_irq_context context) /使能所有中斷,以alt_irq_disable_all()返回值作為輸入?yún)?shù)alt_u32 alt_irq_interruptible(alt_u32 priority) /允許嵌套void alt_irq_non_interruptible (alt_u32 mask) /禁止嵌套int alt_irq_enabled (void) /檢測中斷的狀態(tài),如果有中斷使能返回非06.6 使用HAL開發(fā)應(yīng)用程序 n提高處理性能的措施n(1)從軟件上改善處理性能n把

23、無關(guān)緊要的以及影響中斷執(zhí)行性能的事情放在中斷效勞程序之外處理,盡量使中斷效勞程序精簡;n把傳送大量數(shù)據(jù)之類的事情交給DMA來完成;n如果使用DMA傳輸大量數(shù)據(jù),可以加大緩沖區(qū)以減少中斷次數(shù),從而提高中斷性能。nDMA傳輸大量數(shù)據(jù)應(yīng)用中,采用雙緩沖區(qū);n在允許的情況下,一直保持中斷使能。n使用快速的存儲空間來存儲關(guān)鍵代碼;n使用中斷嵌套n將應(yīng)用程序工程和系統(tǒng)庫工程都設(shè)置為高的編譯優(yōu)化等級。6.6 使用HAL開發(fā)應(yīng)用程序 n提高處理性能的措施(1)從硬件上改善處理性能1.添加或加大快速存儲器來存儲關(guān)鍵代碼或作為數(shù)據(jù)緩存。2.添加DMA控制器,這要與軟件改善中的第步同時執(zhí)行。3.使用性能更好的Nio

24、s II處理器,如Nios II/f。4.根據(jù)系統(tǒng)實際的中斷優(yōu)先級來合理分配SOPC Builder系統(tǒng)中的中斷號,注意IRQ0為最高優(yōu)先級。n6.1 Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)備驅(qū)動n6.9 MicroC/OS-IIn6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.7 設(shè)備驅(qū)動概述n設(shè)備存放器抽象驅(qū)動開發(fā)人員眼中的設(shè)備6.7 設(shè)備驅(qū)動概述n處理器外圍設(shè)備的

25、分類字符型設(shè)備:以字符為單位進行傳輸?shù)脑O(shè)備。比方字符終端、串口、鼠標(biāo)等等。塊設(shè)備:以數(shù)據(jù)塊為單位進行傳輸?shù)脑O(shè)備,比方CF卡。網(wǎng)絡(luò)設(shè)備:是支持網(wǎng)絡(luò)通信的設(shè)備。以包的形式傳送。6.7 設(shè)備驅(qū)動概述n標(biāo)準(zhǔn)I/O訪問方法n標(biāo)準(zhǔn)I/O訪問方法就是標(biāo)準(zhǔn)I/O設(shè)備訪問函數(shù)的集合。這些訪問函數(shù)就是我們所熟知的翻開(Open)、讀(Read)、寫(Write)等。標(biāo)準(zhǔn)I/O函數(shù)描 述open準(zhǔn)備使用一個I/O設(shè)備close釋放設(shè)備占用的資源read從一個I/O設(shè)備讀數(shù)據(jù)write向一個I/O設(shè)備寫數(shù)據(jù)lseek移動文件描述字的當(dāng)前位置fstat獲取一個打開的文件描述的文件信息ioctl設(shè)置I/O設(shè)備的操作參數(shù)表

26、6.3 標(biāo)準(zhǔn)I/O設(shè)備訪問函數(shù)6.7 設(shè)備驅(qū)動概述n標(biāo)準(zhǔn)I/O函數(shù)到具體驅(qū)動程序的映射標(biāo)準(zhǔn)I/O訪問函數(shù)映射6.7 設(shè)備驅(qū)動概述n標(biāo)準(zhǔn)I/O函數(shù)到具體驅(qū)動程序的映射Device_nameopenreadwritecloselseekfstatioctl“my”my_openmy_readmy_writemy_closemy_lseekmy_fstatmy_ioctl 驅(qū)動函數(shù)入口地址表6.4 驅(qū)動設(shè)備表6.7 設(shè)備驅(qū)動概述n標(biāo)準(zhǔn)I/O函數(shù)到具體驅(qū)動程序的映射程序清單6.2 驅(qū)動設(shè)備表項struct alt_dev_s alt_llist llist; /用以鏈接設(shè)備表項 const char*

27、 name; /設(shè)備名 int (*open)(alt_fd* fd, const char* name, int flags, int mode); int (*close)(alt_fd* fd); int (*read)(alt_fd* fd, char* ptr, int len); int (*write)(alt_fd* fd, const char* ptr, int len); int (*lseek)(alt_fd* fd, int ptr, int dir); int (*fstat)(alt_fd* fd, struct stat* buf); int (*ioctl)(

28、alt_fd* fd, int req, void* arg);6.7 設(shè)備驅(qū)動概述n驅(qū)動程序與設(shè)備交互的方法輪詢和中斷n輪詢方法:是指軟件周期性查詢硬件事件的發(fā)生。n其驅(qū)動程序設(shè)計起來比較簡單;缺點是,當(dāng)有多個設(shè)備需要輪詢時,由此帶來的輪詢開銷是比較大的,而實時性會降低。n中斷方式:是指外部事件發(fā)生后,打斷正在處理的事件,進而去檢查事件發(fā)生的原因,最后做出相應(yīng)的處理。n可以提高CPU的利用率并可以保證系統(tǒng)具有較高的實時性能。在實時系統(tǒng)以及有多個外設(shè)的系統(tǒng)中,通常采用中斷方式與外設(shè)進行交互。6.7 設(shè)備驅(qū)動概述n調(diào)用設(shè)備驅(qū)動的方式調(diào)用設(shè)備驅(qū)動通常有3種方式:1.應(yīng)用程序直接調(diào)用;2.應(yīng)用程序通

29、過操作系統(tǒng)調(diào)用;3.應(yīng)用程序通過操作系統(tǒng)的擴展。優(yōu)點:高效訪問設(shè)備;缺點:應(yīng)用程序與設(shè)備驅(qū)動直接關(guān)聯(lián),可移植性變差。優(yōu)點:高效訪問設(shè)備;缺點:應(yīng)用程序與設(shè)備驅(qū)動直接關(guān)聯(lián),可移植性變差。優(yōu)點:高效訪問設(shè)備;缺點:應(yīng)用程序與設(shè)備驅(qū)動直接關(guān)聯(lián),可移植性變差。n6.1 Nios II IDE簡介n6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項n6.3 調(diào)試/運行程序n6.4 下載程序到Flashn6.5 硬件抽象層(HAL)系統(tǒng)庫n6.6 使用HAL開發(fā)應(yīng)用程序 n6.7 設(shè)備驅(qū)動概述n6.8 開發(fā)HAL下的設(shè)備驅(qū)動n6.9 MicroC/OS-IIn6.10 Nios II C語言至硬件加速編譯器(C2H)簡

30、介第6章 目錄6.8 開發(fā)HAL下的設(shè)備驅(qū)動調(diào)驅(qū)動程序的開發(fā)步驟:創(chuàng)立一個設(shè)備頭文件,用于描述設(shè)備的存放器和其訪問方法;定義并實現(xiàn)設(shè)備驅(qū)動的功能;在main()中單獨測試設(shè)備驅(qū)動的功能;把設(shè)備驅(qū)動集成到HAL中。6.8 開發(fā)HAL下的設(shè)備驅(qū)動n創(chuàng)立一個描述設(shè)備存放器的頭文件n文件名遵循設(shè)備名的格式;n文件最后應(yīng)該放置在: componentsinc文件夾下;n以IORD_的形式定義出存放器的讀訪問方式;n以IOWR_的形式定義出存放器的寫訪問方式;n以_MSK的形式定義出存放器位的掩碼;n以_OFST的形式定義出存放器位的偏移位置。6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類設(shè)備創(chuàng)立驅(qū)動程序nHAL

31、支持以下幾種通用的設(shè)備模型:n字符型設(shè)備(Character-mode devices)n文件子系統(tǒng)(File subsytems)nDMA設(shè)備(DMA devices)n用作系統(tǒng)時鐘的定時器設(shè)備(Timer devices used as system clock)n用作時間標(biāo)記的定時器設(shè)備(Timer devices used as timestamp clock)nFlash設(shè)備(Flash memory devices)n以太網(wǎng)設(shè)備(Ethernet devices)n下面將表達各類設(shè)備驅(qū)動的實現(xiàn)方法及如何它們注冊register到HAL系統(tǒng)中去。6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類

32、設(shè)備創(chuàng)立驅(qū)動程序n字符型設(shè)備n 把字符型虛擬設(shè)備具體化n 實現(xiàn)設(shè)備的具體操作n 向HAL注冊字符設(shè)備6.8 開發(fā)HAL下的設(shè)備驅(qū)動 把字符型虛擬設(shè)備具體化程序清單6.3 字符型設(shè)備結(jié)構(gòu)體定義/* 文件中定義*/struct alt_dev_s alt_llist llist; /* for internal use */ const char* name; int (*open) (alt_fd* fd, const char* name, int flags, int mode); int (*close) (alt_fd* fd); int (*read) (alt_fd* fd, cha

33、r* ptr, int len); int (*write) (alt_fd* fd, const char* ptr, int len); int (*lseek) (alt_fd* fd, int ptr, int dir); int (*fstat) (alt_fd* fd, struct stat* buf); int (*ioctl) (alt_fd* fd, int req, void* arg);typedef struct alt_dev_s alt_dev; 這個結(jié)構(gòu)體表達的意思是,字符型設(shè)備有這樣的共性:它們都有一個以字符串形式表達的名字(name),都支持open、clo

34、se、read、write、lseek、fstat、ioctl操作中的一種或幾種。6.8 開發(fā)HAL下的設(shè)備驅(qū)動 把字符型虛擬設(shè)備具體化程序清單6.4 alt_fd類型定義typedef struct alt_fd_s alt_dev* dev; alt_u8* priv; int fd_flags; alt_fd;Dev:是指向設(shè)備類型結(jié)構(gòu)體的指針;Priv:供驅(qū)動程序內(nèi)部使用;Fd_flags:傳遞文件處理標(biāo)志。6.8 開發(fā)HAL下的設(shè)備驅(qū)動 把字符型虛擬設(shè)備具體化程序清單6.4 描述uART設(shè)備的結(jié)構(gòu)體typedef struct alt_dev dev; void* base; alt

35、_u32 ctrl; alt_u32 rx_start; volatile alt_u32 rx_end; volatile alt_u32 tx_start; alt_u32 tx_end; #ifdef ALTERA_AVALON_UART_USE_IOCTL struct termios termios; alt_u32 freq; #endif alt_u32 flags; ALT_FLAG_GRP(events) ALT_SEM(read_lock) ALT_SEM(write_lock) alt_u8 rx_bufALT_AVALON_UART_BUF_LEN; alt_u8 tx

36、_bufALT_AVALON_UART_BUF_LEN; alt_avalon_uart_dev;6.8 開發(fā)HAL下的設(shè)備驅(qū)動 把字符型虛擬設(shè)備具體化void func(alt_dev* dev) alt_avalon_uart_dev * uart_dev = (alt_avalon_uart_dev *) dev;6.8 開發(fā)HAL下的設(shè)備驅(qū)動 把字符型虛擬設(shè)備具體化上面定義出了UART設(shè)備的數(shù)據(jù)類型,但是內(nèi)存空間中還沒有真正描述UART設(shè)備的數(shù)據(jù)域,接下來把UART設(shè)備實例化。程序清單6.4 描述uART設(shè)備的結(jié)構(gòu)體見下頁6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.4 描述uART設(shè)備的

37、結(jié)構(gòu)體#define ALTERA_AVALON_UART_INSTANCE(name, dev) static alt_avalon_uart_dev dev = ALT_LLIST_ENTRY, name#_NAME, NULL, /* open */ NULL, /* close */ alt_avalon_uart_read, alt_avalon_uart_write, NULL, /* lseek */ NULL, /* fstat */ ALTERA_AVALON_UART_IOCTL, , (void*) name#_BASE, 0, 0, 0, 0, 0, ALTERA_AV

38、ALON_UART_TERMIOS(name#_STOP_BITS, (name#_PARITY = N), (name#_PARITY = O), name#_DATA_BITS, name#_USE_CTS_RTS, name#_BAUD) ALTERA_AVALON_UART_FREQ(name) (name#_FIXED_BAUD ? ALT_AVALON_UART_FB : 0) | (name#_USE_CTS_RTS ? ALT_AVALON_UART_FC : 0) 6.8 開發(fā)HAL下的設(shè)備驅(qū)動 實現(xiàn)設(shè)備的具體操作上一步中,已經(jīng)獲得了設(shè)備的屬性,也把訪問函數(shù)地址填入相應(yīng)的函數(shù)

39、指針,接下來的工作就是實現(xiàn)這些函數(shù)。實現(xiàn)這些函數(shù)例子見UART的實現(xiàn)文件6.8 開發(fā)HAL下的設(shè)備驅(qū)動 向HAL注冊(Register)字符設(shè)備方法:在設(shè)備的初始化函數(shù)中調(diào)用字符設(shè)備驅(qū)動注冊函數(shù):注冊函數(shù)返回負數(shù)表示注冊失敗,非負數(shù)(0和正數(shù))表示操作成功。所以,只須檢測返回值是否小于零,即可知道是否操作成功。例如:int alt_dev_reg(alt_dev* dev)#define ENODEV 50int func() err = -ENODEV; return err;6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類設(shè)備創(chuàng)立驅(qū)動程序n文件子系統(tǒng)nHAL已經(jīng)提供了一個文件系統(tǒng),當(dāng)把一個新的設(shè)備掛

40、載到HAL文件系統(tǒng)的某個點上時,可以用文件的方式來管理和操作它。n把文件子系統(tǒng)型虛擬設(shè)備具體化;n實現(xiàn)設(shè)備的具體操作;n向HAL注冊文件子系統(tǒng)。6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類設(shè)備創(chuàng)立驅(qū)動程序nFlash設(shè)備n 把Flash型虛擬設(shè)備具體化6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.7 Flash型虛擬設(shè)備結(jié)構(gòu)體定義struct alt_flash_dev alt_llist llist; const char* name; alt_flash_open open; alt_flash_close close; alt_flash_write write; alt_flash_read r

41、ead; alt_flash_get_flash_info get_info; alt_flash_erase_block erase_block; alt_flash_write_block write_block; void* base_addr; /flash的基地址 int length; /flash的容量大小,單位為字節(jié) int number_of_regions; /flash中可擦除區(qū)的數(shù)量 flash_region region_infoALT_MAX_NUMBER_OF_FLASH_REGIONS; ;6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.8 具體Flash設(shè)備的數(shù)據(jù)結(jié)

42、構(gòu)定義struct alt_flash_cfi_dev alt_flash_dev dev; int algorithm; int mode_width; int device_width; int write_timeout; int erase_timeout; int primary_address; /* Flash type specific functions to access the flash and perform various operations */ alt_write_command_fn write_command; alt_read_query_fn read

43、_query; alt_write_native_fn write_native;6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類設(shè)備創(chuàng)立驅(qū)動程序nFlash設(shè)備n 實現(xiàn)Flash設(shè)備的具體操作n現(xiàn)Flash設(shè)備的具體操作。從Flash型虛擬設(shè)備結(jié)構(gòu)體定義中,我們可以知道,對于Flash型設(shè)備需要實現(xiàn)7種訪問方法,它們是:1. alt_flash_open();2. alt_flash_close();3. alt_flash_write();4. alt_flash_read();5. alt_flash_get_flash_info();6. alt_flash_erase_block();7. a

44、lt_flash_write_block();6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類設(shè)備創(chuàng)立驅(qū)動程序nFlash設(shè)備n 向HAL注冊Flash設(shè)備n注冊方法同字符設(shè)備,唯一不同是需要調(diào)用Flash設(shè)備注冊函數(shù):n注冊函數(shù)返回0表示注冊成功,返回一個負數(shù)表示注冊失敗。int alt_flash_device_register(alt_flash_fd* dev)6.8 開發(fā)HAL下的設(shè)備驅(qū)動n為各類設(shè)備創(chuàng)立驅(qū)動程序n以太網(wǎng)設(shè)備nAltera提供了SMSC lan91c111器件的驅(qū)動,因此用戶如果想使用不同廠家的以太網(wǎng)芯片,編寫驅(qū)動的一種簡便的方法就是在lan91c111驅(qū)動的根底上進行修改。l

45、an91c111的驅(qū)動位于alterakitsnios2componentsaltera_avalon_lan91c111文件夾中。n剩下的三種設(shè)備:DMA設(shè)備、用作系統(tǒng)時鐘的定時器設(shè)備、用作時間標(biāo)記的定時器設(shè)備Altera已經(jīng)為用戶實現(xiàn)了,所以這里就不再鏊述了。6.8 開發(fā)HAL下的設(shè)備驅(qū)動n把設(shè)備驅(qū)動集成到HAL中1. 放置驅(qū)動程序驅(qū)動程序開發(fā)完畢后,還需要把源程序文件放到約定的SRC文件夾下,并在此文件夾下為它編寫一個簡單的Makefile文件,以便于工程的管理和編譯。所有驅(qū)動都 應(yīng)該放置在components目錄下集成到HAL系統(tǒng)庫中的設(shè)備驅(qū)動文件放在HAL目錄放 置 設(shè) 備 存 放

46、器 描 述 文 件6.8 開發(fā)HAL下的設(shè)備驅(qū)動n把設(shè)備驅(qū)動集成到HAL中2. 編寫Makefile文件程序清單6.10 Makefile的根本格式# List all source files supplied by this component.ASM_LIB_SRCS +=INCLUDE_PATH += 欲編譯的C文件放置在C_LIB_SRCS一行; 欲編譯的匯編文件放置在ASM_LIB_SRCS一行; 欲增加包含文件的路徑,把路徑加在INCLUDE_PATH一行; 多個文件之間和多個路徑之間用空格分開。6.8 開發(fā)HAL下的設(shè)備驅(qū)動n把設(shè)備驅(qū)動集成到HAL中3. 設(shè)備頭文件編寫找到設(shè)備

47、頭文件后,編譯器會在文件中插入下面一些代碼:包含該設(shè)備的頭文件;插入為該設(shè)備分配存儲空間的宏定義:_INSTANCE;在初始化函數(shù)alt_sys_init()中插入初始化設(shè)備的宏定義:_INIT。6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單的片段#include system.h#include sys/alt_sys_init.h“/* device headers*/#include altera_avalon_timer.h#include altera_avalon_uart.h“/* Allocate the device storage*/ALTERA_AVALON_UART_INSTA

48、NCE( UART1, uart1 );ALTERA_AVALON_TIMER_INSTANCE( SYSCLK, sysclk );/* Initialise the devices*/void alt_sys_init( void )ALTERA_AVALON_UART_INIT( UART1, uart1 );ALTERA_AVALON_TIMER_INIT( SYSCLK, sysclk );6.8 開發(fā)HAL下的設(shè)備驅(qū)動n把設(shè)備驅(qū)動集成到HAL中3. 設(shè)備頭文件編寫設(shè)備頭文件的格式:設(shè)備頭文件名要與SOPC Builder中對應(yīng)的組件名一致。在設(shè)備頭文件中以_INSTANCE的形式定義一個設(shè)備實例化的宏。在設(shè)備頭文件中以_INIT的形式定義一個設(shè)備初始化的宏。6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.12 alter_avalon_uart設(shè)備的實例化宏Nios II kit安裝路徑文件中定義#define ALTERA_AVALON_UART_INSTANCE(name, device) static alt_avalon_uart_dev device = ALT_LLIST_ENTRY, name#_NAME, NULL, /* open */

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論