RISCV开发环境使用指南
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 04/22/2024 | |
1.1 | 04/18/2025 |
1. 概述¶
RISCV开发环境搭建有两种方式:
-
基于Makefile的脚本编译。
-
基于MounRiver Studio。MRS(www.mounriver.com)是一款针对嵌入式项目(RISC-V/ARM)的集成开发环境,提供了包括编辑器、C编译器、宏汇编、链接器、库管理、仿真调试器等在内的完整开发资源。
推荐使用脚本编译方式
2. RISCV SDK脚本编译方式¶
python 环境用2.7.17
2.1. RISCV Linux Code的集成编译¶
集成编译是指把RISCV的源码放到linux源码路径下,编译project的同时会一起编译RISCV
2.1.1. 工具链配置¶
解压工具链:
tar -xvf riscv_gcc.tar.xz
本文中工具链解压后的路径为:/tools/toolchain
export PATH=${PATH}:/tools/toolchain/gcc-10.2.1-20210303-sigmastar-glibc-x86_64_aarch64-linux-gnu/bin:/tools/toolchain/riscv_gcc/bin; export CROSS_COMPILE=aarch64-linux-gnu-; export ARCH=arm64
2.1.2. 代码解压¶
在Linux Source code的project同级目录创建文件夹 riscv/kernel
mkdir -p riscv/kernel
将释放的pcupid_riscv_isw.tar.xz使用命令解压到riscv/kernel目录
cd riscv/kernel tar -xvf ~/Pcupid_DLD00V2.2.8-RISCV.tar.xz -C ./
2.1.2. 选择编译defconfig¶
cd到Linux编译的文件夹project目录,执行:
make dispcam_pcupid.spinand.glibc-10.2.1-squashfs.ssm001b.256.dual_sensor.bga_ddr3_riscv_defconfig
这里defconfig里会设定riscv的编译mak文件CONFIG_RISCV_CONFIG="pcupid_riscv_isw"
2.1.3. 编译整包image¶
make clean make image -j8
RISCV会根据project/board/riscv/riscv.mk优先使用Source Code进行编译
编译完成后会自动将riscv/kernel/rtk/proj/build/pcupid_riscv_isw/out/u-pcupid_riscv_isw.bin复制到project/board/riscv/riscfw
并创建硬链接到project/image/output/images/riscvfw,用于后续制作USB升级二进制文件。
2.2. RISCV Code的单独编译¶
2.2.1. 解压工具链和源码¶
解压提供的gcc-sigmastar-7.2.0-riscv64-unknown-elf.tar.xz压缩包和源码pcupid_riscv_isw.tar.xz
2.2.2. 工具链配置¶
export PATH=/users/yongfeng.wu/riscv/gcc-sigmastar-7.2.0-riscv64-unknown-elf/bin/:$PATH export CROSS_COMPILE=riscv64-unknown-elf-
2.2.3. 编译代码¶
cd rtk/proj ./tng/configure.pl pcupid_riscv_isw
执行编译命令
make clean make -j32
2.2.4. 更新固件,打包镜像¶
生成的二进制文件位于:
build/pcupid_riscv_isw/out/u-pcupid_riscv_isw.bin
将生成好的二进制文件复制到project目录下:
cp build/pcupid_riscv_isw/out/u-pcupid_riscv_isw.bin ../../project/board/riscv/riscfw
重新打包固件:
cd project make image_install -j8
2.3. 新增客户应用模块¶
以添加一个test demo为例,客户增加应用模块,主要按如下4个步骤操作即可
2.3.1. 添加config¶
在riscv/kernel/rtk/proj/mak/下的options_pcupid_riscv_isw.mak中添加模块CONFIG配置
2.3.2. 加入编译路径¶
-
在riscv/kernel/rtk/proj/mak/libs_common.mak文件中添加新增应用的PRODUCT_SC,上一步打开CONFIG后即会编译对应的应用
注:此处需要用PRODUCT_SC,表示需要编译源码,使用PRODUCT_SC_LIB_REL会报错
-
在riscv/kernel/rtk/proj/mak/paths.mak中添加模块路径
2.3.3. 添加mak编译配置文件,源文件¶
test_demo.c 中测试内容
#include <string.h> #include "sys_sys_isw_cli.h" #include "cam_os_wrapper.h" static int MyTestMain(CLI_t *pCli, char *p) { CamOsPrintf("demo test\n"); return 0; } SS_RTOS_CLI_CMD(test_demo, "Rest test", "Usage: reset_test [cmd]\n" "Cmd:\n" " reset_arm: reset arm\n" " reset_soc: reset soc\n" " shutdown_soc: shutdown soc\n" " reset_reason: get last reset reason\n", MyTestMain);
test_demo.mak内容
PROCESS = lib SRC_C_LIST := test_demo.c PATH_C := $(PATH_test_demo)/\
2.3.4 编译¶
由于修改到了config文件,需要在rtk/proj目录下重新执行指定config命令
./tng/configure.pl pcupid_riscv_isw make clean make -j8
3. MounRiver Studio安装¶
3.1. 下载¶
从MounRiver官网下载安装包(本文使用的为MounRiver_Studio_Setup_V183.zip):
http://www.mounriver.com/download
3.2. 安装¶
解压安装包,双击Setup进行安装
3.3. MounRiver帮助文档¶
3.3.1. 在线帮助文档¶
3.3.2. IDE集成帮助文档¶
离线帮助文档打开步骤:
-
点击IDE上面Help按钮
-
在弹窗中选择“Help Manual”
-
在打开的“Help Manual”窗口左边,选择“帮助手册(中文)”
-
后边就会显示帮助手册的目录,可以依次或按需浏览。
3.4. Python环境安装¶
3.4.1. 下载¶
从python官网下载3.8版本的安装包,推荐3.8.10版本:
https://www.python.org/ftp/python/3.8.10/python-3.8.10-amd64.exe
3.4.2. 安装¶
双击下载好的安装程序进行安装,记得要勾选上”Add Python to PATH”选项
3.5. 打开工程文件¶
解压Pcupid_DLD00V2.2.8-RISCV-MountRiver.tar.xz
双击PCUPID.wvproj 即可打开RISCV的MountRiver工程
3.6. 编译¶
-
点击按钮1,Build,就可以进行Build了
-
点击按钮2,Rebuild,会先进行clean操作,然后再执行Build操作
-
Build完成后,就可以在obj目录下生成新的固件PCUPID.fw
3.7. 更新固件,打包镜像¶
- Linux alakid项目: 使用PCUPID.fw替换alkaid中的project/board/riscv/riscfw并重新生成images包,也可以单独把新固件替换烧入images目录中的riscvfw文件,烧入新的images后重新启动,系统会使用新固件启动RISCV。
4. 系统概述¶
架构说明:
-
物理硬件层:由物理硬件组成,其中包括cpu、ddr、i2c、uart等硬件模块组成;
-
基础内核层:基础内核层主要包含与硬件相关的驱动代码,cpu相关的中断管理、异常管理、系统时钟,以及操作系统提供的基础的任务管理和内存管理。除此之外内核还提供一系列通讯工具如消息队列、信号量等。任务管理以及通讯相关的组件与FreeRTOS官方的使用方法无异,请参考FreeRTOS官方提供的说明文档;
-
内核增强:内核增强主要是在基础内核的基础上实现某些系统扩展功能,例如:
-
CLI:提供了用户命令行操作,用户可以通过命令行测试或观察系统运行状态;
-
RPMSG:提供了FreeRTOS和Linux的通信机制;
-
ProxyFS:实现了FreeRTOS端通过虚拟文件系统读写Linux端文件,可用于FreeRTOS标定数据存取;
-
Exception Log:实现了记录系统错误时的最后日志到共享内存中;
-
CamOsWrapper:对不同系统实现了跨系统的统一调用接口,方便代码归一及统一用法;
-
-
行业应用:由客户的应用逻辑通过调用底层的接口实现的上层应用。
5. 目录结构¶
目录说明:
-
目录1,hdrs,是sdk的头文件目录,所有以library形式release的库,其对应的头文件都在这个目录中
-
目录2,libs/product,是sdk的库文件目录,所有以library形式release的库,都在这个目录下
-
目录3,obj,是MounRiver编译的输出目录,里面有自动生成的makefile,以及编译结果文件,如PCUPID.fw就是可以烧入到flash上,让RISCV运行的固件。
-
目录4,sc,是sdk中以源代码形式release的库和app所在的目录,其中application下的是demo程序,而driver目录下的是驱动
-
目录5,scatter,是link script所在目录
-
目录6,tools,是存放需要用用到的tools的目录,比如把ELF转换成可以烧入到flash上被执行的固件的脚本(postprocess.py)就在这个目录下面。
5.1. Demo application介绍¶
-
目录1,inc,存放的是模块(module)内部的头文件,不被其他模块使用的头文件
-
目录2,pub,存放的是会被其他模块使用的头文件
-
目录3,src,则是模块的源代码文件
-
函数4,rtos_application_initcall(),用来指定application模块的入口函数,第一个参数是函数名,第二个参数用于设置模块入口函数的执行顺序,一般都配置为0,当存在多个application模块时,可以通过配置参数0,1,2,3来决定application函数的执行顺序,数字越小会越早得到执行
-
Bench模块的入口函数RtosAppMainEntry()只是单纯的调用coremark_main()函数,执行coremark操作