本系列主要就蜂鳥FPGA開發板及蜂鳥JTAG下載器進行講解說明,其中包括:
蜂鳥FPGA開發板全知道篇1:開源內核簡介
蜂鳥FPGA開發板全知道篇2:快速上手介紹
蜂鳥FPGA開發板全知道篇3: 開源SoC簡介
蜂鳥FPGA開發板全知道篇4: 移植RTOS
本篇《蜂鳥FPGA開發板全知道篇2:快速上手介紹》將會分為:
《蜂鳥FPGA開發板全知道篇2:快速上手介紹(上)》
《蜂鳥FPGA開發板全知道篇2:快速上手介紹(中)》
《蜂鳥FPGA開發板全知道篇2:快速上手介紹(下)》
此篇為《蜂鳥FPGA開發板全知道篇2:快速上手介紹(下)》。
目錄1 運行Verilog仿真測試
1.1 E203開源項目的代碼層次結構
1.2 E203開源項目的測試用例(Self-Check TestCase)
1.2.1 riscv-tests自測試用例
1.2.2 編譯ISA自測試用例
1.3 E203開源項目的測試平臺(TestBench)
1.4 在Verilog TestBench中運行測試用例
2 蜂鳥E203開源SoC
3 搭建FPGA原型平臺
3.1 FPGA開發板和項目介紹
3.2 生成mcs文件燒寫FPGA
3.3 JTAG調試器
3.4 FPGA原型平臺DIY總結
4 運行和調試軟體示例
4.1 HBird-E-SDK簡介
4.1.1 HBird-E-SDK代碼結構
4.2 使用HBird-E-SDK開發和運行示例程序
4.3 使用GDB和OpenOCD調試示例程序
5 運行更多示例程序和Benchmarks
6 移植和運行FreeRTOS
7 Windows IDE開發工具
4 運行和調試軟體示例本章將介紹如何使用燒錄後的FPGA原型平臺運行真正的軟體示例。
4.1 HBird-E-SDK簡介為了讓用戶能夠輕鬆的使用起蜂鳥E203內核開發軟體,E203開源項目也配套了一個軟體開發套件(Software Development Kit,SDK)。為了方便用戶理解,本文將此SDK稱之為「HBird-E-SDK」。
蜂鳥E203專門維護一個獨立的Github倉庫(https://github.com/SI-RISCV/hbird-e-sdk)作為管理和維護HBird-E-SDK,並且在中文書籍《RISC-V架構與嵌入式開發入門指南》的第11章中進行了深入淺出的系統講解。感興趣的用戶可以自行搜索此書。
HBird-E-SDK並不是一個軟體,它本質上是由一些Makefile、板級支持包(Board Support Package,BSP)、腳本和軟體示例組成的一套開發環境。HBird-E-SDK基於Linux平臺,使用標準的RISC-V GNU工具鏈對程序進行編譯,使用OpenOCD+GDB將程序下載到硬體平臺中並進行調試。HBird-E-SDK主要包含如下兩個方面的內容:
(1)板級支持包(Board Support Package,BSP)。
(2)若干軟體示例。
4.1.1 HBird-E-SDK代碼結構
HBird-E-SDK平臺(https://github.com/SI-RISCV/hbird-e-sdk)的代碼結構如下:
各個主要的目錄簡述如下。
software目錄主要用於存放軟體示例,包括基本的hello_world示例、demo_gpio示例、demo_iasm示例、dhrystone跑分程序、CoreMark跑分程序和FreeRTOS示例程序。每個示例均有單獨的文件夾,包含了各自的原始碼、Makefile和編譯選項(在Makefile中指定)等。
bsp/hbird-e200/drivers目錄主要用於存放驅動程序代碼,譬如PLIC模塊的底層驅動函數和代碼。
bsp/hbird-e200/include目錄主要用於存放包含SoC中外設模塊的寄存器地址等參數的頭文件。
bsp/hbird-e200/stubs目錄主要用於存放一些移植Newlib所需的底層樁函數的具體實現。
bsp/hbird-e200/env目錄主要用於存放一些基本的支持性文件,簡述如下:
board.h:定義了開發板上管腳或者按鍵相關的宏定義。
platform.h:定義了SoC平臺相關的宏定義。
common.mk:調用GCC進行編譯的Makefile腳本,也會指定編譯相關的選項。
encoding.h:存放編碼和常數的宏定義。
entry.S:異常和中斷入口函數。
init.c:系統上電初始化函數。
link_flash.lds:將程序存放在Flash中,上電後上載至ITCM中進行執行的連結腳本。
link_flashxip.lds:將程序存放在Flash中直接進行執行的連結腳本。
openocd_hbird.cfg:使用蜂鳥JTAG調試器的OpenOCD配置文件
在中文書籍《RISC-V架構與嵌入式開發入門指南》第11章中對HBird-E-SDK進行了深入淺出的系統講解。感興趣的用戶可以自行搜索此書。
4.2使用HBird-E-SDK開發和運行示例程序E203開源項目提供一個典型的示例程序demo_gpio可運行於前文中介紹的FPGA開發板上(燒寫了蜂鳥E203開源SoC),使用HBird-E-SDK平臺按照如下步驟可以運行。
// 步驟一:準備好自己的電腦環境,可以在公司的伺服器環境中運行,如果是個人用戶,推薦如下配置:
(1)使用VMware虛擬機在個人電腦上安裝虛擬的Linux作業系統。
(2)由於Linux作業系統的版本眾多,推薦使用Ubuntu16.04版本的Linux作業系統有關如何安裝VMware以及Ubuntu作業系統本文不做介紹,有關Linux的基本使用本文也不做介紹,請用戶自行查閱資料學習。
// 步驟二:將HBird-E-SDK項目下載到本機Linux環境中,使用如下命令:
git clone https://github.com/SI-RISCV/hbird-e-sdk
// 經過此步驟將項目克隆下來,本機上即可具有如前文所述完整的hbird-e-sdk目錄文件夾,假設該目錄為<your_sdk_dir>,後文將使用該縮寫指代。
// 步驟三:由於編譯軟體程序需要使用到GNU工具鏈,假設使用完整的riscv-tools來自己編譯GNU工具鏈則費時費力,因此本文檔推薦使用預先已經編譯好的GCC工具鏈。我們已經將工具鏈上傳至網盤,網盤具體地址記載於hbird-e-sdk項目(https://github.com/SI-RISCV/hbird-e-sdk)的prebuilt_tools目錄下的README中,用戶可以在網盤中的「RISC-VSoftware Tools/RISC-V_GCC_201801_Linux」目錄下載壓縮包gnu-mcu-eclipse-riscv-none-gcc-7.2.0-2-20180111-2230-centos64.tgz和gnu-mcu-eclipse-openocd-0.10.0-6-20180112-1448-centos64.tgz,然後按照如下步驟解壓使用(注意: 上述連結網盤上的工具鏈可能會不斷更新,用戶請注意自行判斷使用最新日期的版本,下列步驟僅為特定版本的示例)。
cp gnu-mcu-eclipse-riscv-none-gcc-7.2.0-2-20180111-2230-centos64.tgz~/
cp gnu-mcu-eclipse-openocd-0.10.0-6-20180112-1448-centos64.tgz~/
//將兩個壓縮包均拷貝到用戶的根目錄下cd ~/tar -xzvf gnu-mcu-eclipse-riscv-none-gcc-7.2.0-2-20180111-2230-centos64.tgz
tar –xzvf gnu-mcu-eclipse-openocd-0.10.0-6-20180112-1448-centos64.tgz
// 進入根目錄並解壓上述兩個壓縮包,解壓後可以看到一個生成的gnu-mcu-eclipse文件夾。
cd <your_sdk_dir>
// 進入hbird-e-sdk目錄文件夾。
mkdir -p work/build/openocd/prefix
// 在hbird-e-sdk目錄下創建上述這個prefix目錄。
cd work/build/openocd/prefix
// 進入到prefix該目錄。
ln –s ~/gnu-mcu-eclipse/openocd/0.10.0-6-20180112-1448/binbin
// 將用戶根目錄下解壓的OpenOCD目錄下的bin目錄作為軟連結連結到該prefix目錄下。
cd <your_sdk_dir>
// 再次進入到hbird-e-sdk目錄文件夾。
mkdir -p work/build/riscv-gnu-toolchain/riscv32-unknown-elf/prefix/
// 在hbird-e-sdk目錄下創建上述這個prefix目錄。
cd work/build/riscv-gnu-toolchain/riscv32-unknown-elf/prefix
// 進入到prefix該目錄。
ln -s ~/gnu-mcu-eclipse/riscv-none-gcc/7.2.0-2-20180111-2230/binbin
// 將用戶根目錄下解壓的GNU Toolchain目錄下的bin目錄作為軟連結連結到
該prefix目錄下。
注意:此步驟完成工具鏈的安裝之後,後續開發程序示例無需重複執行此步驟。
// 步驟四:按照第4章中所述方法,準備好蜂鳥E203專用FPGA開發板,並將bitstream文件或者mcs文件燒錄至FPGA中待命,且用JTAG調試器將FPGA開發板與主機PC連接,並確保JTAG調試器的USB接口被虛擬機Linux系統正確識別。
// 步驟五:編譯demo_gpio示例程序,使用如下命令:
cd <your_sdk_dir>
// 進入hbird-e-sdk目錄文件夾。
make dasm PROGRAM=demo_gpioNANO_PFLOAT=0
//注意:由於Demo_GPIO程序的printf函數不需要輸出浮點數,上述選項NANO_PFLOAT=0指明newlib-nano的printf函數無需支持浮點數,請參見《RISC-V架構與嵌入式開發快速入門》第11章了解相關信息。
//注意:此處沒有指定Makefile中的DOWNLOAD選項,則默認採用「將程序從Flash上載至ITCM進行執行的方式」進行編譯,請參見《RISC-V架構與嵌入式開發快速入門》第11章了解相關信息。
// 步驟六:將編譯好的demo_gpio程序下載至FPGA原型開發板中,使用如下命令:
cd <your_sdk_dir>
// 進入hbird-e-sdk目錄文件夾。
make upload PROGRAM=demo_gpio
// 步驟七:在FPGA原型平臺上運行demo_gpio程序:
// 由於demo_gpio示例程序將通過UART列印一個字符串到主機PC的顯示屏上。因此需要先將串口顯示終端準備好,打開另外一個Ubuntu的命令行終端,使用如下命令。
sudo screen /dev/ttyUSB1115200
// 該命令將設備ttyUSB1設置為串口顯示的來源,波特率為115200。
// 若該命令執行成功的話,Ubuntu的該命令行終端將被鎖定,用於顯示串口發送的字符。
// 若該命令無法執行成功,請確保已按照第3.3節中所述方法將USB的權限設置正確。
// 將主機PC的串口顯示終端準備好之後,則僅需按FPGA原型開發板上的RESET按鍵即可。
按FPGA開發板上的RESET按鍵,則處理器復位開始執行demo_gpio程序,並將Log字符列印至主機PC的串口顯示終端上,如圖4-1所示。然後用戶可以輸入任意字符(譬如字母y),程序繼續運行,開發板上將會以固定頻率進行閃燈。
圖4-1 運行Demo_GPIO示例後於主機串口終端上顯示信息
4.3 使用GDB和OpenOCD調試示例程序GDB(GNU Project Debugger),是GNU工具鏈中的調試軟體。GDB是一款應用非常廣泛的調試工具,能夠用於調試C、C++、Ada等等各種語言編寫的程序,它提供如下功能:
GDB可以用於在主機PC的Linux系統中調試運行的程序,同時也能用於調試嵌入式硬體,在嵌入式硬體的環境中,由於資源有限,一般的嵌入式目標硬體上無法直接構建GDB的調試環境(譬如顯示屏和Linux系統等),這時可以通過GDB+GdbServer的方式進行遠程(remote)調試,通常而言GdbServer在目標硬體上運行,而GDB則在主機PC上運行。
為了能夠支持GDB對其進行調試,蜂鳥E203使用OpenOCD作為其GdbServer與GDB進行配合。OpenOCD( Open On-Chip Debugger )是一款開源的免費調試軟體,由社區共同維護,由於其開放開源的特點,眾多的公司和個人使用其作為調試軟體,支持大多數主流的MCU和硬體開發板。為了能夠完全支持GDB的功能,在使用GCC對原始碼進行編譯的時候,需要使用-g選項,例如:gcc -g -o hello hello.c 。該選項會將調試所需信息加入編譯所得的可執行程序中,因此該選項會增大可執行程序的大小,因此在正式發布的版本中通常不使用該選項。
GDB雖然可以使用一些前端工具實現圖形化界面,但是更常見的是使用命令行直接對其進行操作。常用的GDB命令介紹以及如何GDB和OpenOCD對蜂鳥E203內核進行調試的詳細步驟,請參見中文書籍《RISC-V架構與嵌入式開發快速入門》第11章了解詳細信息。
5 運行更多示例程序和Benchmarks衡量處理器的一個重要指標便是功耗,另外一個重要指標便是性能。而對於處理器性能的評估,需要依賴跑分程序(Benchmarks)來完成。
在處理器領域的Benchmarks非常眾多,有某些個人開發的程序,也有某些標準組織,或者商業公司開發的Benchmarks,本文在此不加以一一枚舉。在嵌入式處理器領域最為知名和常見的Benchmarks為Dhrystone和CoreMark。
Dhrystone和CoreMark和更多其他的示例程序的詳細介紹,以及如何在HBird-E-SDK平臺運行的詳細步驟,請參見中文書籍《RISC-V架構與嵌入式開發快速入門》第12章了解詳細信息。
6 移植和運行FreeRTOSFreeRTOS是著名的開源實時作業系統(RTOS),FreeRTOS完全免費,具有源碼公開、可移植、可裁剪、任務調度靈活等特點,可以方便地移植到各種MCU上運行。有關FreeRTOS的詳細介紹,以及如何在HBird-E-SDK平臺運行的詳細步驟,請參見《蜂鳥E203移植FreeRTOS》(請持續關注公眾號,後續即將發布)。
7 WindowsIDE開發工具一款高效易用的集成開發環境(Integrated DevelopmentEnvironment,IDE)對於任何MCU都顯得非常重要,軟體開發人員需要藉助IDE進行實際的項目開發與調試。ARM架構的MCU目前佔據了很大的市場份額,ARM的商業IDE軟體Keil也非常深入人心,很多嵌入式軟體工程師均對其非常熟悉是商業IDE軟體(譬如Keil)存在著授權以及收費的問題,各大MCU廠商也會推出自己的免費IDE供用戶使用,譬如瑞薩的e2studio和NXP的LPCXpresso等,這些IDE均是基於開源的Eclipse框架,Eclipse幾乎成了開源免費MCU IDE的主流選擇。
Eclipse平臺採用開放式原始碼模式運作,並提供公共許可證(提供免費原始碼)以及全球發布權利。Eclipse本身只是一個框架平臺,除了Eclipse平臺的運行時內核之外,其所有功能均位於不同的插件中。開發人員既可通過Eclipse項目的不同插件來擴展平臺功能,也可利用其他開發人員提供的插件。一個插件可以插入另一個插件,從而實現最大程度的集成。
Eclipse IDE平臺具備以下幾方面的優勢:
Eclipse自2001年推出以來,已形成大規模社區,這為設計人員提供了許多資源,包括圖書、教程和網站等,以幫助他們利用Eclipse平臺與工具提高工作效率。Eclipse平臺和相關項目、插件等都能直接從eclipse.org網站下載獲得。
Eclipse的開放式原始碼平臺幫助開發人員持續充分發揮大規模資源的優勢。Eclipse在以下多個項目上不斷改進。
· 平臺項目——側重於Eclipse本身。
· CDT項目——側重於C/C++語言開發工具。
· PDE項目——側重於插件開發環境。
設計人員始終能獲得原始碼,總能修正工具的錯誤,它能幫助設計人員節省時間,自主控制開發工作。
Eclipse平臺採用Java語言編寫,可在Windows與Linux等多種開發工作站上使用。開放式原始碼工具支持多種語言、多種平臺以及多種廠商環境。
Eclipse採用開放式、可擴展架構,它能夠與ClearCase、SlickEdit、RationalRose以及其他統一建模語言(UML)套件等第三方擴展協同工作。此外,它還能與各種圖形用戶接口(GUI)編輯器協同工作,並支持各種插件。
請參見《RISC-V架構與嵌入式開發快速入門》書籍第13章,其中詳細介紹了如何使用基於MCU Eclipse IDE的Windows開發調試環境對蜂鳥E203內核進行軟體開發和調試。
文章回顧此篇為《蜂鳥FPGA開發板全知道篇2:快速上手介紹(下)》。
回顧上篇:
《蜂鳥FPGA開發板全知道篇2:快速上手介紹(上)》
《蜂鳥FPGA開發板全知道篇2:快速上手介紹(中)》
更多信息本文編輯by 新晉矽農胖夏
感興趣的讀者可以通過下面二維碼關注公眾號「矽農亞歷山大」,了解Verilog、IC設計、CPU、RISC-V和人工智慧AI相關的更多設計技巧和經驗分享,注意:由於乾貨太多,請自備茶水。