前言
(1)
(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,但是程序不对。很显然,这是正常的,因为D1S和Milkv-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官方仓库有一个cv1800b的bsp,但是这个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-rtthread的drv_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-rtthread的driver文件夹。编译出现如下问题。

(2)之后开始尝试开始查找ioremap.h文件,先查找哪些文件中包含了ioremap.h。结果发现drivers/drv_gpio.c,数据库文件.sconsign.dblite,build/kernel/components/mm/ioremap.o中有ioremap.h内容。因此我们可以推断出,应该是和ioremap.o有关系。
grep ioremap.h -r
(3)于是我们尝试对比d1-nezha-rtthread和rtthread仓库中的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)感谢张鹏大佬的指导。


