生成fip.bin在Milkv-duo上跑rtthread的相关尝试,及其问题分析

前言

(1)PLCT实验室实习生长期招聘:招聘信息链接
(2)本来是想在Milkv-duo上跑rtthread的,做了很多努力,一直没有结果。虽然不知道最终能不能成功做出来,还是把自己的相关努力分享出来,如果也有想做这方面努力的大佬,也可以看看此篇博客能不能提供一点点帮助吧。
(3)在看本文之前,请先了解:Milk-V Duo移植rt-thread smart如何自己生成fip.bin在Milkv-duo上跑freertos

前期准备

(1)因为D1S和Milkv-duo都是C906内核的,所以说,mentor让我从D1S已经移植好的rtthread仓库开始努力。

下载交叉编译工具链

(1)首先我们需要下载工具链
(2)下载了之后,上传到Linux中,输入如下命令进行解压

tar -xvzf riscv64-elf-gcc-thead_20200528.tar.gz

在这里插入图片描述

下载d1-nezha-rtthread仓库

(1)下载d1-nezha-rtthread仓库仓库,进入d1-nezha-rtthread/bsp/d1-nezha目录中将rtconfig.py文件中的EXEC_PATH替换成自己的编译工具链即可。

git clone https://github.com/bigmagic123/d1-nezha-rtthread.git
cd d1-nezha-rtthread/bsp/d1-nezha
vim rtconfig.py

在这里插入图片描述

(2)先清除环境,然后直接编译。最终生成rtthread.bin文件

scons -c
scons -j10

在这里插入图片描述

测试尝试

(1)还不会合成fip.bin的朋友,可以先看看如何自己生成fip.bin在Milkv-duo上跑freertos
注意:一些上面链接中包含一些需要修改的部分,这里不做赘述。所以请各位先生成fip.bin在Milkv-duo上跑freertos,测试仓库是否无误。

直接将d1-nezha-rtthread的bin文件合成fip.bin

(1)虽然我知道这样不行,但还是测试一下。直接将d1-nezha-rtthread仓库生成的rtthread.bin文件合成进入fip.bin中。
(2)最终合成的fip.bin文件传输进SD卡,然后放在Milkv-duo上跑,发现最终卡在了hehe部分,表示跑进了rtos.bin,但是程序不对。很显然,这是正常的,因为D1SMilkv-duo的串口寄存器地址都不一样。

# d1-nezha-rtthread仓库路径
cd ${d1-nezha-rtthread_DIR}
cp rtthread.bin rtos.bin
mv rtos.bin ${duo-toolbox_DIR}/debugloader/duoRVOS
# 进入duo-toolbox仓库路径
cd ${duo-toolbox_DIR}/debugloader/
export PATH=`pwd`/../host-tools/gcc/riscv64-linux-musl-x86_64/bin:$PATH
export PATH=`pwd`/../host-tools/gcc/riscv64-elf-x86_64/bin:$PATH
cd duoRVOS/
make clean
make
cd ../../fip/
cp ../debugloader/duoRVOS/os.bin .
make fsbl-build

在这里插入图片描述

使用rtthread官方仓库cv1800b生成的bin文件

(1)因为rtthread官方仓库有一个cv1800bbsp,但是这个bsp包只能跑rtthread smart版本。可能会有朋友要说了,我们可以通过scons --menuconfig来调整为rtthread标准版。但是我测试之后发现不行,猜测原因是,duo-toolbox仓库删掉了opensbi的一些信息,但是rtthread官方仓库无论是smart版本还是标准版都会调用这部分函数。因此最终会卡死在sbi_call函数中。
(2)知道不行,为什么还要测试呢?实践出真知麻,也许是我哪里操作错误了呢?这样各位大佬也可以指出来。
如果要进行这个测试,建议先在大核上跑smart版本。 相关教程:Milk-V Duo移植rt-thread smart
(3)先按下面方法把smart版本修改为标准版
因为我的目标是Milkv-duo的小核跑rtthread,而小核没有MMU,因此只能跑标准版。

cd ${rt-thread_DIR}/bsp/cv1800b
scons --menuconfig

在这里插入图片描述

(4)修改版本之后,指向如下操作。

