0
点赞
收藏
分享

微信扫一扫

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


前言

(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

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

下载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

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

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

scons -c
scons -j10

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

测试尝试

(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

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

使用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

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

(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文件,执行之后会卡死,最终返回一个程序卡死的地址。
注意:你的这个地址可能和我不一样,但是通过反汇编查看都是卡死在同一个函数。具体原因不清楚。

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

(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

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

直接将drivers全部修改

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

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

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

grep ioremap.h -r

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

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

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

参考文章

(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)感谢张鹏大佬的指导。


举报

相关推荐

0 条评论