RISC-V汇编学习(四)—— RISCV QEMU平台搭建(基于芯来平台)
RISCV汇编学习系列:
RISC-V汇编学习(一)—— 基础认识
RISC-V汇编学习(二)—— 汇编语法
RISC-V汇编学习(三)—— RV指令集
RISC-V汇编学习(四)—— RISCV QEMU平台搭建(基于芯来平台)
RISC-V汇编学习(五)—— 汇编实战、GCC内联汇编(基于芯来平台)
0 前言
无论是x86架构还是ARM架构的汇编代码,都需要在对应架构的物理芯片或兼容的模拟环境中执行。这意味着任何机器码都必须在相应的处理器架构上运行,以实现对底层硬件的操作。RISC-V架构也不例外,因此我们需要搭建一个合适的执行平台。通常有两种主要的方法来实现:1、使用实际的RISC-V开发板 2、通过软件模拟器如QEMU创建虚拟环境。
幸运的是,现在有了更多选择。例如,博主手中就有一块兆易创新基于芯来科技N205 RISC-V核心的GD32VF103开发板。这块开发板不仅提供了高性能和低功耗的优势,还配备了丰富的外设资源,是探索RISC-V架构的理想选择。对于有兴趣的朋友来说,GD32VF103不仅是STM32F103的一个优秀替代品,同时也是一个非常适合RISC-V入门学习的开发板。不妨动手试试看,体验一下RISC-V带来的不同之处吧。