# rt-thread官方仓库的cv1800b路径中
cd ${rt-thread_DIR}/bsp/cv1800b
scons -c
scons -j10
# 这里需要你指定riscv64-linux-musl-x86_64工具链路径
export PATH=${riscv64-linux-musl-x86_64_DIR}/bin:$PATH
riscv64-unknown-linux-musl-objcopy -O binary rtthread.elf rtos.bin
mv rtos.bin ${duo-toolbox_DIR}/debugloader/duoRVOS
# 进入duo-toolbox仓库路径
cd ${duo-toolbox_DIR}/debugloader/
export PATH=`pwd`/../host-tools/gcc/riscv64-linux-musl-x86_64/bin:$PATH
export PATH=`pwd`/../host-tools/gcc/riscv64-elf-x86_64/bin:$PATH
cd duoRVOS/
make clean
make
cd ../../fip/
cp ../debugloader/duoRVOS/os.bin .
make fsbl-build

(5)最终合成的fip.bin文件,执行之后会卡死,最终返回一个程序卡死的地址。
注意:你的这个地址可能和我不一样,但是通过反汇编查看都是卡死在同一个函数。具体原因不清楚。

在这里插入图片描述

(6)生成反汇编文件,然后根据E:ra返回的地址,可以查看到卡死位置的前一行指令是一个跳转指令。根据这条跳转指令可以发现,最终是在sbi_call函数中卡死。之后和mentor交流之后,得出结论应该是duo-toolbox仓库opensi的问题。

riscv64-unknown-linux-musl-objdump -d rtthread.elf > rtthread.asm

仅修改d1-nezha-rtthread的driver中的drv_uart文件

(1)和mentor交流之后,他让我版本回退,然后再试试。于是我先进行版本回退,然后将rtthread中的drv_uart文件覆盖d1-nezha-rtthreaddrv_uart文件进行测试。
(2)结果依旧卡死在hehe。

git reset --hard a310aac5fb12b2fc7667014057843ebc16f5daf8
cp rtthread.bin rtos.bin
mv rtos.bin ${duo-toolbox_DIR}/debugloader/duoRVOS
# 进入duo-toolbox仓库路径
cd ${duo-toolbox_DIR}/debugloader/
export PATH=`pwd`/../host-tools/gcc/riscv64-linux-musl-x86_64/bin:$PATH
export PATH=`pwd`/../host-tools/gcc/riscv64-elf-x86_64/bin:$PATH
cd duoRVOS/
make clean
make
cd ../../fip/
cp ../debugloader/duoRVOS/os.bin .
make fsbl-build

在这里插入图片描述

直接将drivers全部修改

(1)将rtthread仓库的cv1800b中的drivers文件夹直接覆盖d1-nezha-rtthreaddriver文件夹。编译出现如下问题。

在这里插入图片描述

(2)之后开始尝试开始查找ioremap.h文件,先查找哪些文件中包含了ioremap.h。结果发现drivers/drv_gpio.c,数据库文件.sconsign.dblitebuild/kernel/components/mm/ioremap.o中有ioremap.h内容。因此我们可以推断出,应该是和ioremap.o有关系。

grep ioremap.h -r

在这里插入图片描述

(3)于是我们尝试对比d1-nezha-rtthreadrtthread仓库中的build/kernel/components路径内容,发现d1-nezha-rtthread中没有mm文件夹。根据ioremap.h这个名字,我们大概可以推断出,这个应该是和用于实现与物理内存地址相关的输入/输出(I/O)内存映射的,可能与MMU有关。

在这里插入图片描述

参考文章

(1)Github d1-nezha-rtthread仓库
(2)交叉编译工具链网址
(3)面包板社区:教你动手移植RT-Thread到国产MCU
(4)RT-Thread论坛:【国产MCU移植】移植 RT-Thread 到 MM32F103xx 芯片
(5)B站:高手版:如何移植RT-Thread到GD32单片机上(非studio版)
(6)C站:Milk-V Duo移植rt-thread smart
(7)C站:如何自己生成fip.bin在Milkv-duo上跑freertos
(8)C站:Milk-V Duo移植rt-thread smart

感谢人员

(1)感谢PLCT的王俊强老师的指导。
(2)感谢张鹏大佬的指导。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风正豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值