使用QEMU搭建U-Boot+LinuxKernel+busybox+NFS嵌入式开发环境

news2024/9/21 17:22:50

目录

  • 0.课程大纲
  • 1.为什么要使用QEMU学习嵌入式
    • QEMU简介
    • 使用QEMU可以做哪些事情?
    • 当前嵌入式行业现状
    • 如何适应这种变化
    • 使用QEMU学习嵌入式有哪些好处?
    • 驱动开发技能
    • 为什么要学习Linux
  • 2.搭建嵌入式开发基本环境
    • 2.1.安装u-boot-tools
    • 2.2.安装交叉编译工具
      • 什么是ABI和EABI
  • 3.QEMU安装及仿真开发板介绍
    • 自动安装
    • 手动编译安装
    • QEMU使用
    • ARM express 开发板简介
      • Vexpress系列开发板
      • Vexpress系列支持的CPU
      • 嵌入式最小系统
    • QEMU运行系统
  • 4.编译Linux内核和dtb文件
    • 4.1.下载Linux内核
    • 4.2.修改Makefile
    • 4.3.编译内核,模块,dtb文件
  • 5.使用Busybox制作根文件系统
    • 5.1.什么是根文件系统?
      • 5.1.1.文件系统
      • 5.1.2.为什么要使用文件系统
      • 5.1.3.根文件系统
    • 5.2.使用busybox制作根文件系统
      • 5.2.1.什么是busybox
      • 5.2.2.编译安装
      • 5.2.3.制作根文件系统
      • 5.2.4.制作SD卡文件系统镜像
  • 6.使用u-boot引导启动Linux内核
    • 6.1.嵌入式启动概述
      • 6.1.1.嵌入式bootloader
      • 6.1.2.常见的启动方式
    • 6.2.u-boot编译
    • 6.3.QEMU网络功能设置
      • 6.3.1.配置QEMU与主机的网络连接
      • 6.3.2.配置
    • 6.4.内核配置编译
      • 6.4.1.使用u-boot引导内核镜像
    • 6.5.主机TFTP工具安装
    • 6.6.启动测试
    • 6.7.自动化引导
  • 参考资料

0.课程大纲

  1. 为什么要使用QEMU学习嵌入式
  2. 搭建嵌入式开发基本环境
  3. QEMU安装及A9开发板配置介绍
  4. 编译,运行Linux内核
  5. 使用Busybox制作根文件系统
  6. 使用u-boot引导启动Linux内核
  7. 挂载NFS文件系统
  8. 在虚拟开发板上开发应用程序,驱动

1.为什么要使用QEMU学习嵌入式

QEMU简介

  • QEMU是一个模拟器,可以模拟CPU,ARM,X86,MIPS等架构
  • 可以仿真的ARM处理器:ARM926E,ARM1136,Cortex-A8/A9
  • 模拟真实的开发板,外设:串口,LCD,网卡,USB,SD卡…

使用QEMU可以做哪些事情?

  • 研究内核虚拟化
  • 模拟CPU,对于芯片公司,流片之前在QEMU上做验证,仿真,软硬件协同设计,开发BSP和驱动
  • 模拟开发板,在模拟平台上进行系统软件开发,驱动开发
  • 学生,工程师可以利用qemu-system-arm学习嵌入式开发,研究Bootloader,Linux内核,驱动开发,应用开发等.

当前嵌入式行业现状

  • CPU厂家越来越多,各种开发板层出不穷
  • 物联网芯片,AI芯片…
  • SOC越来越集成化,软硬件分工越来越明显

如何适应这种变化

  • 分工
  • 精专
  • 嵌入式80%的知识系统和技能,都可以脱离"开发板",在QEMU仿真平台上学习和练习

使用QEMU学习嵌入式有哪些好处?

  • 节省学习成本
  • 跳过开发板,硬件的各种"坑",缩短学习曲线
  • 重构嵌入式知识体系和技能,跟硬件无关的放到QEMU上学习
  • 跟开发板相关的驱动,BSP针对具体开发板深入突破
  • 适应不同CPU,开发板的技术要求

驱动开发技能

  • 基本的硬件知识
  • Linux内核,系统架构的理解
  • 芯片手册,开发板

为什么要学习Linux

  • 开源,免费

  • 持续更新,强大的BSP支持

  • Android,YunOS,Tizen,ubuntu等操作系统的内核

  • 应用领域广:嵌入式,服务器,桌面PC,云…

  • 示例

2.搭建嵌入式开发基本环境

