生成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)感謝張鵬大佬的指導。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208321.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MDK官網如何下載stm32支持包

網站:https://www.keil.com/demo/eval/arm.htm 1 2 3點這個下載

基于Mint Mate 21.2 Victoria 的Anjuta安裝與測試

序言 Linux mint mate 21.2 命名為 victoria 版,在vmware虛擬機中安裝按提示默認安裝即可,不做更多記錄。mint mate的優點是穩定,窗口質感好。安裝完成后,需要關注一些常用功能配置。主要有:顯示器調整、桌面調整、工…

當然熱門的原創改寫改寫大全【2023最新】

在信息時代,隨著科技的不斷發展,改寫軟件逐漸成為提高文案質量和寫作效率的重要工具。本文將專心分享一些好用的改寫軟件,其中包括百度文心一言智能寫作以及147SEO改寫軟件。這些工具不僅支持批量改寫,而且在發布到各大平臺后能夠…

python爬取 HTTP_2 網站超時問題的解決方案

問題背景 在進行網絡數據爬取時,使用 Python 程序訪問支持 HTTP/2 協議的網站時,有時會遇到超時問題。這可能會導致數據獲取不完整,影響爬蟲程序的正常運行。 問題描述 在實際操作中,當使用 Python 編寫的爬蟲程序訪問支持 HTT…

使用高防IP防護有哪些優勢

高防IP是針對互聯網服務器在遭受大流量的DDoS攻擊后導致服務不可用的情況下,推出的付費增值服務,用戶可以通過配置高防IP,將攻擊流量引流到高防IP,確保源站的穩定可靠。高防IP相當于搭建完轉發的服務器。 高防IP有兩種接入方式&a…

Notepad安裝

中文免安裝版,下載解壓即可。 NotepadV7.5.6 (訪問密碼: 1666)https://url48.ctfile.com/f/33868548-986668939-7a3316?p1666

Node-RED 設置登錄權限

Node-RED 提供了內置的 “adminAuth” 功能,使你能夠通過用戶名和密碼來保護對 Node-RED 編輯器的訪問。本文將向你展示如何配置登錄權限,以及一些相關的最佳實踐。以下是設置登錄權限的步驟: 步驟一:配置 AdminAuth 在 Node-RE…

react Hooks實現原理

Fiber 上篇文章fiber簡單理解記錄了react fiber架構,Hooks是基于fiber鏈表來實現的。閱讀以下內容時建議先了解react fiber。 jsx -> render function -> vdom -> fiber樹 -> dom vdom 轉 fiber 的過程稱為 recocile。diff算法就是在recocile這個過程…

LVS-DR+Keepalived+動靜分離實驗

架構圖 解釋一下架構,大概就是用Keepalived實現兩臺DR服務器的LVS負載均衡,然后后端服務器是兩臺Nginx服務器兩臺Tomcat服務器并且實現動靜分離這個實驗其實就是把 LVS-DRKeepalived 和 動靜分離 給拼起來,真的是拼起來,兩個部分…

在SQLServer中,把一個表的字段更新到另一個表中

在SQLServer中,把一個表的字段更新到另一個表中,應該如何實現? 你可以使用 UPDATE 語句結合 JOIN 來將一個表中的字段更新到另一個表中。假設你有兩個表,稱為 table1 和 table2,你想從 table1 中更新 table2,可以像這…

Rtrofit+Rxjava網絡請求封裝

好幾年前封裝的框架一直沒上傳,趁現在升級寫下。 簡介Retrofit是android的網絡請求庫,是一個RESTful的HTTP網絡請求框架的封裝(基于okhttp)。它內部網絡請求的工作,本質上是通過OkHttp完成,而Retrofit僅負責…

JVM虛擬機:執行Java程序并指定JVM參數

本文重點 在前面我們設置參數值的時候,需要在eclipse中的VM中進行參數設置,查詢的時候需要先jps,然后jinfo。這里嘗試動態的設置和查詢,也就是說在運行程序的時候就對其進行設置,并且進行查詢。 過程 為了確定參數修…

微信個人號機器人開發

簡要描述: 取消消息接收 請求URL: http://域名地址/cancelHttpCallbackUrl 請求方式: POST 請求頭Headers: Authorization:login接口返回Content-Type:application/json 無參數 返回數據&#xff…

MeteoInfo-Java解析與繪圖教程

MeteoInfo-Java解析與繪圖教程(四) 上文我們說到,將地圖疊加在色斑圖上,但大部分都是衛星繪圖,現在開始講解micaps數據繪圖,同樣也是更多自定義 配置 首先我們解析micaps數據,將之前學到的東西拿過來繪圖 MeteoDataInfo meteoDataInfo new MeteoDataInfo(); meteoDataInfo.o…

使用Binding的RelativeSource

一個Binding有明確的數據來源 可以通過Source或ElementName賦值的方法讓Binding與之關聯 但是有的時候我們不能確定作為Source的對象叫什么名字,但知道它與作為Binding目標的對象在UI上有相對關系,比如:空間自己關聯自己的某個數據、關聯自己…

Flutter代碼補全

有的時候屬性不經常使用,就想不起來該用啥,只有點點印象;只能用代碼補全功能,但我用了AS的默認操作發下并不好使,估計是快捷鍵沖突了。剛開始是不是下面的效果:這肯定不是我們想要的。 不怕,接下…

【S32DS報錯】-2-提示Error while launching command:arm-none-eabi-gdb –version錯誤

目錄 1 Error錯誤提示 2 Error錯誤原因 3 如何消除Error錯誤 結尾 【S32K3_MCAL從入門到精通】合集: S32K3_MCAL從入門到精通https://blog.csdn.net/qfmzhu/category_12519033.html 1 Error錯誤提示 使用S32DSJ-LinK下載程序,在Dedug Configurati…

計算機基礎知識67--BBS

遷移表格 # 以后你寫的每個python項目,都必須有一個txt文件叫 requirements.txt,里面放了當前項目所有的依賴,別人拿到項目---》需要執行 pip install -r requirements.txt # 裝好該項目所有依賴 django3.2.20 # 模塊 pillow mysqlclient # 主體項目功…

中東電商指南分享!盤點中東四大跨境電商平臺

提到跨境電商新藍海,就不得不想起土豪聚集地 ——中東,中東地區擁有龐大的人口、高人均GDP、強大的消費能力以及廣泛普及的互聯網,但外出購物卻相對不便,正是這一特點為中東跨境電商市場創造了巨大的優勢。隨著中東地區電商的崛起…

mycat實現分表操作、isinstance的使用、sqlalchemy的使用、mysql數據庫連接池

1 mycat實現分表操作 2 isinstance的使用 3 sqlalchemy的使用 4 mysql數據庫連接池 1 mycat實現分表操作 在 MySQL 數據庫中,Mycat 通常用于實現分片(Sharding)操作。分片是一種將大型數據庫水平拆分成多個較小數據庫的策略,以提…