前言
(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,但是程序不对。很显然,这是正常的,因为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)感谢张鹏大佬的指导。