2.1.安装u-boot-tools

  • 用来生成适应U-boot引导的镜像文件格式
sudo apt install -y u-boot-tools

2.2.安装交叉编译工具

什么是ABI和EABI

  • ABI:二进制应用程序接口(Application Binary Interface(ABI) for the ARM Architecture),在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口,涵盖了数据类型的大小,布局和对齐,调用约定.
  • EABI:嵌入式ABI 嵌入式应用二进制接口指定了文件格式,数据类型,寄存器使用,堆积组织优化和在一个嵌入式软件中的参数的标准约定.
  • Arm-none-gnueabi-linux比arm-linux-gcc要好,在可一致性,兼容性上面
  • 早期u-boot和Linux编译可能使用的都不是一个arm-linux-gcc版本
sudo apt install -y gcc-arm-linux-gnueabi
sudo apt install -y g++-arm-linux-gnueabi
#区别
gcc-arm-linux-gnueabi    
gcc-arm-linux-gnueabihf
gcc-arm-none-eabi
arm-linux-gnueabi-gcc -v
arm-linux-gnueabi-gcc -o hello main.c
readelf -h hello

3.QEMU安装及仿真开发板介绍

自动安装

# For full system emulation
sudo apt install qemu-system

#For emulating Linux binaries
sudo apt install qemu-user-static

手动编译安装

https://www.qemu.org/
https://wiki.qemu.org/Hosts/Linux

git clone https://gitlab.com/qemu-project/qemu.git
git checkout remotes/origin/stable-8.2 -b stable-8.2

sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build

sudo apt-get install git-email
sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-dev
sudo apt-get install libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt-get install librbd-dev librdmacm-dev
sudo apt-get install libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh-dev
sudo apt-get install libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev
sudo apt-get install valgrind xfslibs-dev 

sudo apt-get install libnfs-dev libiscsi-dev

./configure --target-list=arm-softmmu --audio-drv-list=
make 
sudo make install

QEMU使用

qemu-system-arm --version

#查看支持的开发板
qemu-system-arm -M help
#vexpress-a9

ARM express 开发板简介

Vexpress系列开发板

  • 全称versatile express family, ARM公司自己推出的开发板
  • 主要用于SOC厂商设计,验证和测试自己的SOC芯片
  • 采用主板+子板设计,主板提供各种外围接口,子板提供CPU运算

Vexpress系列支持的CPU

  • Cortex-A9: 处理器子板 Express A9x4 (V2P-CA9x4)
  • Cortex-A5: 处理器子板 Express A5x2 (V2P-CA5x2s)
  • Cortex-R5:
  • Cortex-A15: 处理器子板 Express A15x2 (V2P-CA15x2)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
DDR
外围
DUI0448I_v2p_ca9_trm.pdf

嵌入式最小系统

CPU+DDR/SDRAM
FLASH/SD
串口+LCD

QEMU运行系统

#-M vexpress-a : 指定具体开发板
#-m 512M : 指定内存大小
#-kernel ./zImage : 指定内核
#-dtb ./vexpress-v2p-ca9.dtb : 指定设备树
#-nographic : 不使用图像界面
#-append "console=ttyAMA0" : 指定串口控制台
qemu-system-arm -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

4.编译Linux内核和dtb文件

4.1.下载Linux内核

https://www.kernel.org/
longterm

4.2.修改Makefile

vim Makefile
ARCH        ?= arm
CROSS_COMPILE ?=arm-linux-gnueabi-

4.3.编译内核,模块,dtb文件

make vexpress_defconfig
make zImage
make modules
make dtbs

5.使用Busybox制作根文件系统

5.1.什么是根文件系统?

5.1.1.文件系统

对存储设备上的数据进行组织的机制

5.1.2.为什么要使用文件系统

  • Linux的哲学: 一切皆文件
  • 用户与操作系统进行交互的主要工具: 文件系统调用
  • 用户和底层存储的接口

5.1.3.根文件系统

  • Linux内核启动后第一个挂载的文件系统
  • 主要由基本的shell命令,各种库,字符设备,配置脚本组成
  • 提供了根目录/
  • RFS可以放在: nor/nand flash, SD卡, 磁盘, 网络空间上

5.2.使用busybox制作根文件系统

5.2.1.什么是busybox

  • 一个集成100多个Linux常用命令和工具的软件
  • 一个适合制作嵌入式文件系统的软件工具

5.2.2.编译安装

