制作一个RISC-V的操作系统四-嵌入式开发介绍
文章目录
- 什么是嵌入式开发
- 交叉编译
- 查看一些GCC文件夹
- 调试器GDB
- 相关语法命令
- 模拟器QEMU
- QEMU的安装和使用
- 项目构造工具Make
- MakeFile的构成
- make的运行
- 练习4-1
- 练习4-2
- 练习4-3
什么是嵌入式开发
程序跑到开发板上,或者说运行到硬件上

交叉编译
简单理解交叉编译来说就是生成的程序不在本机上运行,而在与本机架构不同的计算机上运行
build:生成编译程序的计算机
host:运行build计算机生成的编译程序的计算机
target:就是编译结果运行的地方

查看一些GCC文件夹

->是符号链接


调试器GDB
GDB调试包括2个程序:gdb程序和被调试程序。根据这2个程序是否运行在同一台电脑中,可以把GDB的调试模型分为2种:
本地调试:调试程序和被调试程序运行在同一台电脑中
gdb 运行起来后,它会先fork一个子进程,被调试的程序会运行在这个单独的子进程中,gdb这个程序也会单独运行在一个独立的进程里。然后这两个进程通过独特的ptrace系统调用建立连接。
远程调试:调试程序运行在一台电脑中,被调试程序运行在另一台电脑中
在目标机会有一个gdbserver的服务,gdb会与gdbserver交互,由gdbserver代理我们的调试过程,被调试的程序是运行在目标机上的,而调试是在本机上的。两台机器通过网络连接

相关语法命令

p <变量名称>
Print的简写,显示指定变量(临时变量或全局变量)的值。s
执行一行源程序代码,如果此行代码中有函数调用,则进入该函数。相当于其它调试器中的“Step Into (单步跟踪进入)”。
这个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。si
si命令类似于s命令,但针对汇编指令。n
执行一行源程序代码,此行代码中的函数调用也一并执行。相当于其它调试器中的“Step Over (单步跟踪)”。
这个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。ni
ni命令类似于n命令,但针对汇编指令。c
Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。l
List的简写,列出当前位置之后的10行代码;list line_number: 列出line_number之后的十行代码。
模拟器QEMU

此时是模拟用户层的环境(类似操作系统) llk运行在用户层
qemu-riscv32 ./llk #在qemu提供的环境上运行llk
开发操作系统时要模拟系统级别的层次(类似硬件层次)
QEMU的安装和使用

项目构造工具Make
以自动化的方式编译程序
-f指定makefile文件

MakeFile的构成

.DEFAULT_GOAL的特殊变量,可用于告知如果在命令行中未指定目标,(就是只make时候) 应该构建哪个目标(或目标)。否则,Make会简单地使它遇到的第一个目标。
.PHONY:伪目标。伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签。伪目标通过PHONY来指明。 PHONY定义伪目标的命令一定会被执行
对于到下图中就是clean的里面的命令不管clean是否存在,都会执行

$(SRCS_ASM:.S=.o) 就是将SRCS_ASH变量里面的.S都替换为.o
make的运行
差不多就是一步步套娃

