riscv_nuclei编译失败原因: 1.采用Makefile编译,未包含power模块 2.安全函数库重复包含,导致链接时报重定义错误 Close #I41PQJ Signed-off-by: zhushengle <zhushengle@huawei.com> Change-Id: Id3d20cdb6050fa01aff432be8a9e21dc3c590e29 |
||
---|---|---|
.. | ||
GCC | ||
OS_CONFIG | ||
SoC/demosoc | ||
Src | ||
doc/image | ||
.gitignore | ||
README.md |
README.md
Nuclei DDR200T开发板LiteOS使用说明
Nuclei DDR200T开发板简介
Nuclei DDR200T开发板是一款集成了FPGA和通用MCU的RISC-V评估开发板。其中FPGA子系统采用Xilinx XC7A200T-2 FPGA芯片,提供板载FPGA JTAG下载器、丰富的板载存储(Flash,DDR,eMMC,EEPROM)、丰富的接口资源(数字、模拟)以及蜂鸟调试器接口。MCU子系统采用GD32VF103 MCU芯片,提供板载调试器以及JTAG调试接口。
开发板资料链接:
文件结构
├── components # 可选组件
│ ├── cppsupport # C++支持
│ └── cpup # CPUP功能
├── kal # 内核抽象层
│ └── posix # posix标准接口支持
├── kernel # 内核最小功能集支持
│ ├── arch # 内核指令架构层代码
│ │ ├── risc-v # risc-v架构的代码
│ │ │ └── nuclei # nuclei内核相关代码
│ │ │ └── gcc # gcc编译器相关代码
│ │ │ ├── nmsis # nmsis内核标准
│ │ └── include # 对外接口存放目录
│ │ ├── los_arch_atomic.h # 定义通用arch的原子操作
│ │ ├── los_arch_context.h # 定义通用arch的上下文切换
│ │ ├── los_arch.h # 定义通用arch初始化
│ │ └── los_arch_interrupt.h # 定义通用arch中断
│ ├── include # 对外接口存放目录
│ │ ├── los_config.h # 功能开关和配置参数
│ │ ├── los_event.h # 事件
│ │ ├── los_liteos.h # liteos最小功能集对外提供的头文件
│ │ ├── los_memory.h # 堆内存管理
│ │ ├── los_mutex.h # 互斥锁
│ │ ├── los_queue.h # 队列
│ │ ├── los_scheduler.h # 调度算法
│ │ ├── los_sem.h # 信号量
│ │ ├── los_task.h # 任务
│ │ └── los_timer.h # 定时器
│ └── src # 内核最小功能集源码
├── targets # 板级工程目录
│ ├── riscv_nuclei_demo_soc_gcc # Nuclei DDR200T开发板相关代码
│ ├── GCC # 编译相关
│ ├── OS_CONFIG # 开发板配置功能开关和配置参数
│ ├── SoC # SOC相关代码
│ └── Src # application相关代码
├── utils # 通用公共目录
├── include
│ ├── los_compiler.h # 编译工具配置,类型定义
│ ├── los_debug.h # debug,printf相关
│ ├── los_error.h # 错误定义
│ └── los_list.h
└── src
使用说明
软件需求:linux环境
硬件需求:Nuclei DDR200T开发板
本示例将新建并运行两个任务,可以在控制台查看任务执行打印信息。
环境配置
- 工具链配置
请先确认您使用的是centos系统或Ububntu 64bit。
- 新建一个
Nuclei
文件夹,比如~/home/Nuclei
- 参考下图,从Nuclei Download Center下载工具链和OpenOCD。
- CentOS或Ubuntu系统请点击图中红框1下载RISC-V GNU工具链
- 点击图中蓝框2-1下载64bit的OpenOCD
- 确保Make工具版本不低于3.82: ubuntu系统使用
sudo apt-get install make
指令安装make
工具, CentOS系统使用sudo yum install make
指令安装。
图1 Linux环境要下载的Nuclei Tools
- 在之前新建的
Nuclei
文件夹中新建gcc
文件夹和openocd
文件夹。- 解压缩之前下载的gnu工具链到任意文件夹中,复制其中
bin
文件件所在层级的所有内容到gcc
文件夹中。 - 同样解压缩之前下载的OpenOCD到任意文件夹中,复制其中
bin
文件件所在层级的所有内容到openocd
文件夹中。
- 解压缩之前下载的gnu工具链到任意文件夹中,复制其中
注意:
请务必下载并解压缩Linux版本的工具,不要下载windows版本工具。
- 驱动配置
驱动配置步骤如下:
-
连接开发板到Linux中,确保USB被Linux识别出来。
-
在控制台中使用lsusb指令查看信息,参考的打印信息如下:
Bus 001 Device 010: ID 0403:6010 Future Technology Devices International, Ltd FT2232xxxx
-
将github(https://github.com/riscv-mcu/ses_nuclei_sdk_projects/blob/master/misc/99-openocd.rules)上misc文件夹内99-openocd.rules文件复制到当前路径下,控制台中输入sudo cp 99-openocd.rules /etc/udev/rules.d/99-openocd.rules指令复制文件到指定路径下。
-
断开调试器再重新连接到Linux系统中。
-
使用ls /dev/ttyUSB*命令查看ttyUSB信息,参考输出如下:
/dev/ttyUSB0 /dev/ttyUSB1
-
使用ls -l /dev/ttyUSB1命令查看分组信息,参考输出如下:
crw-rw-r-- 1 root plugdev 188, 1 Nov 28 12:53 /dev/ttyUSB1
可以看到ttyUSB1已经加入plugdev组,接下来我们要将自己添加到plugdev组。使用whoami命令查看当前用户名,我们将其记录为< your_user_name >。
-
使用sudo usermod -a -G plugdev <your_user_name>命令将自己添加进plugdev组。
-
再次确认当前用户名已属于plugdev组,使用groups命令,可以看到打印信息中有plugdev即成功将当前用户添加至plugdev组。
编译源码
使用git clone
复制代码到任意目录下,打开进入到工程根目录下,输入git submodule update --init --recursive
下载更新子模块。
编译前请在当前控制台中配置NUCLEI_TOOL_ROOT
路径,假设Nuclei
文件夹所在路径为/home/Nuclei
,输入export NUCLEI_TOOL_ROOT=/home/Nuclei
。或者使用时make选项增加NUCLEI_TOOL_ROOT=/home/Nuclei
。
配置路径后打开至代码根目录下的/target/riscv_nuclei_demo_soc_gcc/GCC位置,输入如下指令开始编译:
make all
编译结束后部分参考输出如下:
text data bss dec hex filename
21900 112 65426 87438 1558e build/Nuclei-demo-soc.elf
若编译前想清理工程,请使用如下指令:
make clean
下载调试、运行
调试或运行前请先是用蜂鸟调试器连接Nuclei DDR200T开发板,确保已按照环境配置中驱动配置部分配置完成。
同样配置好NUCLEI_TOOL_ROOT
路径并打开至代码根目录下的/target/riscv_nuclei_demo_soc_gcc/GCC位置,输入如下指令进入GDB调试:
make debug
等待到进入GDB调试界面时,输入load
指令下载编译好的elf文件,就可以开始调试。
若想直接运行,请在调试时所在位置输入如下指令:
make upload
运行时可以查看串口打印内容,使用串口查看工具,这里以minicom
为例,若未安装此工具可自行安装或使用其他串口查看工具。打开控制台,输入minicom -D /dev/ttyUSB1 -b 115200
指令打开串口查看工具。
运行时参考输出如下:
Nuclei SDK Build Time: Mar 31 2021, 03:29:57
Download Mode: ILM
CPU Frequency 7998996 Hz
entering kernel init...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry2 running...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry1 running...
TaskSampleEntry2 running...
TaskSampleEntry1 running...