#1.下载源代码
https://busybox.net/
#2.修改Makefile
ARCH ?= arm
CROSS_COMPILE ?=arm-linux-gnueabi-
#3.配置
make defconfig
make menuconfig
 Settings  --->  [*] Build static binary (no shared libs)
#4.编译
make -j2
#5.安装
make install
#安装生成目录"_install"

5.2.3.制作根文件系统

mkdir rootfs
cd rootfs/
mkdir lib
cp -avf busybox-1.36.1/_install/* rootfs/
cp -avf /usr/arm-linux-gnueabi/lib/* rootfs/lib/
mkdir dev
cd dev/

#mknod: 创建块或字符设备节点
#-m 666: 权限读写
#tty1: 节点名称
#c: 字符设备
#4: 主设备号
#1: 次设备号
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4

sudo mknod -m 666 console c 5 1

sudo mknod -m 666 null c 1 3

5.2.4.制作SD卡文件系统镜像

#1.生成镜像
#bs: 缓冲区块的大小
#count: 块的个数
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
#2.格式化为ext3文件系统
mkfs.ext3 rootfs.ext3
#3.将各种文件copy到文件系统镜像中
sudo mount -t ext3 rootfs.ext3 /mnt -o loop
sudo cp -avf rootfs/* /mnt
sudo umount /mnt

6.使用u-boot引导启动Linux内核

6.1.嵌入式启动概述

6.1.1.嵌入式bootloader

  • 功能类似于PC的BIOS,硬件检测是否正常
  • 加载操作系统镜像到RAM
  • 设置不同的启动方式

6.1.2.常见的启动方式

  • NOR/NAND FLASH启动
  • 从SD卡启动
  • Bootloader从网络加载Linux内核启动

6.2.u-boot编译

#1.下载u-boot
git clone https://gitee.com/naonano/u-boot.git
git checkout --track origin/u-boot-2023.07.y

#2.修改 Makefile
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE ?=
endif
CROSS_COMPILE ?=arm-linux-gnueabi-

#3.修改 config.mk
#ARCH := $(CONFIG_SYS_ARCH:"%"=%)
ARCH := arm

#4.配置
make vexpress_ca9x4_defconfig

#5.编译
make -j2

#6.运行u-boot
qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel ../test/u-boot/u-boot

6.3.QEMU网络功能设置

6.3.1.配置QEMU与主机的网络连接

  • 采用桥接(bridge)的网络连接与Host通信
  • 需要主机内核tun/tap模块支持

6.3.2.配置

参考:ubuntu 22.04 设置网桥 - netplan

#1.主机安装工具包
sudo apt install -y uml-utilities bridge-utils
#2.创建tun设备文件
ls -al /dev/net/tun
#3.编辑文件
sudo touch /etc/netplan/br0.yaml
#使用ipv4 dhcp

ipv4 dhcp:

network:
  version: 2
  ethernets:
    enp0s8: #替换为实际网卡
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      interfaces: [enp0s8] #替换为实际网卡
      dhcp4: true
      parameters:
        stp: false
      dhcp6: false

ipv4 静态分配:

network:
  version: 2
  ethernets:
    enp0s8:#替换为实际网卡
      dhcp4: false
      dhcp6: false
  bridges:
    br0:
      interfaces: [enp0s8] #替换为实际网卡
      dhcp4: false
      addresses: [192.168.1.250/24]
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [114.114.114.114]
      parameters:
        stp: false
      dhcp6: true
sudo netplan apply

ifconfig

br0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

        inet 192.168.1.25  netmask 255.255.255.0  broadcast 192.168.1.255

        inet6 fe80::3027:2dff:fe41:8595  prefixlen 64  scopeid 0x20<link>

        ether 32:27:2d:41:85:95  txqueuelen 1000  (Ethernet)

        RX packets 55  bytes 9272 (9.2 KB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 89  bytes 12062 (12.0 KB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.1.3  netmask 255.255.255.0  broadcast 192.168.1.255

        inet6 fe80::c8ff:ec6f:253e:ad4e  prefixlen 64  scopeid 0x20<link>

        inet6 2409:8a1e:d52:a9b0:39df:8d80:83d3:9e  prefixlen 64  scopeid 0x0<global>

        inet6 2409:8a1e:d52:a9b0:3292:9a45:5481:28ad  prefixlen 64  scopeid 0x0<global>

        ether 08:00:27:05:ef:4f  txqueuelen 1000  (Ethernet)

        RX packets 962  bytes 156528 (156.5 KB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 836  bytes 88212 (88.2 KB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0



lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

        inet 127.0.0.1  netmask 255.0.0.0

        inet6 ::1  prefixlen 128  scopeid 0x10<host>

        loop  txqueuelen 1000  (Local Loopback)

        RX packets 318  bytes 29095 (29.0 KB)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 318  bytes 29095 (29.0 KB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


6.4.内核配置编译

6.4.1.使用u-boot引导内核镜像

#需要将内核编译为uImage格式
#需要指定uImage的加载地址
#编译时指定: 
make LOADADDR=0x60003000 uImage -j2

6.5.主机TFTP工具安装

#1.安装
sudo apt-get install -y tftpd-hpa tftp-hpa xinetd
#2.配置ftp服务器工作目录为"/home/tftp"
sudo vim /etc/default/tftpd-hpa
	TFTP_USERNAME="tftp"
	TFTP_DIRECTORY="/home/tftp"
	TFTP_ADDRESS=":69"
	TFTP_OPTIONS="-l -c -s"
#3.建立目录
sudo mkdir -p /home/tftp
sudo chown lei:lei /home/tftp
chmod 777 -R /home/tftp
#4.启动服务
sudo service tftpd-hpa restart
#5.测试
#5.1测试下载
cd /home/tftp/
touch readme.txt
#在readme.txt中输入一些内容
#运行开发板,进入控制台
tftp -g -r readme.txt 192.168.10.107
#可以看出在开发板当前目录下下载了readme.txt
#5.2测试上传
#在开发板上,进入控制台运行命令
tftp -p -l uvc_app 192.168.10.107
#uvc_app为开发板当前目录下的文件
#在ubuntu上可以看到开发板上传上来的文件uvc_app

6.6.启动测试

#1.复制u-boot镜像到tftp服务器目录下
cp /home/qemu/test/u-boot/u-boot /home/tftp/
#2.复制uImage镜像到tftp服务器目录下
cp /home/qemu/test/linux-6.6.18/arch/arm/boot/uImage /home/tftp/
#3.复制设备树二进制编译结果到tftp服务器目录下
cp /home/qemu/test/linux-6.6.18/arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb /home/tftp/
#4.uboot引导kernel启动
qemu-system-arm \
    -M vexpress-a9 \
    -m 512M \
    -nographic \
    -kernel /home/tftp/u-boot \
    -net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
    -sd /home/qemu/test/rootfs.ext3

6.7.自动化引导

u-boot/include/configs/vexpress_common.h

#define CONFIG_BOOTCOMMAND \
	"tftp 0x60003000 uImage; tftp 0x60500000 vexpress-v2p-ca9.dtb; \
	setenv bootargs 'root=/dev/mmcblk0 console=ttyAMA0'; \
	bootm 0x60003000 - 0x60500000; "

#define CONFIG_IPADDR 192.168.244.128
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.244.129

参考资料

B站

QEMU系列文章: https://blog.csdn.net/phmatthaus/category_12072874.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484513.html

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

相关文章

MySQL:开始深入其数据(一)DML

在上一章初识MySQL了解了如何定义数据库和数据表&#xff08;DDL&#xff09;&#xff0c;接下来我们开始开始深入其数据,对其数据进行访问&#xff08;DAL&#xff09;、查询DQL&#xff08;&#xff09;和操作(DML)等。 通过DML语句操作管理数据库数据 DML (数据操作语言) …

第17章-文件传输协议

1. 概述 2. FTP协议 2.1 定义 2.2 端口 2.3 数据传输方式 2.4 文件传输模式 3. TFTP协议 3.1 定义&#xff1a; 4. 常用命令 1. 概述 场景&#xff1a;远端主机和本地服务器 2. FTP协议 2.1 定义 FTP(File Transfer Protocol)&#xff1a;文件传输协议&#xff1b;…

DataX及Datax-web杂记

&#x1f47d;个人博客&#xff1a;https://everspring.github.io/ &#x1f47d;公众号&#xff1a;爱历史的IT男 一. DataX调试 DataX之前调试不是很方便&#xff0c;要打包后才能调试。23年7月后一位叫"FuYouJ "的开源者提交了datax-example模块&#xff0c;就方…

GO-接口

1. 接口 在Go语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型。 interface是一组method的集合&#xff0c;接口做的事情就像是定义一个协议&#xff08;规则&#xff09;&#xff0c;只要一台机器有洗衣服和甩干的功能&#xff0c;我就称它…

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的&#xff1f; 2.3、如何使用 Protoc 生成代码&#xff1f; 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…

事件循环相关知识

事件循环 浏览器的进程模型 何为进程 程序运行需要有专属的内存空间&#xff0c;可以吧这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信也需要双方同意 何为线程 有了进程就可以运行代码 运行代码的人称为线程 一…

RISC-V特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret&#xff08;从机器模式返回到先前的模式&#xff09;2.2 sret&#xff08;从监管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中断&#xff09;2.4 sfence.vma&#xff08;内存屏障&#xff09; …

beets,一个有趣的 Python 音乐信息管理工具!

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Beet库&#xff1f; 安装Beet库 使用Beet库 Beet库的功能特性 1. 多种音乐格式支持 2. 自动标签识…

Golang embed 库全面解析:从基础到高级应用

Golang embed 库全面解析&#xff1a;从基础到高级应用 引言Golang的 embed&#xff1a;简化资源管理提升可移植性与便利性适用场景的拓展 embed 库的基本概念embed 库的工作原理使用 embed 的基本语法访问嵌入资源的方法embed 的限制 如何使用 embed嵌入单个文件嵌入整个目录结…

JMeter实现接口自动化测试

一、JMETER的环境搭建 参考&#xff1a;https://www.cnblogs.com/qmfsun/p/4902534.html 二、JMETER的汉化 临时汉化方法&#xff1a;打开jmeter&#xff0c;options-->choose language-->选择语言 可以根据自己的需要选择简体中文或者繁体中文&#xff0c;如图&#xf…

力扣180 连续出现的数字

如何有效地识别在数据库中至少连续出现三次的数字&#xff1f; 目录 题目描述 解题思路 完整代码 进一步探索 题目描述 表&#xff1a;Logs ---------------------- | Column Name | Type | ---------------------- | id | int | | num | varch…

13 双口 RAM IP 核

双口 RAM IP 核简介 双口 RAM IP 核有两个端口&#xff0c;它又分为伪双端口 RAM 和真双端口 RAM&#xff0c;伪双端口 RAM 一个端口只能读&#xff0c;另一个端口只能 写&#xff0c;真双端口 RAM 两个端口都可以进行读写操作。同时对存储器进行读写操作时就会用到双端口 RAM…

1、swagger knife4j 3.0.3 集成 springboot

这里写目录标题 一、项目版本二、增加 knife4j maven 依赖三、增加项目配置类四、配置文件增加登录密码五 、访问文档地址 一、项目版本 springboot &#xff1a;2.6.7 swagger&#xff1a;knife4j-spring-boot-starter &#xff1a;3.3.0 二、增加 knife4j maven 依赖 <…

Linux系统源代码数据防泄密加密软件

数据防泄密系统 是一套从源头上保障数据安全和使用安全的软件系统。包含了文件透明加解密、内部文件流转功能、密级管控、离线管理、文件外发管理、灵活的审批流程、工作模式切换、服务器白名单等功能。从根本上严防信息外泄&#xff0c;保障信息安全。 www.weaem.com 功能介绍…

【k8s管理--集群日志管理elk】

1、ELKF日志部署框架 使用docker部署的k8s集群所有的容器日志统一都在目录&#xff1a;/var/log/containers/1、filebeat是一个轻量级的日志手机工具&#xff0c;主要功能是收集日志2、logstash通可以收集日志&#xff0c;也可以进行数据清洗&#xff0c;但是一般不用logstash来…

C++ Algorithm Tutorial (1)

中文版 c算法入门教程(1)_c怎么学习算法-CSDN博客 Cis a powerful and widely used programming language, and for those who want to delve deeper into programming and algorithms, mastering Cis an important milestone. This article will take you step by step to und…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术&#xff0c;优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后&#xff0c;若出现…

微服务day03-Nacos配置管理与Nacos集群搭建

一.Nacos配置管理 Nacos不仅可以作为注册中心&#xff0c;可以进行配置管理 1.1 统一配置管理 统一配置管理可以实现配置的热更新&#xff08;即不用重启当服务发生变更时也可以直接更新&#xff09; dataId格式&#xff1a;服务名-环境名.yaml&#xff0c;分组一般使用默认…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的番茄成熟度检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发番茄成熟度检测系统对于提高农业产量和食品加工效率具有重大意义。本篇博客详细介绍了如何利用深度学习构建一个番茄成熟度检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YOLOv6、YOLOv5的对比&…

【机器学习】CIFAR-10数据集简介、下载方法(自动)

【机器学习】CIFAR-10数据集简介、下载方法(自动) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订阅和支…