RISC-V MCU中文社区

【分享】 【分享】在linux下利用Hbird SDK对helloworld进行build

发表于 开源蜂鸟E203 2022-04-14 21:35:25
2
3275
1

参赛信息

队伍名: 杰彬伟, 队伍编号: CICC3867

前言

最近板子还没到, 就先试了试蜂鸟SDK, 在按照QuickStart进行操作时发现跑不通. 可能是因为版本迭代问题, 查了查错, 做了修改, 在这里分享一下. 我们使用的是riscv-nuclei-elf-gcc (GCC) 10.2.0和0.1.3版本的SDK.

1. BOARD参数的变动

按照Makefile variables passed by make command中给出来的参数列表, 我们用的是muc200t(对应的SOC是v2), 因此在Build Application一节中输入

  1. $ make SOC=hbirdv2 BOARD=hbird_mcu_200t CORE=e203 all

之后, 会有如下报错

  1. ab04@debian:~/hbird-sdk/application/baremetal/helloworld$ make SOC=hbirdv2 BOARD=hbird_mcu_200t CORE=e203 all
  2. Obtaining addtional make variables from ../../../Build/Makefile.global
  3. ../../../SoC/hbirdv2/build.mk:14: *** The openocd configuration file ../../../SoC/hbirdv2/Board/hbird_mcu_200t/openocd_hbirdv2.cfg for hbirdv2 doesn't exist, please check!. Stop.

cd到Board目录下发现有个名为mcu200t的文件夹, 显然Makefile中是将BOARD参数作为路径的一部分进行路径查找了, 因此将BOARD改为mcu200t就解决了. 当然重新make还会有错误, 接下来会继续分析.

2. 环境变量更改

在QuickStart中, 让我们设置了$NUCLEI_TOOL_ROOT这一环境变量, 但经过第1节的改动会, 会出现如下报错:

  1. Assembling : ../../../SoC/hbird/Common/Source/GCC/intexc_hbird.S
  2. make: riscv-nuclei-elf-gcc: No such file or directory

经过对Makefile的一定分析后, 在Makefile.conf文件中发现了如下代码:

  1. COMPILE_PREFIX ?= riscv-nuclei-elf-
  2. NUCLEI_SDK_TOOL_ROOT ?= $(NUCLEI_SDK_ROOT)/prebuilt_tools
  3. NUCLEI_RISCV_GCC_ROOT ?= $(NUCLEI_SDK_TOOL_ROOT)/gcc
  4. NUCLEI_OPENOCD_ROOT ?= $(NUCLEI_SDK_TOOL_ROOT)/openocd
  5. NUCLEI_SDK_TOOL_ROOT_EXIST = 0
  6. ifneq ($(wildcard $(NUCLEI_RISCV_GCC_ROOT)),)
  7. ifneq ($(wildcard $(NUCLEI_OPENOCD_ROOT)),)
  8. NUCLEI_SDK_TOOL_ROOT_EXIST = 1
  9. endif
  10. endif
  11. ifeq ($(NUCLEI_SDK_TOOL_ROOT_EXIST),1)
  12. CC := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)gcc)
  13. CXX := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)g++)
  14. OBJDUMP := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)objdump)
  15. OBJCOPY := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)objcopy)
  16. GDB := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)gdb)
  17. AR := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)ar)
  18. SIZE := $(abspath $(NUCLEI_RISCV_GCC_ROOT)/bin/$(COMPILE_PREFIX)size)
  19. OPENOCD := $(abspath $(NUCLEI_OPENOCD_ROOT)/bin/openocd)
  20. else
  21. CC := $(COMPILE_PREFIX)gcc
  22. CXX := $(COMPILE_PREFIX)g++
  23. OBJDUMP := $(COMPILE_PREFIX)objdump
  24. OBJCOPY := $(COMPILE_PREFIX)objcopy
  25. GDB := $(COMPILE_PREFIX)gdb
  26. AR := $(COMPILE_PREFIX)ar
  27. SIZE := $(COMPILE_PREFIX)size

说明新版本的SDK中使用了$NUCLEI_SDK_ROOT作为新的环境变量, 并且还可以根据上述代码发现软件目录组织也有所更改, 修改如下.

3. 软件目录组织

在教程的Nuclei基础下, 新建prebuilt_tools文件夹, 然后将gcc和openocd的软件目录都放进去, 然后$NUCLEI_SDK_ROOT依然设定为Nuclei文件夹的路径(按理说Makefile是支持~作为home目录的, 但不知道为什么没通过, 改为绝对路径后通过了)

  1. lab04@debian:~/software/Nuclei/prebuilt_tools$ ls
  2. gcc openocd
  3. lab04@debian:~/software/Nuclei/prebuilt_tools$ pwd
  4. /home/lab04/software/Nuclei/prebuilt_tools

然后重新用make命令来编译就通过了:

  1. lab04@debian:~/hbird-sdk/application/baremetal/helloworld$ make SOC=hbirdv2 BOARD=mcu200t CORE=e203 all
  2. Obtaining addtional make variables from ../../../Build/Makefile.global
  3. Current Configuration: RISCV_ARCH=rv32imac RISCV_ABI=ilp32 SOC=hbirdv2 BOARD=mcu200t CORE=e203 DOWNLOAD=ilm
  4. Assembling : ../../../SoC/hbirdv2/Common/Source/GCC/intexc_hbirdv2.S
  5. Assembling : ../../../SoC/hbirdv2/Common/Source/GCC/startup_hbirdv2.S
  6. Compiling : ../../../SoC/hbirdv2/Common/Source/Drivers/hbirdv2_gpio.c
  7. Compiling : ../../../SoC/hbirdv2/Common/Source/Drivers/hbirdv2_i2c.c
  8. Compiling : ../../../SoC/hbirdv2/Common/Source/Drivers/hbirdv2_pwm.c
  9. Compiling : ../../../SoC/hbirdv2/Common/Source/Drivers/hbirdv2_spi.c
  10. Compiling : ../../../SoC/hbirdv2/Common/Source/Drivers/hbirdv2_uart.c
  11. Compiling : ../../../SoC/hbirdv2/Common/Source/Drivers/htif.c
  12. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/clock_getres.c
  13. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/clock_gettime.c
  14. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/clock_settime.c
  15. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/close.c
  16. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/execve.c
  17. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/exit.c
  18. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/fork.c
  19. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/fstat.c
  20. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/getpid.c
  21. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/gettimeofday.c
  22. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/isatty.c
  23. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/kill.c
  24. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/link.c
  25. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/lseek.c
  26. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/open.c
  27. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/read.c
  28. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/sbrk.c
  29. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/stat.c
  30. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/times.c
  31. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/unlink.c
  32. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/wait.c
  33. Compiling : ../../../SoC/hbirdv2/Common/Source/Stubs/write.c
  34. Compiling : ../../../SoC/hbirdv2/Common/Source/hbirdv2_common.c
  35. Compiling : ../../../SoC/hbirdv2/Common/Source/system_hbirdv2.c
  36. Linking : helloworld.elf
  37. text data bss dec hex filename
  38. 9338 116 2388 11842 2e42 helloworld.elf

编译通过, 输出了helloworld.elf.

喜欢1
用户评论 (2)
  • 2022-04-16 09:34:53 1#

    刚发现QuickStart里, 进入sdk目录下会运行一条source setup.sh, 从Makefile和脚本本身看好像也是运行这条命令后好像也是可以的...

  • 2022-04-15 12:58:46 2#

    补充一下, 设置环境变量一定要用export命令, 官方教程里没加export, 这样用echo等方法是看不出问题的, 但是make工具用不了

未通过实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板