uboot操作指令1

文章目录

  • 前言
  • 一、信息查询命令
    • 1.bdinfo用于查看板子的信息
    • 2.printenv 打印环境变量
    • 3.version查看uboot版本
  • 二、环境变量操作命令
    • 1.setenv修改环境变量
    • 2.setenv新建环境变量
    • 3.setenv删除环境变量
  • 三、内存操作命令
    • 1.md 命令
    • 2.nm命令
    • 3.mm命令
    • 4.mw命令
  • 四、网络操作命令
    • 1.ping命令
    • 2.dhcp 命令
    • 3.nfs 命令-数据下载到DRAM
    • 4.ftp 命令-数据下载到DRAM
  • 五、EMMC 和 SD 卡操作命令
    • 1.mmc info 命令
    • 2.mmc list 命令
    • 3.mmc dev 命令
    • 4.mmc part 命令
    • 5.mmc read 命令-将MMC数据读到DRAM中
    • 6.mmc write 命令-将DRAM数据写入MMC设备
    • 7.SD卡分区介绍-补充
    • 8.mmc erase 命令


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、信息查询命令

💦 常用的信息查询有关的命令有 3 个:

1.bdinfo用于查看板子的信息

bdinfo

2.printenv 打印环境变量

在这里插入图片描述

3.version查看uboot版本

在这里插入图片描述

二、环境变量操作命令

1.setenv修改环境变量

💦 环境变量的操作涉及到两个命令:setenv 和 saveenv,命令 setenv 用于设置或者修改环境变量的值。
💦 命令 saveenv 用于保存修改后的环境变量。
💦 注意:一般环境变量是存放在外部 flash 中的,当uboot 启动的时候会将环境变量从 flash 读取到 DRAM 中。所以使用命令 setenv 修改的是 DRAM中的环境变量值,修改以后要使用 saveenv 命令将修改后的环境变量保存到 flash 中,否则的话uboot 下一次重启会继续使用以前的环境变量值。
指令实例:将bootdelay由3秒修改成5秒

setenv bootdelay 5
saveenv

💦 因为uboot中的环境变量都是字符串,在我们修改的环境变量可能会有多个值并且相互之间会有空格,比如 bootcmd、bootargs 等,这个时候环境变量值就得用单引号括起来,比如下面修改环境变量 bootargs 的值。

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

💦 解析:
上面命令设置 bootargs 的值为“console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw”,
其中“console=ttymxc0,115200”、“root=/dev/mmcblk1p2”、“rootwait”和“rw”相当于四组“值”,
这四组“值”之间用空格隔开,所以需要使用单引号‘…’将其括起来,表示这四组“值”都属
于环境变量 bootargs。
注意:当使用saveenv的时候,会提示保存在哪里(EMMC,SD卡等外边flash)
在这里插入图片描述

2.setenv新建环境变量

💦 命令 setenv 也可以用于新建命令,用法和修改环境变量一样,比如我们新建一个环境变量text,text的值为1,那么就可以使用如下命令:
在这里插入图片描述
💦 结果:
在这里插入图片描述

3.setenv删除环境变量

💦 删除环境变量也是使用命令 setenv,要删除一个环境变量只要给这个环境变量赋空值即可,比如我们删除text这个环境变量,命令如下:

setenv text
saveenv

三、内存操作命令

💦 内存操作命令就是用于直接对 DRAM 进行读写操作的,常用的内存操作命令有 md、nm、
mm、mw、cp 和 cmp。

1.md 命令

💦 md 命令用于显示内存值,格式如下:

md[.b, .w, .l] address [# of objects]

💦 命令中的[.b .w .l]对应 byte、word 和 long,也就是分别以 1 个字节、2 个字节、4 个字节
来显示内存值。address 就是要查看的内存起始地址,[# of objects]表示要查看的数据长度,这个数据长度单位不是字节,而是跟你所选择的显示格式有关。比如你设置要查看的内存长度为20(十六进制为 0x14),如果显示格式为.b 的话那就表示 20 个字节;如果显示格式为.w 的话就表示 20 个 word,也就是 202=40 个字节;如果显示格式为.l 的话就表示 20 个 long,也就是204=80 个字节。另外要注意:
💦 注意:uboot 命令中的数字都是十六进制的!不是十进制的!
在这里插入图片描述

2.nm命令

💦 nm 命令用于修改指定地址的内存值,命令格式如下:

nm [.b, .w, .l] address

💦 nm 命令同样可以以.b、.w 和.l 来指定操作格式.
💦 举例说明:比如现在以.l 格式修改 0x80000000 地址的数据为 0x12345678
在这里插入图片描述
💦 第一个“?”后面跟要修改的内容,输入完成后按下回车键,第二后面输入q退出。
使用md命令查看是否修改成功。

3.mm命令

💦 mm 命令也是修改指定地址内存值的,使用 mm 修改内存值的时候地址会自增,而使用命令 nm 的话地址不会自增。
💦 举例说明:
以.l 格式修改从地址 0x80000000 开始的连续 3 个内存块(3*4=12个字节)的数据为0X12345678,使用md命令查看结果如下。
在这里插入图片描述

4.mw命令

💦命令 mw 用于使用一个指定的数据填充一段内存,命令格式如下

mw [.b, .w, .l] address value [count]

💦mw 命令同样可以以.b、.w 和.l 来指定操作格式,address 表示要填充的内存起始地址,value为要填充的数据,count 是填充的长度。
💦举例说明:比如使用.l 格式将以 0X80000000 为起始地址的 0x10 个内存块(0x10 * 4=64 字节)填充为 0X01010101,命令如下

mw.l 80000000 01010101 10

在这里插入图片描述

四、网络操作命令

💦uboot 是支持网络的,在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux 的时候需要使用到 uboot 的网络功能做调试。
💦u在uboot中与网络相关的环境变量如下:
在这里插入图片描述

setenv ipaddr 192.168.1.50
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.255
saveenv

💦注意:网络地址环境变量的设置要根据自己的实际情况,确保== Ubuntu 主机和开发板的 IP地址在同一个网段内==,比如我现在的开发板和电脑都在 192.168.1.0 这个网段内,所以设置开发板的 IP 地址为 192.168.1.50,我的 Ubuntu 主机的地址为 192.168.1.20,因此 serverip 就是192.168.1.20。ethaddr 为网络 MAC 地址,是一个 48bit 的地址,如果在同一个网段内有多个设备的话一定要保证每个开发板的 ethaddr 是不同的,否则通信会有问题。

1.ping命令

💦Ubuntu系统的IP为192.168.1.20
在这里插入图片描述
💦alive状态可以看出192.168.1.20这个主机存在,说明 ping 成功,uboot 的网络工作正
常。
💦注意:只能在 uboot 中 ping 其他的机器,其他机器不能 ping uboot,因为 uboot 没有对 ping命令做处理,如果用其他的机器 ping uboot 的话会失败!

2.dhcp 命令

💦dhcp 用于从路由器获取 IP 地址,前提得开发板连接到路由器上的,如果开发板是和电脑直连的,那么 dhcp 命令就会失效。直接输入 dhcp 命令即可通过路由器获取到 IP 地址。
在这里插入图片描述

3.nfs 命令-数据下载到DRAM

💦nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,
比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是Linux 开发中最常用的调试方法。
💦原因是如下:
💦嵌入式 linux开发不像单片机开发,可以直接通过 JLINK 或 STLink 等仿真器将代码直接烧写到单片机内部的 flash 中,嵌入式 Linux 通常是烧写到 EMMC、NAND Flash、SPI Flash 等外置 flash 中,但是嵌入式 Linux 开发也没有 MDK,IAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDK、IAR的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的== linux 镜像和设备树文件下载到 DRAM 中==,然后就可以直接运行。
操作方法:
💦我们一般使用 uboot 中的== nfs 命令将 Ubuntu 中的文件下载到开发板的 DRAM 中==,在使用之前需要开启 Ubuntu 主机的 NFS 服务,并且要新建一个 NFS 使用的目录,以后所有要通过NFS 访问的文件都需要放到这个 NFS 目录中。
在这里插入图片描述
💦格式如下:

nfs [loadAddress] [[hostIPaddr:]bootfilename]

💦loadAddress 是要保存的 DRAM 地址,[[hostIPaddr:]bootfilename]是要下载的文件地址,这
里我们将正点原子官方编译出来的 Linux 镜像文件 zImage 下载到开发板 DRAM 的 0x80800000这个地址处。
💦准备好以后就可以使用 nfs 命令来将 zImage 下载到开发板 DRAM 的 0X80800000 地址处,命令如下:

nfs 80800000 192.168.1.20:/home/che/linux/nfs/zImage

在这里插入图片描述
💦注意:如果nfs使用报错,请查看博主另外一个文章,已经帮助各位踩过坑了。

4.ftp 命令-数据下载到DRAM

💦步骤:
在这里插入图片描述
💦创建tfpt文件夹
在这里插入图片描述
💦修改文件夹权限
在这里插入图片描述
💦配置 tftp,安装完成以后新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行 创建,然后在里面输入如下内容:
在这里插入图片描述
在这里插入图片描述
💦tftp文件内容:
在这里插入图片描述

💦打开/etc/default/tftpd-hpa 文件
在这里插入图片描述
💦TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后我们就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限。
💦最后重启服务

sudo service tftpd-hpa start

💦uboot 中的 tftp 命令格式如下:

tftpboot [loadAddress] [[hostIPaddr:]bootfilename]

💦看 起来 和 nfs 命令格 式一 样的 , loadAddress 是文 件在 DRAM 中的 存放 地址 ,[[hostIPaddr:]bootfilename]是要从 Ubuntu 中下载的文件。但是和 nfs 命令的区别在于,tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可。比如我们现在将 tftpboot 文件夹里面的 zImage 文件下载到开发板 DRAM 的 0X80800000 地址处,命令如下:

tftp 80800000 zImage

在这里插入图片描述

五、EMMC 和 SD 卡操作命令

💦uboot 支持 EMMC 和 SD 卡,所以提供 EMMC 和 SD 卡的操作命令。在Linux中,一般认为 EMMC和 SD 卡属于用一类型存储设备(mmc设备),所以可以使用 MMC 来代指 EMMC 和 SD 卡。
💦boot 中常用于操作 MMC 设备的命令为“mmc”。
💦mmc 是一系列的命令,其后可以跟不同的参数,输入“?mmc”即可查看 mmc 有关的命令。
在这里插入图片描述
在这里插入图片描述

1.mmc info 命令

在这里插入图片描述
💦当前选中的 MMC 设备是SD卡,版本为 3.0,容量为 14.4GiB,速度为 50000000Hz=50MHz,4 位宽的总线。

2.mmc list 命令

💦mmc list 命令用于来查看当前开发板一共有几个 MMC 设备,输入“mmc list”
在这里插入图片描述

3.mmc dev 命令

💦mmc dev 命令用于切换当前 MMC 设备,命令格式如下

mmc dev [dev] [part]

💦[dev]用来设置要切换的 MMC 设备号,[part]是分区号。如果不写分区号的话默认为分区 0。

mmc dev 1 //切换到 emmc ,0 为 SD 卡,1 为 eMMC

在这里插入图片描述

4.mmc part 命令

💦有时候 SD 卡或者 EMMC 会有多个分区,可以使用命令“mmc part”来查看其分区,比如
查看 EMMC 的分区情况,输入如下命令:

mmc dev 1 //切换到 EMMC
mmc part //查看 EMMC 分区

在这里插入图片描述
💦此时 EMMC 有两个分区,第一个分区起始扇区为 20480,长度为 262144 个扇区;第二个分区起始扇区为 282624,长度为 14594048 个扇区。
💦如果 EMMC 里面烧写了 Linux 系统的话,EMMC 是有 3 个分区的,第 0 个分区存放 uboot,第 1 个分区存放Linux 镜像文件和设备树,第 2 个分区存放根文件系统。但是在上图只有两个分区,那是因为第 0 个分区没有格式化,所以识别不出来,实际上第 0 个分区是存在的。
💦一个新的 SD卡默认只有一个分区,那就是分区 0,所以前面讲解的 uboot 烧写到 SD 卡,其实就是将 u-boot.bin烧写到了 SD 卡的分区 0 里面。当Linux 内核移植的时候在 SD 卡中创建并格式化第二个分区,并将 Linux 镜像文件和设备树文件存放到第二个分区中。
如果要将 EMMC 的分区 2 设置为当前 MMC 设备,可以使用如下命令:

mmc dev 1 2

在这里插入图片描述

5.mmc read 命令-将MMC数据读到DRAM中

💦mmc read 命令用于读取 mmc 设备的数据,命令格式如下:

mmc read addr blk# cnt

💦addr 是数据读取到 DRAM 中的地址,blk 是要读取的EMMC块起始地址(十六进制),一个块是 512字节,这里的块和扇区是一个意思,在 MMC 设备中我们通常说扇区,cnt 是要读取的块数量(十六进制)。
💦举例:比如从 EMMC 的第 1536(0x600)个块开始,读取 16(0x10)个块的数据到 DRAM 的0X80800000 地址处,命令如下:

mmc dev 1 0 //切换到 MMC 分区 0
mmc read 80800000 600 10 //读取数据

在这里插入图片描述
💦查看下读取是否正确,通过 md.b 命令查看 0x80800000 处的数据,查
看 16*512=8192(0x2000)个字节的数据,命令如下:

md.b 80800000 2000

在这里插入图片描述
💦可以看到“baudrate=115200.board_name=EVK.board_rev=14X14.”等字样,
这个就是 uboot 中的环境变量。EMMC 核心板 uboot 环境变量的存储起始地址就是
1536*512=786432。

6.mmc write 命令-将DRAM数据写入MMC设备

💦要将数据写到 MMC 设备里面,可以使用命令“mmc write”,格式如下:

mmc write addr blk# cnt

addr 是要写入 MMC 中的数据在 DRAM 中的起始地址,blk 是要写入 MMC 的块起始地址
(十六进制),cnt 是要写入的块大小,一个块为 512 字节。我们可以使用命令“mmc write”来升
级 uboot,也就是在 uboot 中更新 uboot。这里要用到 nfs 或者 tftp 命令,通过 nfs 或者 tftp 命令将新的 u-boot.bin 下载到开发板的 DRAM 中,然后再使用命令“mmc write”将其写入到 MMC
设备中。我们就来更新一下 SD 中的 uboot,先查看一下 SD 卡中的 uboot 版本号,注意编译时间,输入命令:

mmc dev 0 //切换到 SD 卡
version //查看版本号

在这里插入图片描述
💦可以看出当前 SD 卡中的 uboot 是 2024 年 4 月 5日 编译的。我们现在重新编译一下 uboot,然后将编译出来的 u-boot.imx(u-boot.bin 前面加了一些头文件)拷贝到 Ubuntu 中的tftpboot 目录下。最后使用 tftp 命令将其下载到 0x80800000 地址处,命令如下:

tftp 80800000 u-boot.imx

在这里插入图片描述
💦u-boot.imx 大小为 363520 字节,363520/512=710,所以我们要向 SD 卡中写入710个块,如果有小数的话就要加 1 个块。使用命令“mmc write”从 SD 卡分区 0 第 2 个块(扇区)开始烧写,一共烧写 710(0x2C6)个块,命令如下:

mmc dev 0 0
mmc write 80800000 2 2E6

在这里插入图片描述
💦重启开发板验证,可以看到日期是晚上8点多,与上述日期不一致,更新成功。
在这里插入图片描述
💦要更新 EMMC 中的 uboot 也是一样的。
如果要在 uboot 中更新 EMMC 对应的 uboot,可以使用如下所示命令:

mmc dev 1 0 //切换到 EMMC 分区 0
tftp 80800000 u-boot.imx //下载 u-boot.imx 到 DRAM
mmc write 80800000 2 32E //烧写 u-boot.imx 到 EMMC 中
mmc partconf 1 1 0 0 //分区配置,EMMC 需要这一步!

💦注意:千万不要写 SD 卡或者 EMMC 的前两个块(扇区),里面保存着分区表!

7.SD卡分区介绍-补充

在这里插入图片描述

8.mmc erase 命令

💦如果要擦除 MMC 设备的指定块就是用命令“mmc erase”,命令格式如下:

mmc erase blk# cnt

💦blk 为要擦除的起始块,cnt 是要擦除的数量。没事不要用 mmc erase 来擦除 MMC 设备。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper与kafka

目录 一、zookeeper 1.1.zookeeper概述 1.2.Zookeeper 工作机制 1.3. Zookeeper 特点 1.4.Zookeeper 数据结构 1.5.Zookeeper 应用场景 1.6.Zookeeper 选举机制 第一次启动选举机制 非第一次启动选举机制 选举Leader规则: 1.7.部署 Zookeeper 集群 1.7.…

AI人工智能讲师大模型培训讲师叶梓 大语言模型(LLM)在科学文献摘要领域的应用

大语言模型(LLM)在科学文献摘要领域的应用是一个前沿且迅速发展的技术趋势。通过结合GitHub上yobibyte的Compressor项目,我们可以深入探讨这一技术方案的潜力和实现方式。 技术背景 随着科学研究的快速发展,每天都有大量的科学文…

matlab学习(三)(4.9-4.15)

一、空域里LSB算法的原理 1.原理: LSB算法通过替换图像像素的最低位来嵌入信息。这些被替换的LSB序列可以是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。 2.实现步骤: (1)将图像文件中的所有像素点以RGB形…

服务器数据恢复—ext3文件系统下raid5数据恢复案例

服务器数据恢复环境&故障情况: 某企业光纤存储上有一组由16块硬盘组建的raid5阵列。管理员发现该光纤存储上的卷无法挂载,经过检查发现raid5阵列中有2块硬盘离线,于是联系我们数据恢复中心要求数据恢复工程师到现场恢复服务器存储上的数据…

【可能是全网最丝滑的LangChain教程】七、LCEL表达式语言

系列文章地址 【可能是全网最丝滑的LangChain教程】一、LangChain介绍-CSDN博客 【可能是全网最丝滑的LangChain教程】二、LangChain安装-CSDN博客 【可能是全网最丝滑的LangChain教程】三、快速入门LLM Chain-CSDN博客 【可能是全网最丝滑的LangChain教程】四、快速入门Re…

在js中计算两个时间段重叠的时长问题

文章目录 前言一、过程分析二、实现代码(js)总结 前言 最近遇到一个需求,就是在js中计算两段时间的重叠时长问题,这里记录一下。 一、过程分析 两段时间的重叠问题,一般有3中情况 两段时间完全无重叠,也就是无任何交集两段时间…

软考中级--网络工程师-计算机基础与理论第二节无线基础知识

IEEE802.11 规定了多种 WLAN 通信标准,其中( )与其他标准采用的频段不同,因而不能兼容。 A IEEE802.11a B IEEE802.11b C IEEE802.11g D IEEE802.11n 试题答案 正确答案: A 答案解析 IEEE 802.11a规定采用5GHz的 ISM频…

007Node.js安装自启动工具supervisor运行js文件

在vscode中,某些运行中的程序修改xx.js文件后,通过CtrlC终止再重新运行。supervisor是自启动工具,会不停的查看你的文件,一旦发现有修改,就立马重新载入运行。 我们可以通过安装supervisor代替node命令运行xx.js。终端…

环境变量与进程优先级

目录 进程的优先级 什么是优先级 为什么要有优先级 linux的优先级特点和查看方式 其他概念 环境变量 命令行参数 环境变量 查看环境变量方法 修改PATH 其他环境变量 进程的优先级 什么是优先级 优先级:指定进程获得某种资源的先后顺序。(优先级…

Python数据分析案例40——电商直播间成交金额预测

承接上一篇案例电商直播间提取的特征,进而做一篇机器学习的案例,来预测直播间的成交金额。 Python数据分析案例39——电商直播间评论可视化分析(LDA) 1. 引言 1.1 直播电商与传统电商的比较 直播电商作为一种新兴的电子商务模式…

c语言中<string.h>的strstr与strtok函数

c语言中string.h的strstr与strtok函数 代码运行结果 代码 #include <stdio.h> #include <string.h>///1.在字符串str1里面,查找第一次出现str2的位置 //char * strstr(const char * str1,const char * str2)///2.sep为分割符,根据分割符来对str进行分割 //char * …

【WEEK7】 【DAY5】JDBC—PreparedStatement Object【English Version】

2024.4.12 Friday Following 【WEEK7】 【DAY4】JDBC—Statement Object【English Version】 Contents 10.3.PreparedStatement Object10.3.1.PreparedStatement can prevent SQL injection, more efficient than statement10.3.2. Insertion10.3.3. Deletion10.3.4. Update10.…

Windows版PHP7.4.9解压直用(免安装-绿色-项目打包直接使用)

安装版和解压版 区别 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#xff09;能更深了解mysql的配置&…

C 408—《数据结构》易错考点200题(含解析)

目录 Δ前言 一、绪论 1.1 数据结构的基本概念 : 1.2 算法和算法评价 : 二、线性表 2.2 线性表的顺序表示 : 2.3 线性表的链式表示 : 三、栈、队列和数组 3.1 栈 3.2 队列 3.3 栈和队列的应用 3.4 数组和特殊矩阵 四、串 4.2 串的模式匹配 五、树与二叉树 5.1 树的基…

StarUML笔记之从UML图生成C++代码

StarUML笔记之从UML图生成C代码 —— 2024-04-14 文章目录 StarUML笔记之从UML图生成C代码1.Add Diagram2.在TOOLBOX中左键点击Class,松开,然后在中间画面再左键点击&#xff0c;即可出现UML3.修改类图&#xff0c;并添加接口&#xff0c;方法&#xff0c;属性&#xff0c;我…

超干!如何编写完美的Python命令行程序?

这篇文章将教你如何编写完美的 Python 命令行程序&#xff0c;提高团队的生产力&#xff0c;让大家的工作更舒适。 作为 Python 开发者&#xff0c;我们经常要编写命令行程序。比如在我的数据科学项目中&#xff0c;我要从命令行运行脚本来训练模型&#xff0c;以及计算算法的…

分享免费财务软件,比花钱买的还好用!

领取方式&#xff1a; 复制该链接在浏览器打开&#xff1a;网页链接扫码登陆。进入系统&#xff0c;创建账套即可直接使用&#xff0c;如图所示&#xff1a; 功能&#xff1a; 功能1、智能会计凭证&#xff1a;可以自动匹配科目、自动填充相应信息、检测到异常情况&#xff…

世界各国柴油价格22.7统计

数据详情介绍&#xff1a; 统计时间为2022年7月4日。在该月份&#xff0c;全球柴油的平均价格为每升1.43美元。然而&#xff0c;各国间存在明显的价格差异。一般而言&#xff0c;西欧等发达国家的价格基本在每升2美元以上&#xff1b;相反&#xff0c;像伊朗、委内瑞拉、利比亚…

设计模式代码实战-外观模式

1、问题描述 小明家的电源总开关控制了家里的三个设备&#xff1a;空调、台灯和电视机。每个设备都有独立的开关密码&#xff0c;分别用数字1、2和3表示。即输入1时&#xff0c;空调关闭&#xff0c;输入2时&#xff0c;台灯关闭&#xff0c;输入3时&#xff0c;电视机关闭&am…

聊聊jvm中内存模型的坑

jvm线程的内存模型 看图&#xff0c;简单来说线程中操作的变量是副本。在并发情况下&#xff0c;如果数据发生变更&#xff0c;副本的数据就变为脏数据。这个时候就会有并发问题。 参考&#xff1a;https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…