但是暂时没有这样一块RISCV开发板的同学也可以通过QEMU来学习RISCV架构指令集,甚至比有开发板更灵活,也能更专注于开发学习,而不用处理复杂的硬件连线和配置。接下来,将先介绍下基于芯来RISCV的QEMU实验平台搭建。
1 QEMU实验环境搭建
1.0 基础环境
virtualbox+ubuntu20.4(新版QEMU依赖20.4的lib库,之前16的版本踩过坑),按照典型配置来就可以,可以参考:VirtualBox安装Ubuntu20.04图文教程,这里不做赘述。(如有现成的linux环境,没有必要虚拟机,当然windows环境也是可以,看个人喜好啦)
1.1 交叉编译工具链
交叉编译是在一个平台(宿主)上生成另一个不同平台(目标)上运行的代码,我们这里就是要用芯来提供的工具链来编译调试。
- RISC-V GNU Toolchain (链接: https://nucleisys.com/download.php)
- 选择嵌入式工具链(2025.2版本)、QEMU(2025.2版本)
- 解压:
tar -zxvf nuclei-qemu-2025.02-linux-x64.tar.gz
tar -jxvf nuclei_riscv_newlibc_prebuilt_linux64_2025.02.tar.bz2
得到如图所示的gcc和qemu工具
这里就是芯来官方提供的gcc(还有clang、llvm,但我们只用了gcc)和qemu的工具链了
- 环境变量设置
将解压后得工具链路径加入环境变量
1.2 裸机sdk
github: git clone https://github.com/Nuclei-Software/nuclei-sdk.git
或者
gitee: git clone https://gitee.com/Nuclei-Software/nuclei-sdk.git
工程文件环境变量设置
1.3 测试sdk和工具链
- 编译
make CORE=nx900fd SOC=evalsoc DOWNLOAD=ilm ARCH_EXT=_xxldsp dasm
进入*nuclei-sdk/application/freertos/demo/
*路径下,编译一个freertos的demo elf出来
2. qemu运行测试
make CORE=nx900fd SOC=evalsoc DOWNLOAD=ilm ARCH_EXT=_xxldsp run_qemu
一个简单的demo就跑起来啦
3. 调试
一个终端运行gdb server
make CORE=nx900fd SOC=evalsoc DOWNLOAD=ilm ARCH_EXT=_xxldsp run_qemu_debug
另起一个终端,
riscv64-unknown-elf-gdb freertos_demo.elf
之后连接3333号端口,就进入了熟悉的gdb调试界面。就可以调试啦
另外更多的makefile说明,可以参考帮助和sdk中的makefile,这里不做过多说明。
关于QEMU的介绍、使用,感兴趣的小伙伴可以自行了解,使用命令和命令参数参考芯来QEMU说明 。
我这里介绍步骤也相对直接简单很多,不去介绍过多东西,让学习者有更多精力学习RISCV上,而不是在折腾环境。
至此,芯来基于RISCV裸机QEMU平台就搭建好了,你已经相当于拥有了一台RISC-V设备了,只不过它现在躺在虚拟机里,但是你可以把它当成是物理机看待。(对芯来linux感兴趣的同学可以在下面参考官网链接里自行搭建学习,后面博主应该也会玩下)
2 初识RISCV汇编
基于步骤1搭建的QEMU平台可以就可以进行RISCV汇编的学习,当然也可以学习芯来的cpu和接口ip,这里重点还是学习RISCV汇编。但这里仅仅是管中窥豹,看下汇编风格,简单体验下。
一般嵌入式开发见到的汇编最多的场合就是freeloader.S、裸机的startup.S以及文件调试编译*.S等
以上面跑到的eval开发板的startup_evalsoc.S为例,先来一窥下官方release的RISCV汇编究竟如何。
这里仅截取一部分来看下:
/*** Reset Handler called on controller reset*/
_start:/* ===== Startup Stage 1 ===== *//* Disable Global Interrupt */csrc CSR_MSTATUS, MSTATUS_MIE/* If SMP_CPU_CNT is not defined,* assume that only 1 core is allowed to run,* the core hartid is defined via BOOT_HARTID.* other harts if run to here, just do wfi in __amp_wait*/
#ifndef SMP_CPU_CNT/* take bit 0-7 for hart id in a local cluster */csrr a0, CSR_MHARTIDandi a0, a0, 0xFF/* BOOT_HARTID is configurable in Makefile via BOOT_HARTID variable */li a1, BOOT_HARTIDbne a0, a1, __amp_wait
#endif/* Initialize GP and TP and jump table base when zcmt enabled */.option push.option norelaxla gp, __global_pointer$la tp, __tls_base
#if defined(__riscv_zcmt)la t0, __jvt_base$csrw CSR_JVT, t0
#endif.option pop/* TODO if don't have SMP, you can remove the SMP_CPU_CNT related code */
#if defined(SMP_CPU_CNT) && (SMP_CPU_CNT > 1)/* Set correct sp for each cpu* each stack size is __STACK_SIZE* defined in linker script */lui t0, %hi(__STACK_SIZE)addi t0, t0, %lo(__STACK_SIZE)la sp, _spcsrr a0, CSR_MHARTIDandi a0, a0, 0xFFli a1, 0
1:beq a0, a1, 2fsub sp, sp, t0addi a1, a1, 1j 1b
2:
#else/* Set correct sp for current cpu */la sp, _sp
#endif
当然有了前面RISCV汇编的基础,这些汇编看起来应该能大概看懂了,我们一起来看看下。
定义了一个复位处理函数 _start,它在控制器复位时被调用。这个函数主要负责初始化系统状态和设置栈指针等基础操作,以便程序能够正确地开始执行。
通过清除 CSR_MSTATUS 控制状态寄存器中的 MSTATUS_MIE(Machine Interrupt Enable)标志来禁用所有中断,确保在初始化过程中不会被中断打断。
csrc CSR_MSTATUS, MSTATUS_MIE
#ifndef SMP_CPU_CNT/* take bit 0-7 for hart id in a local cluster */csrr a0, CSR_MHARTIDandi a0, a0, 0xFF/* BOOT_HARTID is configurable in Makefile via BOOT_HARTID variable */li a1, BOOT_HARTIDbne a0, a1, __amp_wait
#endif
这部分代码检查是否定义了 SMP_CPU_CNT(Symmetric Multiprocessing CPU Count)。如果没有定义,意味着只允许一个核心运行,并且该核心的 hartid(硬件线程ID)是通过 BOOT_HARTID 定义的。如果当前核心的 hartid 不等于 BOOT_HARTID,则跳转到 __amp_wait 标签处等待(即进入低功耗模式),否则继续执行
.option push
.option norelax
la gp, __global_pointer$
la tp, __tls_base
#if defined(__riscv_zcmt)la t0, __jvt_base$csrw CSR_JVT, t0
#endif
.option pop
这里使用 .option push 和 .option pop 来临时改变一些编译选项。la 指令用于加载地址到寄存器中,这里设置了全局指针 gp 和线程指针 tp。如果启用了 RISC-V 的零成本上下文切换扩展 (__riscv_zcmt)
,还会设置 CSR_JVT 寄存器指向跳转表基址。
#if defined(SMP_CPU_CNT) && (SMP_CPU_CNT > 1)/* Set correct sp for each cpu* each stack size is __STACK_SIZE* defined in linker script */lui t0, %hi(__STACK_SIZE)addi t0, t0, %lo(__STACK_SIZE)la sp, _spcsrr a0, CSR_MHARTIDandi a0, a0, 0xFF
1:beq a0, a1, 2fsub sp, sp, t0addi a1, a1, 1j 1b
2:
#else/* Set correct sp for current cpu */la sp, _sp
#endif
此段代码根据是否定义了 SMP_CPU_CNT 并且其值大于1来决定如何设置每个CPU的核心栈指针。如果是多核配置,则为每个核心分配独立的栈空间,大小由链接脚本中定义的 __STACK_SIZE 决定。csrr 指令读取当前核心的 hartid,然后根据这个ID调整栈指针的位置。如果只有一个核心或没有定义 SMP_CPU_CNT,则直接将栈指针设置为 _sp 地址。
代码展示了如何在RISC-V架构上进行基本的系统初始化工作,包括中断管理、多核支持以及内存布局的设置。这些都是嵌入式开发中非常重要的步骤,确保操作系统或者应用程序能够在硬件上稳定运行,也就相当于BootLoader了
参考:
https://doc.nucleisys.com/nuclei_tools/qemu/intro.html
https://doc.nucleisys.com/nuclei_board_labs/hw/hw.html
相关文章:
RISC-V汇编学习(四)—— RISCV QEMU平台搭建(基于芯来平台)
RISCV汇编学习系列: RISC-V汇编学习(一)—— 基础认识 RISC-V汇编学习(二)—— 汇编语法 RISC-V汇编学习(三)—— RV指令集 RISC-V汇编学习(四)—— RISCV QEMU平台搭建…...
链表的定义、节点结构、基本操作(C++)
1. 链表的基本概念 链表是一种动态数据结构,它的元素(节点)在内存中不一定是连续存储的。每个节点通过指针连接到下一个节点,形成一个链式结构。链表分为单向链表、双向链表和循环链表等,这里主要介绍单向链表。 2. …...
deepseek使用记录21——脑图记录
我们有比前人更先进的工具,为何不利用起来呢? 工作的时候,问问自己,这个问题是理论问题?还是实践问题?如何在系统中劈开一条可实践路径?系统中的缝,系统中的力量(人先进…...
[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现
标题:[多线程]基于阻塞队列(Blocking Queue)的生产消费者模型的实现 水墨不写bug 文章目录 一、生产者消费者模型特点:二、实现2.1详细解释1. 成员变量2. 构造函数3. Isfull 和 Isempty4. Push 函数5. Pop 函数6. 析构函数7. GetSize 函数 三、总结与多线…...
【时时三省】(C语言基础)输入输出的概念
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 有关数据输入输出的概念 从前面的程序中可以看到:几乎每一个C程序都包含输入输出。因为要进行运算,就必须给出数据,而运算的结果当然需要输出,…...
基于ragflow中deepdoc对pdf文档的rag系统
基于ragflow中deepdoc对pdf文档的rag系统 一、安装 conda环境安装到指定的路径 conda create 包名/环境的名字 rag就是包的名字,ragflow就是环境名; 怎样激活环境?–我是在百度飞桨上面跑的 conda activate /home/aistudio/rag/ragflow …...
基于WebRTC技术的EasyRTC嵌入式音视频SDK:多平台兼容与性能优化
在当今数字化、智能化的时代背景下,实时音视频通信技术已成为众多领域不可或缺的关键技术。基于WebRTC技术的EasyRTC嵌入式音视频SDK,凭借其在ARM、Linux、Windows、安卓、iOS等多平台上的兼容性,为开发者提供了强大的工具,推动了…...
Linux驱动开发实战(四):设备树点RGB灯
Linux驱动开发实战(四):设备树点RGB灯 文章目录 Linux驱动开发实战(四):设备树点RGB灯前言一、驱动实现1.1 驱动设计思路1.2 关键数据结构1.3 字符设备操作函数1.4 平台驱动探测函数1.5 匹配表和平台驱动结…...
大模型架构记录5-向量数据库
一 倒排索引、KNN、PQ 1.1 基础版本 query -> requery 对问题做处理,处理上下文 对query 做 refined query 1.2 向量数据库 二 搜索逻辑 2.1 knn 2.2 近似KNN 先和N个空间的均值比较再和空间内部的所有点比较,计算最近值。 优化一: …...
【 Fail2ban 使用教程】
Fail2ban 使用教程 1. 安装 Fail2ban2. 配置 Fail2ban2.1 创建 jail.local 文件2.2 基本配置参数说明2.3 配置具体服务的监控规则2.3.1 SSH 服务2.3.2 Apache 服务 3. 启动和管理 Fail2ban3.1 启动 Fail2ban 服务3.2 设置 Fail2ban 开机自启3.3 检查 Fail2ban 服务状态3.4 重新…...
Django系列教程(8)——函数视图及通用类视图
目录 什么是视图(View)及其工作原理 接近现实的函数视图 更复杂的案例: 视图处理用户提交的数据 基于函数的视图和基于类的视图 Django通用类视图 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小结 Django的视图(view)是处理…...
【C#学习笔记04】C语言格式化输出
引言 printf()函数不仅可以将数据输出到控制台,还可以通过格式化字符串灵活地控制输出的格式。printf()函数的使用规则,包括标志说明、字段宽度、转换精度、长度修饰、转换说明、转义字符。 1. printf()函数概述 printf…...
九点标定和十二点标定的区别
九点标定和十二点标定是机器视觉中常用的两种手眼标定方法,用于建立图像坐标系与机械坐标系之间的映射关系。它们的核心区别在于标定点的数量、变换模型和适用场景。以下是详细对比: 1. 九点标定 特点 标定点数量:9 个点,通常排…...
qt+opengl 播放yuv视频
一、实现效果 二、pro文件 Qt widgets opengl 三、主要代码 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…...
【揭秘测绘艺术】从基础到法律,绘制地球的智慧蓝图
在人类探索与塑造世界的征途中,有一门古老而又现代的科学默默发挥着基石作用——测绘。它不仅仅是地图的绘制,更是对地球空间信息的精准捕捉与智慧应用。今天,让我们一起走进测绘的世界,解码“测绘”与“基础测绘”的内涵…...
基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战
一、引言 当前,工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网,当大模型开始设计蛋白质结构,这个驱动大国重器研发的核心领域,却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…...
NetAssist 5.0.14网络助手基础使用及自动应答使用方案
以下是NetAssist v5.0.14自动应答功能的详细使用步骤: 一、基础准备: 工具下载网址页面:https://www.cmsoft.cn/resource/102.html 下载安装好后,根据需要可以创建多个server,双击程序图标运行即可,下面…...
MySQL中有哪几种锁?
大家好,我是锋哥。今天分享关于【MySQL中有哪几种锁?】面试题。希望对大家有帮助; MySQL中有哪几种锁? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中,锁是用来控制并发访问的机制,确…...
vue2的webpack(vue.config.js) 怎么使用请求转发 devServer.proxy
首先用 express 搭建后端服务器,注意使用中间件解析json格式的请求体,才会获取到 post 参数 app.use(express.json()); app.js const express require(express) const app express() app.use(express.json()); const port 3000app.post(/api/vue2, …...
【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search
大语言模型(LLMs)在处理复杂推理和实时信息检索时面临两大挑战:知识局限性(无法获取最新外部知识)和检索灵活性不足(传统方法依赖固定检索流程)。现有方法如检索增强生成(RAG)和工具调用(Tool-Use)存在以下问题: RAG:单轮检索导致上下文不足,无法适应多轮交互场景…...
CSS中固定定位
1.如何设置为固定定位? 给元素设置position: fixed 即可实现固定定位. 可以使用left, right, top ,bottom 四个属性调整位置 2.固定定位的参考点在哪里? 参考他的视口 视口-->对于PC浏览器来说,视口就是我们看网页的那扇"窗户". 3.固定定位元素的特点 1.脱离文档…...
Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南
高效实现:强调代码的性能优化。Android ViewPager2:明确技术栈。顶部导航:核心功能点。动态配置与性能优化指南:突出动态配置的灵活性和性能优化的重点。 在 Android 开发中,使用 ViewPager2 实现高效的顶部导航&…...
MFCday01、模式对话框
对话框类和应用程序类。 MFC中 Combo Box List Box List Control三种列表控件,日期控件Date Time Picker...
C++ 布尔类型(bool)深度解析
引言 在 C 编程里,布尔类型(bool)是一种基础且极为关键的数据类型。它专门用于表达逻辑值,在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来,我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...
新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架
图片来自于官方README.md 一、什么是OpenAI Agents SDK? OpenAI Agents SDK是一个轻量级但功能强大的框架,专为构建多智能体工作流而设计。作为OpenAI之前实验项目Swarm的生产级升级版本,该SDK提供了极少但高效的抽象概念,使开发…...
单例模式的五种实现方式
1、饿汉式 ①实现:在类加载的时候就初始化实例 ②优点:线程安全 ③缺点:实例在类加载的时候创建,可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...
行为模式---状态模式
概念 状态模式是一种行为模式,用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类,并将其行为委托给当前的状态对象,从而使得对象行为随着状态…...
统一 Elastic 向量数据库与 LLM 功能,实现智能查询
作者:来自 Elastic Sunile Manjee 利用 LLM 功能进行查询解析,并使用 Elasticsearch 搜索模板,将复杂的用户请求转换为结构化的、基于模式的搜索,从而实现高精度查询结果。 想象一下,你在搜索“距离 Belongil Beach 25…...
(Lauterbach调试器学习笔记)一、首次连接TriCore开发板调试
Lauterbach调试器学习笔记 文章目录 Lauterbach调试器学习笔记前言一、Lauterbach调试器介绍二、调试步骤三、常用代码四、不常用代码,但是很有意思总结 前言 第一篇简单记录一下Lauterbach调试器的使用过程,主要是想写第二篇python api。 一、Lauterba…...
HTML星球大冒险之路线图
第一章:欢迎来到 HTML 星球! 1.1 宇宙的基石:HTML 是什么? 🌍 比喻:HTML 是网页世界的「乐高积木」,用标签搭建一切可见内容🎯 目标:理解 HTML 的作用,掌握…...
网络安全与七层架构
网络安全与七层架构 随着互联网技术的迅猛发展,网络安全问题日益凸显。网络安全不仅影响到个人用户的信息安全,更是企业及国家安全的重要组成部分。而七层架构(OSI模型)为网络通信提供了理论支撑,能够有效地帮助我们理…...
2025-03-13 学习记录--C/C++-PTA 练习2-17 生成3的乘方表
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习2-17 生成3的乘方表 输入一个非负整数n,生成一张3的乘方表,输出3^0~$$3^n$$的值…...
改进YOLOv8系列,AAAI 2025,多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享
**论文:https://arxiv.org/pdf/2404.07846 **代码地址: https://github.com/nagejacob/TBSN/blob/main/network/tbsn.py 改进YOLOv8系列:多尺度特征提取自注意力模块,全局信息聚合,即插即用!分享 🚀论文研究概括🚀加入到网络中的理论研究🚀需要修改的代码1 🍀🍀…...
我又又又又又又更新了~~纯手工编写C++画图,有注释~~~
再再再次感谢Ttcofee提的问题 本次更新内容: 鼠标图案(切换),版本号获取,输入框复制剪切板 提前申明:如果运行不了,请到主页查看RedpandaDevc下载,若还是不行就卸了重装。 版本号&…...
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析 一、框架演变:从Vue2到Vue3的跨越 1.1 革命性升级 Vue3的发布标志着前端框架进入新纪元,其核心改进体现在三个方面: 性能飞跃:包体积减少41%,初始…...
评委打分5个评委 去掉一个最高分和一个最低分 取平均分
一键替换max用min 按shiftF6 public static int getMin(int[]scores){int min scores[0];for (int i 0; i < scores.length; i) {if(scores[i]> min){min scores[i];}}return min;} 这里有和c/c不一样的知识点 c/c调用函数类似于java的方法,但是c/c的函数调用需要声明…...
javabean类(测试类之外的类)
altinsert快捷键生成构造方法和get、set方法 或者插件ptg(连接外网搜索插件并且下载)...
C++ 邻接矩阵(代码)
C邻接矩阵代码,见下: #include<iostream>using namespace std;#define inf -1 class Graph{ private:int vertices;int **edges;public:Graph(int vertices);~Graph();void addEdge(int u, int v, int w);void printGraph(); };Graph::Graph(int …...
Cookie与Session详解
Cookie简介 Cookie 是浏览器提供的持久化存储数据的一种机制。是指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据(通常经过加密)。以下是关于 Cookie 的详细介绍: Cookie工作原理 当你访问一个网站时,该网…...
OpenBMC:BmcWeb 处理http请求
OpenBMC:BmcWeb 读取http请求头-CSDN博客 介绍了,在读取完http头后,将调用Connection::handle处理http请求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …...
【算法题解答·六】栈队列堆
【算法题解答六】栈队列堆 接上文【算法方法总结六】栈队列堆的一些技巧和注意事项 栈队列堆相关题目如下: 232.用栈实现队列 简单 准备两个栈,一个负责入队的栈A,一个负责出队的栈B出队和返回队列开头元素,都要先进行以下操作…...
计算机视觉算法实战——手势识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域简介:手势识别的价值与挑战 手势识别是连接人类自然行为与数字世界的核心交互技术,在智能设备控制、…...
JobScheduler省电机制
1.前言 JobScheduler(任务调度器)是 Android 提供的一种任务调度机制,可以替代传统的 WakeLock 和 Alarm 来执行后台任务。那么,它们之间的区别是什么?JobScheduler 又有哪些特别之处呢? 1.1 WakeLock 和 …...
设计模式学习笔记——命令模式
2025年3月13日,周四下午 相同的保存逻辑在各个组件中重复出现。 且需要修改保存逻辑时,各个组件的保存逻辑都需要进行相应修改。 使用了命令模式把保存逻辑从三个组件中独立出来后,减少了代码冗余。 可以通过“保存命令”来使用保存逻辑&am…...
[TPCTF 2025] crypto 复现两题
周末很忙。比赛都没怎么看。晚上把密码复现两个。 randomized random 这题在小鸡块博客里见过,稍有区别。 # FROM python:3 import random with open("flag.txt","rb") as f:flagf.read() for i in range(2**64):print(random.getrandbits(3…...
电子元器件选型与实战应用—16 怎么选一个合适的MCU芯片?
文章目录 1. 选型要素1.1 价格1.2 技术支持1.3 厂家优势1.4 功耗1.5 特殊功能1.6 统计外设1.7 确定外设占用的内存和flash大小1.8 确定外设通信接口1.9 确定外设通信接口的电平1.10 确定外设的GPIO数量1.11 确定外设的供电和功耗1.12 确定外设GPIO的种类1.13 确定ADC的数量1.14…...
第6关:牛牛鱼缸-附加题
任务描述 本关任务:问题描述:牛牛有一个鱼缸,鱼缸里面已经有n条鱼,每条鱼的大小为fishSizei,牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸里存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼…...
go中间件学习
本博文源于笔者正在学习go中间件,罗列了较为常用的中间件,例如日志记录、认证授权、跨域资源共享、请求体解析、静态文件处理、错误处理、性能分析、速率限制、session 1、日志记录中间件 可以追加打印用,例如,将请求进行打印 …...
若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署
一.目标 在浏览器上成功登录进入 二.源码下载 后端源码:前往Gitee下载页面(https://gitee.com/dromara/RuoYi-Cloud-Plus)下载解压到工作目录。 前端源码: 前往Gitee下载页面(https://gitee.com/JavaLionLi/plus-ui)下载解压到工作目录。 文档地址&a…...
航空电动力系统适航标准要点手册
航空电动力系统适航标准要点手册 1.标准制定背景与必要性1.1 为什么需要制定和遵循标准?1.2 标准制定依据与发布机构 2.关键核心标准概述2.1 电动航空与电推进系统2.2 混合动力系统2.3 硬件与通用要求 3.标准详细解读与应用场景3.1 DO-160G:环境适应性测…...