生成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.mzph.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 和 动静分离 给拼起来,真的是拼起来,两个部分…

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、强大的消费能力以及广泛普及的互联网,但外出购物却相对不便,正是这一特点为中东跨境电商市场创造了巨大的优势。随着中东地区电商的崛起…

Gan论文阅读笔记

GAN论文阅读笔记 2014年老论文了,主要记录一些重要的东西。论文链接如下: Generative Adversarial Nets (neurips.cc) 文章目录 GAN论文阅读笔记出发点创新点设计训练代码网络结构代码测试代码 出发点 Deep generative models have had less of an impac…

软件压力测试的重要性与用途

在当今数字化的时代,软件已经成为几乎所有行业不可或缺的一部分。随着软件应用规模的增加和用户数量的上升,软件的性能变得尤为关键。为了确保软件在面对高并发和大负载时仍然能够保持稳定性和可靠性,软件压力测试变得至关重要。下面是软件压…