练习4-1
熟悉交叉编译概念,使⽤ riscv gcc 编译代码并使⽤ binutils ⼯具对⽣成的⽬标文件和可执⾏文件(ELF 格式)
进⾏分析。具体要求如下:
- 编写⼀个简单的打印 “hello world!” 的程序源文件:hello.c
- 对源文件进⾏编译,⽣成针对⽀持 rv32ima 指令集架构处理器的⽬标文件 hello.o
- 查看 hello.o 的文件的文件头信息。
- 查看 hello.o 的 Section header table。
- 对 hello.o 反汇编,并查看 hello.c 的 C 程序源码和机器指令的对应关系。
-march=rv32ima:指定生成后的32位可执行文件可以运行在支持 i 整数指令集 m 乘除法指令集 a 原子操作指令集
-mabi=ilp32:一个长整数时多少位
riscv64-unknown-elf-gcc -march=rv32ima -mabi=ilp32 llk.c -o llk
file llk
qemu-riscv32 ./llk #在qemu提供的环境上运行llk
练习4-2
基于 练习 4-1 继续熟悉 qemu/gdb 等⼯具的使⽤,具体要求如下:
- 将 hello.c 编译成可调式版本的可执⾏程序 a.out
- 先执⾏ qemu-riscv32 运⾏ a.out。
- 使⽤ qemu-riscv32 和 gdb 调试 a.out。
练习4-3
- ⾃学 Makefile 的语法,理解在 riscv-operating-system-mooc 仓库的根⽬录下执⾏ make 会发⽣什么。
SECTIONS = \code/asm \code/os \.DEFAULT_GOAL := all
all :@echo "begin compile ALL exercises for assembly samples ......................."for dir in $(SECTIONS); do $(MAKE) -C $$dir || exit "$$?"; done@echo "compile ALL exercises finished successfully! ......".PHONY : clean
clean:for dir in $(SECTIONS); do $(MAKE) -C $$dir clean || exit "$$?"; done.PHONY : slides
slides:rm -f ./slides/*.pdfsoffice --headless --convert-to pdf:writer_pdf_Export --outdir ./slides ./docs/ppts/*.pptx
- \表示换行。只有执行对应的Makefile命令的shell语句时才会进入shell环境,每行命令独立,每行都是单独的shell,所以上一行定义的shell变量并不适用于下一行。当然如果是使用了\来合并行就可以摆脱这个限制了。就是使之成为一条指令,或者是一个shell执行的。图中SECTIONS后的/可以理解就是把下面的和上面的练成一行。不然make执行时,每行都是一个单独的shell执行,这样SECTIONS就没有成功赋值。加了的话shell就执行三行,就可以成功赋值了
- for in ; do ; done循环语句 在makefile中的shell变量要用2个$号表示变量名称, 对应表示dir
- make -C 目录 表示进入目录后执行make
- ||表示前面部分指令执行失败后执行后面的指令
所以大概整个make就是进入code/asm 和code/os目录执行make,然后/code/asm 下对应的makefile又是进入各个文件执行make,/code/os也一样
相关文章:
制作一个RISC-V的操作系统四-嵌入式开发介绍
文章目录 什么是嵌入式开发交叉编译查看一些GCC文件夹 调试器GDB相关语法命令 模拟器QEMUQEMU的安装和使用项目构造工具MakeMakeFile的构成make的运行 练习4-1练习4-2练习4-3 什么是嵌入式开发 程序跑到开发板上,或者说运行到硬件上 交叉编译 简单理解交叉编译来说…...
Python爬虫-实现批量抓取王者荣耀皮肤图片并保存到本地
前言 本文是该专栏的第12篇,后面会持续分享python爬虫案例干货,记得关注。 本文以王者荣耀的英雄皮肤为例,用python实现批量抓取“全部英雄”的皮肤图片,并将图片“批量保存”到本地。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。注意,这里抓取的图片…...
04-详解Eureka注册中心的作用,具体配置,服务注册和服务发现
Eureka注册中心的作用 Eureka架构 远程调用的两个问题 服务的ip地址和端口号写死: 生产环境中服务的地址可能会随时发生变化,如果写死每次都需要重新修改代码多实例问题: 在高并发的情况下一个服务可以有多个实例形成一个集群,此时如果采用硬编码的方式只能访问服务的一个实…...
数据分析基础之《matplotlib(3)—散点图》
一、常见图形种类及意义 1、matplotlib能够绘制折线图、散点图、柱状图、直方图、饼图。我们需要知道不同的统计图的意义,以此来决定选择哪种统计图来呈现我们的数据 2、折线图plot 说明:以折线的上升或下降来表示统计数量的增减变化的统计图 特点&…...
Flask 动态路由、请求数据接收、视图函数返回值详解
一、动态路由 在前面的博客中,我们学习了如何创建基本的 Flask 应用,并定义了一些简单的路由。但有时候,我们需要更加灵活的路由,能够根据用户请求的不同来动态生成响应。Flask 提供了动态路由的功能,使我们能够轻松处…...
Transformer 简介
Transformer 是 Google 在 2017 年底发表的论文 Attention Is All You Need 中所提出的 seq2seq 模型。Transformer 模型的核心是 Self-Attention 机制,能够处理输入序列中的每个元素,并能计算其与序列中其他元素的交互关系的方法,从而能够更…...
LLVM学习笔记(64)
4.4.3.3.3. 设置寄存器类对类型的行为 1679行调用computeRegisterProperties()来计算寄存器类的衍生属性。TargetLoweringBase的容器RegisterTypeForVT、RegClassForVT以及NumRegistersForVT用于记录原生支持每个ValueType目标机器寄存器类的信息,即类型对应的寄存…...
深度学习TensorFlow2基础知识学习前半部分
目录 测试TensorFlow是否支持GPU: 自动求导: 数据预处理 之 统一数组维度 定义变量和常量 训练模型的时候设备变量的设置 生成随机数据 交叉熵损失CE和均方误差函数MSE 全连接Dense层 维度变换reshape 增加或减小维度 数组合并 广播机制&#…...
Linux系统---简易伙伴系统
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、题目要求 1.采用C语言实现 2.伙伴系统采用free_area[11]数组来组织。要求伙伴内存最小为一个页面,页面大小为4KB…...
Redis使用Lua脚本
Lua脚本 redis可以支持lua脚本,可以使用lua脚本来将几个命令整合为一个整体来执行,这样可以使得多个命令原子操作,且可以减少网络开销 Lua的数据类型 Lua是一个动态类型的语言,一个变量可以存储任何类型的值,类型有&am…...
macos安装metal 加速版 pytorch
categories: [Python] tags: Python MacOS 写在前面 试试 m3 的 metal 加速效果如何 Mac computers with Apple silicon or AMD GPUsmacOS 12.3 or laterPython 3.7 or laterXcode command-line tools: xcode-select --install 安装 Python: conda-forge brew install minif…...
【学习笔记】lyndon分解
摘抄自quack的ppt。 这部分和 s a sa sa的关联比较大,可以加深对 s a sa sa的理解。 Part 1 如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的,则称 s s s是一个 lyndon \text{lyndon} lyndon串。 lyndon \text{lyndon} lyndon分解&a…...
21、命令执行
文章目录 一、命令执行概述1.1 基本定义1.2 原理1.3 两个条件1.4 命令执行漏洞产生的原因1.5 管道符号和通用命令符 二、远程命令执行2.1 远程命令执行相关函数2.2 远程命令执行漏洞的利用 三、系统命令执行3.1 相关函数3.2 系统命令执行漏洞利用 四、命令执行漏洞防御 一、命令…...
Qexo博客后台管理部署
Qexo博客后台管理部署 个人主页 个人博客 参考文档 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下载代码包 若无法下载使用科学工具下载到本地在上传到服务器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解压 unzip Qexo…...
最小生成树prim
最小生成树(三)Prim算法及存储结构_哔哩哔哩_bilibili 311 最小生成树 Prim 算法_哔哩哔哩_bilibili #include <iostream> #include <queue> #include <string> #include <stack> #include <vector> #include <set…...
实用篇 | 一文学会人工智能中API的Flask编写(内含模板)
----------------------- 🎈API 相关直达 🎈-------------------------- 🚀Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面,你想知道的都在这里-CSDN博客 🚀Streamlit :实用篇 | 一文快速构建人工智能前端展…...
Si24R03—低功耗 SOC 芯片(集成RISC-V内核+2.4GHz无线收发器)
Si24R03是一款高度集成的低功耗SOC芯片,其集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围,集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC等丰…...
C# Winform 日志系统
目录 一、效果 1.刷新日志效果 2.单独日志的分类 3.保存日志的样式 二、概述 三、日志系统API 1.字段 Debug.IsScrolling Debug.Version Debug.LogMaxLen Debug.LogTitle Debug.IsConsoleShowLog 2.方法 Debug.Log(string) Debug.Log(string, params object[]) …...
【Java 基础】27 XML 解析
文章目录 1.SAX 解析器1)什么是 SAX2)SAX 工作流程初始化实现事件处理类解析 3)示例代码 2.DOM 解析器1)什么是 DOM2)DOM 工作流程初始化解析 XML 文档操作 DOM 树 3)示例代码 总结 在项目开发中࿰…...
地图服务 ArcGIS API for JavaScript基础用法全解析
地图服务 ArcGIS API for JavaScript基础用法全解析 前言 在接触ArcGIS之前,开发web在线地图时用过Leaflet来构建地图应用,作为一个轻量级的开源js库,在我使用下来Leaflet还有易懂易用的API文档,是个很不错的选择。在接触使用Ar…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...
