rt-thread/bsp/nuclei/nuclei_fpga_eval
Yaochenger b9e4fcfc68
[libcpu][riscv]整合libcpu/riscv中的移植文件 提供一份公共代码于common (#6941)
整合libcpu/riscv中的移植文件 提供一份公共代码于common

在提交本pr时,除hpmicro的内核,rv32内核bsp已完成去除大部分的冗余,大部分代码采用common中的实现。本pr的作用是进一步统一common中的文件,从而提供一份公用代码,新移植的RV32内核的BSP可以全部使用common代码。

- 在common中提供一份公用文件:interrupt_gcc.S
- 修改原有的文件,将原有的中断中上下文切换代码替换为interrupt_gcc.S
- 基于上述修改,修改仓库中risc-v内核的BSP与移植相关的部分 (主要包含中断入口函数 中断栈等)
- 在common中提供一份公用文件:trap_common.c;提供统一中断入口函数,中断入口函数初始化,中断入口注册等函数,并完善异常时的信息输出

- 在common中提供一份公用文件:rt_hw_stack_frame.h;将栈帧结构体剥离,供用户使用

- 在上述工作完成后,在上述工作的基础上测试仓库中risc-v内核的BSP

- 完善函数中的命名,完善中断栈的获取

- 提供一份详细的基于现有common文件的移植指南

  #### 在什么测试环境下测试通过 

- 1.CH32V307V-R1-R0
- 2.CH32V208W-R0-1V4
- 3.HPM6750EVKMINI
- 4.GD32VF103V-EVAL
- 5.qemu(CORE-V-MCU )

> 与上述开发板使用同样芯片的BSP均测试通过

在CH32V307V-R1-R0与HPM6750EVKMINI上基于现有移植文件进行多线程复杂场景下的长时间测试,测试过程系统运行正常。
2023-03-01 01:32:43 -05:00
..
applications [bsp][nuclei] change hbird_eval bsp to nuclei_fpga_eval 2021-10-15 17:38:50 +08:00
board [libcpu][riscv]整合libcpu/riscv中的移植文件 提供一份公共代码于common (#6941) 2023-03-01 01:32:43 -05:00
.config modify RT_ALIGN_SIZE as 8 by default 2023-01-12 22:47:23 -05:00
Kconfig format Kconfig and sconscript 2023-01-08 22:52:13 -05:00
README.md [libcpu][riscv]整合libcpu/riscv中的移植文件 提供一份公共代码于common (#6941) 2023-03-01 01:32:43 -05:00
SConscript [bsp][nuclei] change hbird_eval bsp to nuclei_fpga_eval 2021-10-15 17:38:50 +08:00
SConstruct [bsp] add null CCFLAGS for Nuclei bsps (#5851) 2022-04-21 20:37:39 +08:00
rtconfig.h modify RT_ALIGN_SIZE as 8 by default 2023-01-12 22:47:23 -05:00
rtconfig.py [libcpu][riscv]整合libcpu/riscv中的移植文件 提供一份公共代码于common (#6941) 2023-03-01 01:32:43 -05:00

README.md

芯来科技FPGA评估板

简介

芯来科技FPGA系列板 是由芯来科技公司推出的用于一系列测试评估芯来RISC-V内核处理器的FPGA评估板。

更多关于 芯来科技FPGA评估板 开发板的详细资料请参见:

板载资源

硬件 描述
内核 Nuclei RISC-V N/NX/UX 内核
架构 RV32 or RV64
主频 16MHz or uncertain freq

注意: 这个上面烧写的是FPGA bitstream文件所以处理器内核版本根据型号来定通过修改rtconfig.py中的NUCLEI_SDK_CORE.

工具安装

安装工具链

请根据安装Nuclei RISC-V GCC Toolchain和OpenOCD 来安装依赖的工具。

添加环境变量

将Nuclei RISC-V GCC Toolchain和OpenOCD的环境变量进行设置。

Windows

假设工具安装在 D:\NucleiStudio\toolchain目录下, 则可以修改系统环境变量PATH, 将D:\NucleiStudio\toolchain\gcc\bin;D:\NucleiStudio\toolchain\openocd\bin;增加到PATH中。

或者在ENV工具命令行中运行

set PATH=D:\NucleiStudio\toolchain\gcc\bin;D:\NucleiStudio\toolchain\openocd\bin;%PATH%

Linux

假设工具安装在 ~/NucleiStudio/toolchain目录下, 通过在Linux的.bashrc增加如下一行代码 来添加环境变量。

export PATH=~/NucleiStudio/toolchain/gcc/bin:~/NucleiStudio/toolchain/openocd/bin:$PATH

或者在ENV工具命令行中运行

export PATH=~/NucleiStudio/toolchain/gcc/bin:~/NucleiStudio/toolchain/openocd/bin:$PATH

注意: 对应的RISC-V GCC和OPENOCD的路径请替换成自己安装的路径。

烧写及执行

驱动设置

驱动安装设置,请参考Nuclei FPGA开发板介绍

编译程序

下载好RT-Thread的代码和ENV工具以后。

按照ENV工具的教程, 在rt-thread\bsp\nuclei\nuclei_fpga_eval目录打开ENV工具命令行。

注意: 请确保Nuclei GCC和Nuclei OpenOCD的路径设置正确无误。

  1. 运行 pkgs --update来下载最新的依赖的Nuclei SDK开发包,修改链接脚本。

      .stack ORIGIN(RAM) + LENGTH(RAM) - __TOT_STACK_SIZE (NOLOAD) :
      {
    	...
        PROVIDE( _sp = . );
        PROVIDE( __rt_rvstack = . );//在链接脚本中补充该条语句
      } >RAM AT>RAM
    
  2. 可选: 运行 menuconfig来进行内核配置

  3. 运行 scons -c清理之前的编译结果

  4. 根据你当前评估的Nuclei RISC-V内核情况修改 rtconfig.py中的NUCLEI_SDK_CORENUCLEI_SDK_DOWNLOAD参数。

    • NUCLEI_SDK_CORE可选的参数为Supported Nuclei Cores
    • NUCLEI_SDK_DOWNLOAD可选的参数为ilm,flash或者flashxip, 关于该选项的说明参见Supported Download Modes
    • 假设你手头拿到的Nuclei评估处理器内核为N307(rv32imafc), 想程序运行模式为flash, 则修改NUCLEI_SDK_COREn307, NUCLEI_SDK_DOWNLOADflash.
  5. 修改完对应的rtconfig.py参数配置并保存后,运行 scons来进行代码的编译

下载程序

在保证程序能够正常编译后, 在相同ENV终端执行scons --run upload进行代码的下载。

正常下载的输出如下:

scons: Reading SConscript files ...
Supported downloaded modes for board nuclei_fpga_eval are ('ilm', 'flash', 'flashxip'), chosen downloaded mode is ilm
Upload application rtthread.elf using openocd and gdb
riscv-nuclei-elf-gdb rtthread.elf -ex "set remotetimeout 240"                     -ex "target remote | openocd --pipe -f D:/workspace/Sourcecode/rt-thread/bsp/nuclei/nuclei_fpga_eval/packages/nuclei_sdk-latest/SoC/demosoc/Board/nuclei_fpga_eval/openocd_demosoc.cfg"
              --batch -ex "monitor halt" -ex "monitor flash protect 0 0 last off" -ex "load"                     -ex "monitor resume" -ex "monitor shutdown" -ex "quit"
D:\Software\Nuclei\gcc\bin\riscv-nuclei-elf-gdb.exe: warning: Couldn't determine a path for the index cache directory.
Nuclei OpenOCD, i386 Open On-Chip Debugger 0.10.0+dev-g11f0cf429 (2020-07-15-04:09)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
rt_list_insert_before (n=0xdeadbeef, l=0x90000f80 <timer_thread_stack+464>) at D:\workspace\Sourcecode\rt-thread\include/rtservice.h:79
79          n->next = l;
cleared protection for sectors 0 through 63 on flash bank 0

Loading section .init, size 0x284 lma 0x80000000
Loading section .text, size 0xb30a lma 0x800002c0
Loading section .rodata, size 0x3248 lma 0x8000b5d0
Loading section .data, size 0x340 lma 0x8000e818
Start address 0x80000198, load size 60182
Transfer rate: 48 KB/sec, 10030 bytes/write.
shutdown command invoked
A debugging session is active.

        Inferior 1 [Remote target] will be detached.

Quit anyway? (y or n) [answered Y; input not from terminal]
[Inferior 1 (Remote target) detached]

下载程序之后, 连接串口(115200-N-8-1), 可以看到 RT-Thread 的输出信息:

最新发布出去的评估Bit一般都是16MHz, 串口工作在115200bps下串口读取可以正常工作.

initialize rti_board_start:0 done

 \ | /
- RT -     Thread Operating System
 / | \     4.0.3 build Apr 23 2020
 2006 - 2020 Copyright by rt-thread team
do components initialization.
initialize rti_board_end:0 done
initialize dfs_init:0 done
initialize libc_system_init:0 done
initialize finsh_system_init:0 done
msh />

在串口终端(我这里使用的是TeraTerm)输入ps即可查看当前线程工作情况:

msh />ps
thread   pri  status      sp     stack size max used left tick  error
-------- ---  ------- ---------- ----------  ------  ---------- ---
serrxsim   5  suspend 0x00000134 0x0000018c    77%   0x00000005 000
tshell    20  running 0x000002b0 0x00001000    17%   0x00000005 000
tidle0    31  ready   0x00000164 0x0000018c    89%   0x0000000b 000
timer      4  suspend 0x00000120 0x00000200    56%   0x00000009 000
msh />

调试程序

在保证程序编译成功后, 在相同ENV终端执行scons --run debug进行代码在命令行下进行GDB调试。

正常的调试输出如下:

scons: Reading SConscript files ...
Supported downloaded modes for board nuclei_fpga_eval are ('ilm', 'flash', 'flashxip'), chosen downloaded mode is ilm
Debug application rtthread.elf using openocd and gdb
riscv-nuclei-elf-gdb rtthread.elf -ex "set remotetimeout 240"                     -ex "target remote | openocd --pipe -f D:/workspace/Sourcecode/rt-thread/bsp/nuclei/nuclei_fpga_eval/packages/nuclei_sdk-latest/SoC/demosoc/Board/nuclei_fpga_eval/openocd_demosoc.cfg"
D:\Software\Nuclei\gcc\bin\riscv-nuclei-elf-gdb.exe: warning: Couldn't determine a path for the index cache directory.
GNU gdb (GDB) 8.3.0.20190516-git
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=i686-w64-mingw32 --target=riscv-nuclei-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from rtthread.elf...
Remote debugging using | openocd --pipe -f D:/workspace/Sourcecode/rt-thread/bsp/nuclei/nuclei_fpga_eval/packages/nuclei_sdk-latest/SoC/demosoc/Board/nuclei_fpga_eval/openocd_demosoc.cfg
Nuclei OpenOCD, i386 Open On-Chip Debugger 0.10.0+dev-g11f0cf429 (2020-07-15-04:09)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
0x0000000080000e80 in rt_thread_idle_entry (parameter=<optimized out>)
    at D:\workspace\Sourcecode\rt-thread\src\idle.c:253
253                     idle_hook_list[i]();
(gdb) load
Loading section .init, size 0x284 lma 0x80000000
Loading section .text, size 0xb30a lma 0x800002c0
Loading section .rodata, size 0x3248 lma 0x8000b5d0
Loading section .data, size 0x340 lma 0x8000e818
Start address 0x80000198, load size 60182
Transfer rate: 49 KB/sec, 10030 bytes/write.
(gdb) b main
Breakpoint 1 at 0x800002c0: file applications\main.c, line 35.
(gdb) c
Continuing.

Breakpoint 1, main () at applications\main.c:35
35          board_serial_init();
(gdb) n
rt_thread_exit () at D:\workspace\Sourcecode\rt-thread\src\thread.c:277
277         return rt_current_thread;
(gdb) c
Continuing.

调试例子参见如下文档:

为了更方便的进行调试, 也可以下载Nuclei Studio集成开发环境, 创建一个Debug Configuration, 选择编译好的 ELF文件, 然后配置OPENOCD和GDB即可, OPENOCD配置文件路径为bsp\nuclei\nuclei_fpga_eval\packages\nuclei_sdk-latest\SoC\demosoc\Board\nuclei_fpga_eval\openocd_demosoc.cfg

驱动支持情况

驱动 支持情况 备注
UART 支持 蜂鸟开发板载串口是UART0

注:

  • 适配RT-Thread的驱动框架的代码在 ../libraries/demosoc/HAL_Drivers目录下。
  • 如果有开发者想适配更多的驱动, 请在对应目录下增加驱动适配支持。
  • 目前串口读取功能在主频为8MHz情况下需要工作在57600bps, 目前发布的Bit一般都是16Mhz
  • 目前串口读取没有采用中断的方式进行,而是采用单独的任务来读取,等中断信号接入后可以直接中断方式读取

联系人信息

维护人: