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

news2024/11/25 23:03:35

前言

(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.coloradmin.cn/o/1296661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ安装和使用

RocketMQ快速入门 下载RocketMQ 下载地址 环境要求 Linux64位系统 JDK1.8(64位) 安装RocketMQ 解压 unzip rocketmq-all-4.4.0-bin-release.zip启动RocketMQ 启动NameServer # 1.启动NameServer nohup sh bin/mqnamesrv & # 2.查看启动日志 tail -f ~/logs/rocke…

用C语言实现队列的顺序结构

用C语言实现队列的初始化、队列的判空操作、入队操作、出队运算、取队头元素运算、顺序打印队列。 #include<stdio.h> #define QueueSize 100 typedef char ElemType; typedef struct//队列结构体 {ElemType data[QueueSize];//保存队中元素int front, rear;//队头和队尾…

hook其他调试技巧

输出堆栈信息 通过 android.util.Log 输出当前线程的堆栈跟踪信息。 function showStacks() {Java.perform(function () {console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new() )); }) } 可以在需要的…

判断css文字发生了截断,增加悬浮提示

示例&#xff1a; 固定显示宽度&#xff0c;溢出显示...&#xff0c;利用了css的属性&#xff0c;想要实现成下面这样&#xff1a; 针对溢出的文字&#xff0c;hover显示全部。 提示很好加&#xff0c;使用tooltip组件就行了&#xff0c;难点是如何判断是否发生了文字溢出。…

【从零认识ECS云服务器 | 快速上线个人网站】三、对外发布网站

3.1 配置域名 用户是如何访问网站的呢&#xff1f; 用户在浏览器(IE、Chrome、FireFox等)上输入域名&#xff0c;如&#xff1a;http://www.aliyun.com &#xff1b; 浏览器自动调用DNS&#xff08;域名服务&#xff09;将域名解析为IP地址&#xff0c;如&#xff1a;123.123…

canvas绘制运动的圆

代码实现&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdev…

【数据结构】顺序表的定义和运算

目录 1.初始化 2.插入 3.删除 4.查找 5.修改 6.长度 7.遍历 8.完整代码 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &…

Redis主从架构中从节点的master_link_status:down

项目场景&#xff1a; 在搭建Redis的主从架构时&#xff0c;查看Redis的从节点状态时发现其连接的主节点的状态为down&#xff0c;并且查看主节点的状态时发现连接的从节点数量为0。 问题描述 原因分析&#xff1a; 可能在主节点中配置了密码&#xff0c;即requirepass。 解决…

diffusers pipeline拆解:理解pipelines、models和schedulers

diffusers pipeline拆解&#xff1a;理解pipelines、models和schedulers 翻译自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/write_own_pipeline v0.24.0 diffusers 设计初衷就是作为一个简单且易用的工具包&#xff0c;来帮助你在自己的使用场景中构建…

图像的均方差和信噪比计算

图像的均方差和信噪比计算 一、均方差1、公式2、代码 二、信噪比1、公式2、代码 图像的均方差和信噪比公式及代码&#xff0c;代码基于opencv和C实现。 一、均方差 均方误差&#xff0c;英文简称&#xff1a;MSE&#xff0c;英文全称&#xff1a;“Mean Square Error”。 衡量…

Java数据结构06——树

1.why: 数组&链表&树 2. 大纲 2.1前中后序 public class HeroNode {private int no;private String name;private HeroNode left;//默认为nullprivate HeroNode right;//默认为nullpublic HeroNode(int no, String name) {this.no no;this.name name;}public int …

AWTK 串口屏开发(1) - Hello World

1. 功能 这个例子很简单&#xff0c;制作一个调节温度的界面。在这里例子中&#xff0c;模型&#xff08;也就是数据&#xff09;里只有一个温度变量&#xff1a; 变量名数据类型功能说明温度整数温度。范围 (0-100) 摄氏度 2. 创建项目 从模板创建项目&#xff0c;将 hmi/…

快速学会绘制Pyqt5中的所有图(上)

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

EasyExcel之文件导出最佳实践

文件导出 官方文档&#xff1a;写Excel | Easy Excel (alibaba.com) 引言 当使用 EasyExcel 进行 Excel 文件导出时&#xff0c;我最近在工作中遇到了一个需求。因此&#xff0c;我决定写这篇文章来分享我的经验和解决方案。如果你对这个话题感兴趣&#xff0c;那么我希望这篇…

【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 代码仓库&#xff1a;Gitee 目录 虚拟地址和物理地址 页表 进程地址空间 进程地址空间存在的意义 虚拟地址和物理地址 我们在学习C/C的时候肯定都见过下面这张有关于内存分布的图片&a…

Flameshot的安装、配置及使用

概要&#xff1a;本篇主要介绍在Ubuntu22.04环境下&#xff0c;截图软件Flameshot的安装、配置及使用。 一、安装 推荐命令行安装 sudo apt install flameshot 二、修改gdm3配置文件 这一步是为了解决截图时没有光标的问题&#xff0c;解决方法我是从这里学到的解决flam…

【Linux】如何清空某个文件的内容

cat /dev/null > file1 清空某个文件的内容使用cat /dev/null > file1&#xff0c;它将 /dev/null 的内容&#xff08;空内容&#xff09;重定向到 file1。 如下所示&#xff0c;file1文件里的内容被清空。 错误写法 错误写法是&#xff1a;cat file1 > /dev/null&…

LeetCode Hot100 131.分割回文串

题目&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 方法&#xff1a;灵神-子集型回溯 假设每对相邻字符之间有个逗号&#xff0c;那么就看…

高效的多维空间点索引算法——GeoHash

一、Geohash 算法简介 GeoHash是空间索引的一种方式&#xff0c;其基本原理是将地球理解为一个二维平面&#xff0c;通过把二维的空间经纬度数据编码为一个字符串&#xff0c;可以把平面递归分解成更小的子块&#xff0c;每个子块在一定经纬度范围内拥有相同的编码。以GeoHash方…

leetcode面试经典150题——35 螺旋矩阵

题目&#xff1a; 螺旋矩阵 描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 提示&…