皋陶 发表于 2020-10-16 23:51:32

蜂鸟FPGA开发板全知道篇2:快速上手介绍(下)

本帖最后由 皋陶 于 2020-10-16 23:51 编辑

蜂鸟FPGA开发板全知道篇1:开源内核简介蜂鸟FPGA开发板全知道篇2:快速上手介绍(上)蜂鸟FPGA开发板全知道篇2:快速上手介绍(中)蜂鸟FPGA开发板全知道篇2:快速上手介绍(下)蜂鸟FPGA开发板全知道篇3:开源SoC简介(1)蜂鸟FPGA开发板全知道篇3:开源SoC简介(2)蜂鸟FPGA开发板全知道篇3:开源SoC简介(3)蜂鸟FPGA开发板全知道篇3:开源SoC简介(4)蜂鸟FPGA开发板全知道篇4:移植RTOS


目录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开源SoC3搭建FPGA原型平台3.1      FPGA开发板和项目介绍3.2      生成mcs文件烧写FPGA3.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   运行更多示例程序和Benchmarks6   移植和运行FreeRTOS7   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配置文件

[*]start.S:系统上电启动的引导程序。
在中文书籍《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 uploadPROGRAM=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移植和运行FreeRTOS
FreeRTOS是著名的开源实时操作系统(RTOS),FreeRTOS完全免费,具有源码公开、可移植、可裁剪、任务调度灵活等特点,可以方便地移植到各种MCU上运行。
有关FreeRTOS的详细介绍,以及如何在HBird-E-SDK平台运行的详细步骤,请参见《蜂鸟E203移植FreeRTOS》(请持续关注公众号,后续即将发布)。
7WindowsIDE开发工具
一款高效易用的集成开发环境(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:快速上手介绍(下)》。完

页: [1]
查看完整版本: 蜂鸟FPGA开发板全知道篇2:快速上手介绍(下)