![SOPC嵌入式系統(tǒng)基礎(chǔ)教程:第6章 Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)_第1頁](http://file4.renrendoc.com/view/09b5c840c8ca07b1e65ecd23ff53f07d/09b5c840c8ca07b1e65ecd23ff53f07d1.gif)
![SOPC嵌入式系統(tǒng)基礎(chǔ)教程:第6章 Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)_第2頁](http://file4.renrendoc.com/view/09b5c840c8ca07b1e65ecd23ff53f07d/09b5c840c8ca07b1e65ecd23ff53f07d2.gif)
![SOPC嵌入式系統(tǒng)基礎(chǔ)教程:第6章 Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)_第3頁](http://file4.renrendoc.com/view/09b5c840c8ca07b1e65ecd23ff53f07d/09b5c840c8ca07b1e65ecd23ff53f07d3.gif)
![SOPC嵌入式系統(tǒng)基礎(chǔ)教程:第6章 Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)_第4頁](http://file4.renrendoc.com/view/09b5c840c8ca07b1e65ecd23ff53f07d/09b5c840c8ca07b1e65ecd23ff53f07d4.gif)
![SOPC嵌入式系統(tǒng)基礎(chǔ)教程:第6章 Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)_第5頁](http://file4.renrendoc.com/view/09b5c840c8ca07b1e65ecd23ff53f07d/09b5c840c8ca07b1e65ecd23ff53f07d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第6章 Nios II應(yīng)用程序及其外設(shè)HAL驅(qū)動開發(fā)-SOPC嵌入式系統(tǒng)基礎(chǔ)教程北京航空航天大學(xué)出版社出版周立功 等編著本章首先簡單介紹Nios II IDE開發(fā)環(huán)境的使用;然后重點介紹了硬件抽象層(HAL)系統(tǒng)庫,包括HAL下的應(yīng)用程序開發(fā)以及開發(fā)HAL下的設(shè)備驅(qū)動兩部分內(nèi)容;最后講述了MicroC/OS-II實時操作系統(tǒng)及其應(yīng)用程序開發(fā)實例。本章還簡單介紹了最新的Nios II C語言至硬件加速編譯器。主要內(nèi)容第6章 目錄6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HA
2、L開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.1 Nios II IDE簡介Nios II IDE為軟件開發(fā)提供4個主要功能:一、工程管理二
3、、編輯器和編譯器三、調(diào)試器四、閃存編程器統(tǒng)一開發(fā)平臺,用于所有Nios II處理器系統(tǒng)。硬件抽象層系統(tǒng)庫(HAL)輕量級IP TCP/IP庫uC/OS-II實時操作系統(tǒng)(RTOS)Altera壓縮文件系統(tǒng)工程管理器新工程向?qū)к浖こ棠0遘浖M件6.1 Nios II IDE簡介PIO內(nèi)核結(jié)構(gòu)框圖(對話框位置:FileNewC/C+ Application )工程模板工程命名指定硬件系統(tǒng)模板功能介紹編輯器和編譯器文本編輯器成熟的全功能源文件編輯器,包括:語法高亮顯示C/C+程序代碼、全面的搜索工具、文件管理、在線幫助和教程、快速定位及自動糾錯、內(nèi)置調(diào)試等功能。C/C+編譯器Nios II IDE
4、使用GCC編譯器,并為其提供了一個圖形化用戶界面。圖形化用戶界面為GCC編譯器提供了一個易用的按鈕式流程,同時允許開發(fā)人員手工設(shè)置高級編譯選項,使得操作更簡單方便。6.1 Nios II IDE簡介調(diào)試器軟件調(diào)試器(GDB):是強(qiáng)大的、在GNU調(diào)試器基礎(chǔ)之上的軟件調(diào)試器。該調(diào)試器提供許多基本調(diào)試功能以及一些在低成本處理器開發(fā)套件中不會經(jīng)常用到的高級調(diào)試功能?;菊{(diào)試功能包括:運(yùn)行控制、調(diào)用堆棧查看、軟件斷點、反匯編代碼查看、調(diào)試信息查看、指令集仿真器。高級調(diào)試功能包括:硬件斷點調(diào)試ROM或閃存中的代碼、數(shù)據(jù)觸發(fā)、指令跟蹤。6.1 Nios II IDE簡介閃存編程器多數(shù)使用Nios II處理器
5、的設(shè)計都需要采用閃存(Flash)來存儲FPGA配置數(shù)據(jù)和/或應(yīng)用程序。Nios II IDE提供了一個方便的閃存編程方法。任何連接到FPGA的兼容通用閃存接口(CFI)的閃存器件以及主動串行配置器件EPCS都可以通過Nios II IDE閃存編程器來燒寫。6.1 Nios II IDE簡介6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加
6、速編譯器(C2H)簡介第6章 目錄6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項(對話框位置:右擊C/C+工程文件夾System Library Properties )Debug:調(diào)試模式Release:發(fā)布模式C/C+ Build 設(shè)置6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項(對話框位置:右擊C/C+工程文件夾System Library Properties )C/C+ Indexer 編制程序文件索引:幫助用戶方便地找到程序文件中的相關(guān)信息。問題報告的類型:幫助用戶方便地定位錯誤。C/C+ Indexer設(shè)置6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項( 對話框位置:右擊C/C+工程文件夾System Li
7、brary Properties )System Library 設(shè)置6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項( 對話框位置:右擊C/C+工程文件夾System Library Properties )System Library 設(shè)置RTOS:指定操作系統(tǒng)。RTOS Options:對RTOS進(jìn)行設(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ū)動所用的定時
8、器。6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項( 對話框位置:右擊C/C+工程文件夾System Library Properties )System Library 設(shè)置用戶自己創(chuàng)建和管理連接,建議采用自動連接。Nios II IDE自動創(chuàng)建和管理連接,使用前必須指定下面選項??蓤?zhí)行代碼駐留的物理存儲器。只讀數(shù)據(jù)駐留的物理存儲器??勺x/寫數(shù)據(jù)駐留的物理存儲器。Heap(堆)駐留的物理存儲器。Stack(棧)駐留的物理存儲器。選擇后,異常堆棧將駐留在單獨的物理存儲器中。指定異常堆棧駐留的物理存儲器。指定異常堆棧的最大空間。6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3
9、調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.3 調(diào)試/運(yùn)行程序(對話框位置:RUNDebug /Debug As)選擇Debug的目標(biāo)器件:Nios II硬件Nios II指令仿真器Nios II多處理器集調(diào)試器目標(biāo)連接設(shè)置-(Target Connection)6.3 調(diào)試/運(yùn)行程序(對話框位置:RUNDebug Nios II Hardware Target Conne
10、ction)進(jìn)行JTAG下載電纜的選擇。進(jìn)行連接在JTAG下載電纜上帶JTAG接口器件的選擇。進(jìn)行Nios II系統(tǒng)中斷通信工具選擇。調(diào)試器設(shè)置-(Debugger)6.3 調(diào)試/運(yùn)行程序(對話框位置:RUNDebug Nios II Hardware Debugger)調(diào)試器設(shè)置-(Debugger 視窗模式)6.3 調(diào)試/運(yùn)行程序(Nios II IDE 切換到Debug視窗模式)運(yùn)行程序-(Debugger 視窗模式)6.3 調(diào)試/運(yùn)行程序(對話框位置:RUNRUN /RUN As)6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程
11、序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.4 下載程序到Flash當(dāng)調(diào)試工作完成并確保程序無錯后,就可以把程序下載到Flash中了。6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6
12、.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)庫HAL的構(gòu)成HAL系統(tǒng)庫為用戶提供下列支持:集成了ANSI C標(biāo)準(zhǔn)函數(shù)庫,允許調(diào)用類似C標(biāo)準(zhǔn)庫函數(shù);提供訪問NiosII系統(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ù),在m
13、ain()函數(shù)前,分配設(shè)備空間并初始化所有的外圍設(shè)備。Nios II HAL 的結(jié)構(gòu)6.5 硬件抽象層(HAL)系統(tǒng)庫HAL的構(gòu)成Nios II HAL 的結(jié)構(gòu)6.5 硬件抽象層(HAL)系統(tǒng)庫HAL的構(gòu)成HAL支持以下幾種通用的設(shè)備模型:字符型設(shè)備;文件子系統(tǒng);DMA設(shè)備定時器設(shè)備Flash設(shè)備;以太網(wǎng)設(shè)備。6.5 硬件抽象層(HAL)系統(tǒng)庫HAL的通用設(shè)備模型Altera提供的完整HAL支持的外圍設(shè)備:字符型設(shè)備包括UART核、JTAG核以及LCD16207顯示控制器;文件子系統(tǒng)包括只讀文檔系統(tǒng);DMA設(shè)備包括DMA控制器核;定時器設(shè)備包括定時器核;Flash存儲器設(shè)備包括通用Flash接
14、口芯片和主動串行配置器件EPCS控制器。以太網(wǎng)設(shè)備包括LAN9111以太網(wǎng)MAC/PHY控制器并且需要uC/OS-II支持。還有一些第三方提供的外圍設(shè)備,用戶也可以定制字節(jié)的外圍設(shè)備。6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.6 使用HAL開發(fā)應(yīng)用程序 Nios II IDE 工程結(jié)構(gòu)Nios
15、II IDE工程結(jié)構(gòu)6.6 使用HAL開發(fā)應(yīng)用程序 Nios II IDE 工程結(jié)構(gòu)一個Nios II IDE工程用戶工程文件夾HAL系統(tǒng)庫文件夾Nios II設(shè)備驅(qū)動6.6 使用HAL開發(fā)應(yīng)用程序 與目標(biāo)系統(tǒng)相關(guān)的system.h系統(tǒng)描述文件System.h文件構(gòu)成過程一部分描述系統(tǒng)庫的設(shè)置信息;另一部分給出了每個外圍設(shè)備的相信信息;6.6 使用HAL開發(fā)應(yīng)用程序 與目標(biāo)系統(tǒng)相關(guān)的system.h系統(tǒng)描述文件程序清單6.1 system.h描述的UART設(shè)備#define UART_NAME /dev/uart /UART的設(shè)備名稱及所在路徑,open()等文件操作函數(shù)可以通/過UART_N
16、AME開打一個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寄存器進(jìn)行訪問#define UART_IRQ 1 / UART設(shè)備的中斷號,系統(tǒng)據(jù)此判別中斷來自UART設(shè)備#define UART_BAUD 115200 / 在系統(tǒng)生成過程中預(yù)設(shè)的串口波特率#define UART_DATA_BITS 8 / 描述UART數(shù)據(jù)幀長度#define UART_FIXED_BAUD 0 /波特
17、率是否軟件可變的標(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 UART_FREQ 48000000 / Avalon總線的頻率,48M
18、Hz6.6 使用HAL開發(fā)應(yīng)用程序 數(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)用程序 HAL對系統(tǒng)啟動的支持啟動代碼用于系統(tǒng)上電復(fù)位后到運(yùn)行main()函數(shù)前,初始化硬件,構(gòu)建應(yīng)用程序運(yùn)行時環(huán)境的過程。下面簡單地敘述一下這段代碼的完成的功
19、能:上電或復(fù)位后的程序入口標(biāo)號是“_reset”,程序先對CPU進(jìn)行初始化:初始化指令Cache,然后調(diào)用_start;初始化數(shù)據(jù)Cache,把異常向量表裝入指令Cache;設(shè)置堆棧指針(Stack Pointer)和全局指針(Global Pointer)寄存器;把全局變量和靜態(tài)變量區(qū)(_bss_start _bss_end)清零;如果沒有bootloader,則把可讀寫數(shù)據(jù)(.rwdata),只讀數(shù)據(jù)(.rodata)和異常向量表裝入RAM中;調(diào)用alt_main()。6.6 使用HAL開發(fā)應(yīng)用程序 HAL對系統(tǒng)啟動的支持HAL提供默認(rèn)執(zhí)行的alt_main()對CPU及外設(shè)進(jìn)行初始化:調(diào)
20、用ALT_OS_INIT()初始化OS:默認(rèn)情況下完成對uC/OS-II的初始化,如果系統(tǒng)不使用操作系統(tǒng),則這步不執(zhí)行。如果使用操作系統(tǒng),則初始化訪問HAL提供的文件系統(tǒng)的信號量(alt_fd_list_lock)。初始化中斷控制器,開中斷。調(diào)用alt_sys_init()初始化系統(tǒng)設(shè)備及軟件模塊,NiosII IDE自動創(chuàng)建管理alt_sys_init.c。把標(biāo)準(zhǔn)輸入輸出設(shè)備(stdin, stdout, stderr)映射到輸入輸出通道(I/O channel)上去;調(diào)用C+的構(gòu)造器,使用the _do_ctors()函數(shù)。登記C+的解構(gòu)器;調(diào)用main()函數(shù)。6.6 使用HAL開發(fā)應(yīng)用
21、程序 HAL與異常處理當(dāng)跳轉(zhuǎn)到異常處理地址后,處理器開始執(zhí)行一段由HAL插入的代碼,判斷中斷源和中斷優(yōu)先級,然后再跳轉(zhuǎn)到用戶的中斷服務(wù)子程序(ISR)異常處理過程和中斷服務(wù)程序6.6 使用HAL開發(fā)應(yīng)用程序 HAL與異常處理當(dāng)異常發(fā)生后,處理器會依次完成以下工作:把status寄存器內(nèi)容復(fù)制到estatus寄存器中,保存當(dāng)前處理器狀態(tài),如果是硬件中斷,estatus寄存器中的EPIE位置1;清除status寄存器的U位為0,強(qiáng)制處理器進(jìn)入超級用戶狀態(tài);清除status寄存器的PIE位為0,禁止所有的硬件中斷;把異常返回地址寫入ea寄存器(r29);跳轉(zhuǎn)到異常處理地址。6.6 使用HAL開發(fā)應(yīng)用
22、程序 HAL與異常處理為了方便創(chuàng)建和維護(hù)中斷服務(wù)程序,HAL系統(tǒng)庫提供了中斷API函數(shù)如下所示:int alt_irq_register(alt_u32 id,void* context,void (*isr)(void*, alt_u32) /注冊中斷服務(wù)程序int alt_irq_disable(alt_u32 id) /禁止單個中斷int alt_irq_enable(alt_u32 id) /使能單個中斷alt_irq_context alt_irq_disable_all(void) /禁止所有中斷,并返回一個context 值void alt_irq_enable_all(alt_
23、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)用程序 提高處理性能的措施(1)從軟件上改善處理性能把無關(guān)緊要的以及影響中斷執(zhí)行性能的事情放在中斷服務(wù)程序之外處理,盡量使中斷服務(wù)程序精簡;把傳送大量數(shù)據(jù)
24、之類的事情交給DMA來完成;如果使用DMA傳輸大量數(shù)據(jù),可以加大緩沖區(qū)以減少中斷次數(shù),從而提高中斷性能。DMA傳輸大量數(shù)據(jù)應(yīng)用中,采用雙緩沖區(qū);在允許的情況下,一直保持中斷使能。使用快速的存儲空間來存儲關(guān)鍵代碼;使用中斷嵌套將應(yīng)用程序工程和系統(tǒng)庫工程都設(shè)置為高的編譯優(yōu)化等級。6.6 使用HAL開發(fā)應(yīng)用程序 提高處理性能的措施(1)從硬件上改善處理性能添加或加大快速存儲器來存儲關(guān)鍵代碼或作為數(shù)據(jù)緩存。添加DMA控制器,這要與軟件改善中的第3.4步同時執(zhí)行。使用性能更好的Nios II處理器,如Nios II/f。根據(jù)系統(tǒng)實際的中斷優(yōu)先級來合理分配SOPC Builder系統(tǒng)中的中斷號,注意IRQ
25、0為最高優(yōu)先級。6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.7 設(shè)備驅(qū)動概述設(shè)備寄存器抽象驅(qū)動開發(fā)人員眼中的設(shè)備6.7 設(shè)備驅(qū)動概述處理器外圍設(shè)備的分類字符型設(shè)備:以字符為單位進(jìn)行傳輸?shù)脑O(shè)備。比如字符終端、串口、鼠標(biāo)等等。塊設(shè)備:以數(shù)據(jù)塊為單位進(jìn)行傳輸?shù)脑O(shè)備,比如CF卡。網(wǎng)絡(luò)設(shè)備:是支持網(wǎng)絡(luò)通信的
26、設(shè)備。以包的形式傳送。6.7 設(shè)備驅(qū)動概述標(biāo)準(zhǔn)I/O訪問方法標(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ù)表6.3 標(biāo)準(zhǔn)I/O設(shè)備訪問函數(shù)6.7 設(shè)備驅(qū)動概述標(biāo)準(zhǔn)I/O函數(shù)到具體驅(qū)動程序的映射標(biāo)準(zhǔn)I/O訪問函數(shù)映射6.7 設(shè)備驅(qū)動概述標(biāo)準(zhǔn)I/O函數(shù)到具體驅(qū)動程序
27、的映射Device_nameopenreadwritecloselseekfstatioctl“my”my_openmy_readmy_writemy_closemy_lseekmy_fstatmy_ioctl 驅(qū)動函數(shù)入口地址表6.4 驅(qū)動設(shè)備表6.7 設(shè)備驅(qū)動概述標(biāo)準(zhǔn)I/O函數(shù)到具體驅(qū)動程序的映射程序清單6.2 驅(qū)動設(shè)備表項struct alt_dev_s alt_llist llist; /用以鏈接設(shè)備表項 const char* name; /設(shè)備名 int (*open)(alt_fd* fd, const char* name, int flags, int mode); int
28、(*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)(alt_fd* fd, int req, void* arg);6.7 設(shè)備驅(qū)動概述驅(qū)動程序與設(shè)備交互的方法輪詢和中斷輪詢方法:是指軟件周期性查詢硬件事件的發(fā)生
29、。其驅(qū)動程序設(shè)計起來比較簡單;缺點是,當(dāng)有多個設(shè)備需要輪詢時,由此帶來的輪詢開銷是比較大的,而實時性會降低。中斷方式:是指外部事件發(fā)生后,打斷正在處理的事件,進(jìn)而去檢查事件發(fā)生的原因,最后做出相應(yīng)的處理??梢蕴岣逤PU的利用率并可以保證系統(tǒng)具有較高的實時性能。在實時系統(tǒng)以及有多個外設(shè)的系統(tǒng)中,通常采用中斷方式與外設(shè)進(jìn)行交互。6.7 設(shè)備驅(qū)動概述調(diào)用設(shè)備驅(qū)動的方式調(diào)用設(shè)備驅(qū)動通常有3種方式:應(yīng)用程序直接調(diào)用;應(yīng)用程序通過操作系統(tǒng)調(diào)用;應(yīng)用程序通過操作系統(tǒng)的擴(kuò)展。優(yōu)點:高效訪問設(shè)備;缺點:應(yīng)用程序與設(shè)備驅(qū)動直接關(guān)聯(lián),可移植性變差。優(yōu)點:高效訪問設(shè)備;缺點:應(yīng)用程序與設(shè)備驅(qū)動直接關(guān)聯(lián),可移植性變差。
30、優(yōu)點:高效訪問設(shè)備;缺點:應(yīng)用程序與設(shè)備驅(qū)動直接關(guān)聯(lián),可移植性變差。6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.8 開發(fā)HAL下的設(shè)備驅(qū)動調(diào)驅(qū)動程序的開發(fā)步驟:創(chuàng)建一個設(shè)備頭文件,用于描述設(shè)備的寄存器和其訪問方法;定義并實現(xiàn)設(shè)備驅(qū)動的功能;在main()中單獨測試設(shè)備驅(qū)動的功能;把設(shè)備驅(qū)動集成到H
31、AL中。6.8 開發(fā)HAL下的設(shè)備驅(qū)動創(chuàng)建一個描述設(shè)備寄存器的頭文件文件名遵循_regs.h的格式;文件最后應(yīng)該放置在: componentsinc文件夾下;以IORD_的形式定義出寄存器的讀訪問方式;以IOWR_的形式定義出寄存器的寫訪問方式;以_MSK的形式定義出寄存器位的掩碼;以_OFST的形式定義出寄存器位的偏移位置。6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序HAL支持以下幾種通用的設(shè)備模型:字符型設(shè)備(Character-mode devices)文件子系統(tǒng)(File subsytems)DMA設(shè)備(DMA devices)用作系統(tǒng)時鐘的定時器設(shè)備(Timer device
32、s used as system clock)用作時間標(biāo)記的定時器設(shè)備(Timer devices used as timestamp clock)Flash設(shè)備(Flash memory devices)以太網(wǎng)設(shè)備(Ethernet devices)下面將敘述各類設(shè)備驅(qū)動的實現(xiàn)方法及如何它們注冊(register)到HAL系統(tǒng)中去。6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序字符型設(shè)備 把字符型虛擬設(shè)備具體化 實現(xiàn)設(shè)備的具體操作 向HAL注冊字符設(shè)備6.8 開發(fā)HAL下的設(shè)備驅(qū)動把字符型虛擬設(shè)備具體化程序清單6.3 字符型設(shè)備結(jié)構(gòu)體定義/* componentsaltera_halH
33、ALincsysalt_dev.h文件中定義*/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, char* ptr, int len); int (*write) (alt_fd* fd, const char* ptr, int len); int (*lsee
34、k) (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)體表達(dá)的意思是,字符型設(shè)備有這樣的共性:它們都有一個以字符串形式表達(dá)的名字(name),都支持open、close、read、write、lseek、fstat、ioctl操作中的一種或幾種。6.8 開發(fā)HAL下的設(shè)備驅(qū)動把字符型虛擬設(shè)備具體化程序清單6.4 alt_fd
35、類型定義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_u32 ctrl; alt_u32 rx_start; volatile alt_u32 rx_end; volatile alt_u32 tx_start; al
36、t_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_bufALT_AVALON_UART_BUF_LEN; alt_avalon_uart_dev;6.8 開發(fā)HAL下的設(shè)備驅(qū)動把字符型虛擬設(shè)備具體化void fun
37、c(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è)備的結(jié)構(gòu)體#define ALTERA_AVALON_UART_INSTANCE(name, dev) static alt_avalon_uart_dev dev = AL
38、T_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_AVALON_UART_TERMIOS(name#_STOP_BITS, (name#_PARITY = N), (name#_PARITY = O), name#_DATA
39、_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ù)指針,接下來的工作就是實現(xiàn)這些函數(shù)。實現(xiàn)這些函數(shù)例子見UART的實現(xiàn)文件 componentsaltera_avalon_uartHALsrcaltera_avalon_u
40、art.c6.8 開發(fā)HAL下的設(shè)備驅(qū)動向HAL注冊(Register)字符設(shè)備方法:在設(shè)備的初始化函數(shù)中調(diào)用字符設(shè)備驅(qū)動注冊函數(shù):注冊函數(shù)返回負(fù)數(shù)表示注冊失敗,非負(fù)數(shù)(0和正數(shù))表示操作成功。所以,只須檢測返回值是否小于零,即可知道是否操作成功。例如:int alt_dev_reg(alt_dev* dev)#define ENODEV 50int func() err = -ENODEV; return err;6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序文件子系統(tǒng)HAL已經(jīng)提供了一個文件系統(tǒng),當(dāng)把一個新的設(shè)備掛載到HAL文件系統(tǒng)的某個點上時,可以用文件的方式來管理和操作它。把文件
41、子系統(tǒng)型虛擬設(shè)備具體化;實現(xiàn)設(shè)備的具體操作;向HAL注冊文件子系統(tǒng)。6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序Flash設(shè)備 把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 read; alt_flash_get_flash_info get_info; a
42、lt_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é)構(gòu)定義struct alt_flash_cfi_dev alt_flash_dev
43、 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_query; alt_write_native_fn write_native;
44、6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序Flash設(shè)備 實現(xiàn)Flash設(shè)備的具體操作現(xiàn)Flash設(shè)備的具體操作。從Flash型虛擬設(shè)備結(jié)構(gòu)體定義中,我們可以知道,對于Flash型設(shè)備需要實現(xiàn)7種訪問方法,它們是:alt_flash_open();alt_flash_close();alt_flash_write();alt_flash_read();alt_flash_get_flash_info();alt_flash_erase_block();alt_flash_write_block();6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序Flash設(shè)備 向HAL注冊Fla
45、sh設(shè)備注冊方法同字符設(shè)備,唯一不同是需要調(diào)用Flash設(shè)備注冊函數(shù):注冊函數(shù)返回0表示注冊成功,返回一個負(fù)數(shù)表示注冊失敗。int alt_flash_device_register(alt_flash_fd* dev)6.8 開發(fā)HAL下的設(shè)備驅(qū)動為各類設(shè)備創(chuàng)建驅(qū)動程序以太網(wǎng)設(shè)備Altera提供了SMSC lan91c111器件的驅(qū)動,因此用戶如果想使用不同廠家的以太網(wǎng)芯片,編寫驅(qū)動的一種簡便的方法就是在lan91c111驅(qū)動的基礎(chǔ)上進(jìn)行修改。lan91c111的驅(qū)動位于alterakitsnios2componentsaltera_avalon_lan91c111文件夾中。剩下的三種設(shè)備:
46、DMA設(shè)備、用作系統(tǒng)時鐘的定時器設(shè)備、用作時間標(biāo)記的定時器設(shè)備Altera已經(jīng)為用戶實現(xiàn)了,所以這里就不再鏊述了。6.8 開發(fā)HAL下的設(shè)備驅(qū)動把設(shè)備驅(qū)動集成到HAL中放置驅(qū)動程序驅(qū)動程序開發(fā)完畢后,還需要把源程序文件放到約定的SRC文件夾下,并在此文件夾下為它編寫一個簡單的Makefile文件,以便于工程的管理和編譯。所有驅(qū)動都 應(yīng)該放置在components目錄下集成到HAL系統(tǒng)庫中的設(shè)備驅(qū)動文件放在HAL目錄放置設(shè)備 寄存器描 述 文 件6.8 開發(fā)HAL下的設(shè)備驅(qū)動把設(shè)備驅(qū)動集成到HAL中編寫Makefile文件程序清單6.10 Makefile的基本格式# List all sour
47、ce files supplied by this component.C_LIB_SRCS += altera_avalon_uart.cASM_LIB_SRCS +=INCLUDE_PATH +=欲編譯的C文件放置在C_LIB_SRCS一行;欲編譯的匯編文件放置在ASM_LIB_SRCS一行;欲增加包含文件的路徑,把路徑加在INCLUDE_PATH一行;多個文件之間和多個路徑之間用空格分開。6.8 開發(fā)HAL下的設(shè)備驅(qū)動把設(shè)備驅(qū)動集成到HAL中設(shè)備頭文件編寫找到設(shè)備頭文件后,編譯器會在alt_sys_init.c文件中插入下面一些代碼:包含該設(shè)備的頭文件;插入為該設(shè)備分配存儲空間的宏定義:
48、_INSTANCE;在初始化函數(shù)alt_sys_init()中插入初始化設(shè)備的宏定義:_INIT。6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.11 alt_sys_init.c的片段#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_INSTANCE( UART1, uart1 );ALTERA_AVA
49、LON_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ū)動把設(shè)備驅(qū)動集成到HAL中設(shè)備頭文件編寫設(shè)備頭文件的格式:設(shè)備頭文件名要與SOPC Builder中對應(yīng)的組件名一致。在設(shè)備頭文件中以_INSTANCE的形式定義一個設(shè)備實例化的宏。在設(shè)備頭文件中以_INIT的形式定義一個設(shè)備初
50、始化的宏。6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.12 alter_avalon_uart設(shè)備的實例化宏componentsaltera_avalon_uartHALinc altera_avalon_uart.h文件中定義#define ALTERA_AVALON_UART_INSTANCE(name, device) static alt_avalon_uart_dev device = ALT_LLIST_ENTRY, name#_NAME, NULL, /* open */ NULL, /* close */ alt_avalon_uart_read, alt_avalon_uart
51、_write, NULL, /* lseek */ NULL, /* fstat */ NULL, /* ioctl */ , name#_BASE 6.8 開發(fā)HAL下的設(shè)備驅(qū)動程序清單6.13 alter_avalon_uart設(shè)備的初始化宏componentsaltera_avalon_uartHALinc altera_avalon_uart.h文件中定義#define ALTERA_AVALON_UART_INIT(name, device) alt_dev_reg (&device.dev)滿足了以上三條“苛刻”要求,NiosII IDE的gtf-generate工具就會在自動生成
52、的系統(tǒng)初始化文件alt_sys_init.c文件中插入設(shè)備實例化和初始化宏,并在main函數(shù)調(diào)用前完成設(shè)備的實例化和初始化工作。6.1 Nios II IDE簡介6.2 設(shè)置工程系統(tǒng)庫屬性和編譯選項6.3 調(diào)試/運(yùn)行程序6.4 下載程序到Flash6.5 硬件抽象層(HAL)系統(tǒng)庫6.6 使用HAL開發(fā)應(yīng)用程序 6.7 設(shè)備驅(qū)動概述6.8 開發(fā)HAL下的設(shè)備驅(qū)動6.9 MicroC/OS-II6.10 Nios II C語言至硬件加速編譯器(C2H)簡介第6章 目錄6.9 MicroC/OS-IIuC/OS-II簡介MicroC/OS-II提供以下系統(tǒng)服務(wù):任務(wù)管理(Task manageme
53、nt)事件標(biāo)志(Event flag)消息傳遞(Message passing)內(nèi)存管理(Memory management)信號量(Semaphores)時間管理(Time management)6.9 MicroC/OS-IIuC/OS-II簡介系統(tǒng)庫各模塊關(guān)系6.9 MicroC/OS-II設(shè)備驅(qū)動的線程安全例如,宏ALT_STATIC_SEM(sem),在有MicroC/OS-II運(yùn)行的條件下其功能為創(chuàng)建一個名為sem的指向OS_EVENT數(shù)據(jù)類型的指針(實現(xiàn)代碼如下);而在沒有MicroC/OS-II運(yùn)行的條件下會被預(yù)處理為一條空語句。Altera提供的設(shè)備驅(qū)動是線程安全的,如果用戶要自行添加設(shè)備驅(qū)動,最好參考Altera提供的設(shè)備驅(qū)動來編寫。#define ALT_STATIC_SEM(sem) static OS_EVENT* sem;#define ALT_STATIC_SEM(sem);6.9 MicroC/OS-IINewlib C標(biāo)準(zhǔn)庫的線程安全在多線程的情況下,全局結(jié)構(gòu)體(struct_reent)可能被多個任務(wù)同時訪問,解決辦法有2種:在每個進(jìn)程的任務(wù)棧中,都放入一個struct_reent結(jié)構(gòu)體的備份,這樣每個進(jìn)程可以獨享這個結(jié)構(gòu)體資源,便不會導(dǎo)致線程不
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源儲能項目落戶保障合同
- 廚具設(shè)備購銷合同(31篇)
- 教學(xué)工作總結(jié)英語2024(32篇)
- 2023-2024學(xué)年浙江省寧波市鎮(zhèn)海中學(xué)高三下學(xué)期期中考試歷史試卷
- 2025年業(yè)務(wù)提升合作諒解協(xié)議
- 2025年供應(yīng)鏈管理公司合作項目協(xié)議書
- 2025年產(chǎn)品創(chuàng)新與生產(chǎn)協(xié)作協(xié)議
- 2025年農(nóng)村醫(yī)療人員定向就業(yè)協(xié)議
- 2025年大數(shù)據(jù)項目規(guī)劃申請報告模板
- 2025年遠(yuǎn)程醫(yī)療項目立項申請報告模板
- 吉利收購沃爾沃商務(wù)談判案例分析
- JGJ/T235-2011建筑外墻防水工程技術(shù)規(guī)程
- 人教版PEP五年級英語下冊單詞表與單詞字帖 手寫體可打印
- 如果歷史是一群喵
- 抖音房產(chǎn)直播敏感詞匯表
- 2024屆山東省青島市市北區(qū)八年級物理第二學(xué)期期末質(zhì)量檢測試題含解析
- 廣東省深圳市2023年中考英語試題(含答案與解析)
- 《看看我們的地球》
- 2022-2023年人教版九年級化學(xué)(上冊)期末試題及答案(完整)
- 中華民族共同體概論課件專家版2第二講 樹立正確的中華民族歷史觀
- 蔚來用戶運(yùn)營分析報告-數(shù)字化
評論
0/150
提交評論