前言
(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)感謝張鵬大佬的指導。