当前位置: 首页 > news >正文

IMX6ULL驱动开发uboot篇02

目录

网络操作

第零步:先将网线跟电脑接好,打开串口连接到开发板上,然后上电,让UBoot停下来

第一步:查看我们的网线构成的虚拟子网是哪一个

第二步:我们必须把虚拟机的网卡模式从NAT改成桥接,因为我们要跟真实的开发板同处于一个子网

第三步:设置板子的IP,网关, MAC地址和子网掩码

uboot对NFS的支持

tftp指令

Boot系列指令

bootz

boot


网络操作

在开始之前,我需要说明一下如何设置我们的开发板这样才能Ping通。笔者之前的博客是针对一台上位机Linux的操作,这里说一下虚拟机咋搞

注意,这里说的是——开发板连接到电脑上,网络环境只有真实的Windows接入到笔者的校园网上。是准备把开发板介入到路由器的朋友请参考其他人的博客

第零步:先将网线跟电脑接好,打开串口连接到开发板上,然后上电,让UBoot停下来
第一步:查看我们的网线构成的虚拟子网是哪一个

一个办法,跑到网络适配器那里,你插拔网线,注意每一个有线网的状态如何。比如说,笔者插拔网线,发现下面这个会从“未连接的网络”跟“未识别的网络”中来回变化。那说明就是这个了。

下一步,去看看ip:

Ethernet adapter 以太网:Connection-specific DNS Suffix  . :Link-local IPv6 Address . . . . . : fe80::c5ef:6ad6:813f:6ca%7IPv4 Address. . . . . . . . . . . : 192.168.137.1Subnet Mask . . . . . . . . . . . : 255.255.255.0Default Gateway . . . . . . . . . :

可以看到,我们的Windows在这个网线构成的子网中被分派了192.168.137.1,网关没有设置,这个无所谓。

第二步:我们必须把虚拟机的网卡模式从NAT改成桥接,因为我们要跟真实的开发板同处于一个子网

笔者这里详细展开说明VMWare NAT/桥接的区别了,大概就是:NAT办法讲虚拟机及其虚拟的设备组成一个虚拟的子网,我们主机/开发板没办法直接跟虚拟机对话,必须走虚拟机的NAT表转换才能访问虚拟机本身。这样的话,我们实际上没法直接板子ping到Ubuntu上。所以必须要改。

把我们的虚拟机设置改成这个,这个就是上面的网线组成虚拟子网的名称。

下一步就是修改Ubuntu的IP了,注意,这个子网是不具备IP分配功能的,为了简便期间,我们就直接给我们的Ubuntu一个静态IP。

比如说,笔者在Windows上就查询到笔者的Windows在这个子网中被分配到了IP:192.168.137.1,那么,我们这里就随意填写一个192.168.137.10. 当然不是真的随意,正确的做法是先ping一下这个ip有没有被占用,如果没有回应,就说明设备可以在这里占用这个ip。至于网关,按照默认的规矩,我们写192.168.137.1,Netmask子网掩码那就是255.255.255.0,要跟网线给出的设置一致最好。说明这个网线最大支持搜索254个设备。(1是gateway,255是广播,所以之后的开发板不要设置成这两个)。

点击保存后,我们看一下网卡的IP有没有被设置成功:

charliechen@ubuntu:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:74:eb:32 brd ff:ff:ff:ff:ff:ffinet 192.168.137.10/24 brd 192.168.137.255 scope global ens33valid_lft forever preferred_lft foreverinet6 fe80::6e1d:7cee:2940:cb3d/64 scope link valid_lft forever preferred_lft forever

我们尝试ping一下Windows主机。虽然实际上我们的Windows主机本身充当了网关:

charliechen@ubuntu:~$ ping 192.168.137.1 -c 4
PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data.
64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.363 ms
64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.525 ms
64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.431 ms
64 bytes from 192.168.137.1: icmp_seq=4 ttl=128 time=0.452 ms
​
--- 192.168.137.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3075ms
rtt min/avg/max/mdev = 0.363/0.442/0.525/0.063 ms

在Windows上,我们测试一下能不能ping通Ubuntu:

➜  ping 192.168.137.10
​
Pinging 192.168.137.10 with 32 bytes of data:
Reply from 192.168.137.10: bytes=32 time<1ms TTL=64
Reply from 192.168.137.10: bytes=32 time<1ms TTL=64
Reply from 192.168.137.10: bytes=32 time<1ms TTL=64
Reply from 192.168.137.10: bytes=32 time<1ms TTL=64
​
Ping statistics for 192.168.137.10:Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:Minimum = 0ms, Maximum = 0ms, Average = 0ms

非常好!

第三步:设置板子的IP,网关, MAC地址和子网掩码

注意,网关和子网掩码要求必须跟我们的网线是完全一致的。MAC地址呢,实际上只要求子网内唯一即可。这里我们顺用正点原子给出的MAC地址就好了

setenv ethaddr b8:ae:1d:01:00:00 

需要保证的是这个MAC地址是子网唯一的。

=> setenv gatewayip 192.168.137.1
=> setenv netmask 255.255.255.0

不要照抄,看自己的网线!

=> setenv ipaddr 192.168.137.4

这个就是设置我们板子的IP了。注意的是,我们需要保证我们的板子跟我们的子网内,看一下我们设置的gatewayip和netmask,所以能修改的就是最后一个数字,且不可以是1, 255,Windows占用的IP和Ubuntu虚拟机占用的IP。这里笔者就随意的给了个4。

需要提醒的是——不要试图其他主机去ping我们的板子,你ping不到的,我们的uboot不会处理,也没有必要处理ICMP请求包,所以,他就是只能够单向的作为发起请求的一方。笔者不知道这一点,折腾了半个小时

很好,现在我们试一下ping不ping的通:

=> ping 192.168.137.1            
Using FEC1 device
host 192.168.137.1 is alive
=> ping 192.168.137.10
Using FEC1 device
host 192.168.137.10 is alive

OK,现在我们可以做实验了。

uboot对NFS的支持

笔者又要说明的是——如果你使用的是高版本的Ubuntu,或者内核版本大于6.2的情况下,正点原子使用的UBoot是不支持NFSv2的,需要做修改,24.04的版本更是直接废掉了NFS,只允许TFTP,所以,如果你是Ubuntu24.04用户,就直接看tftp即可

uboot的NFS指令非常的直白,就是nfs

=> ? nfs
nfs - boot image via network using NFS protocol
​
Usage:
nfs [loadAddress] [[hostIPaddr:]bootfilename]

下面我们尝试传送一个zImage玩玩先。

还没有配置nfs的朋友需要先在Ubuntu上配置一下nfs,设置好nfs的操作共享目录之后,把我们的zImage或者啥文件拷贝到那个文件夹下,笔者是直接拿了正点编译好的zImage过来

虽说默认的,我们的uboot的上传默认地址就是0x80800000,但是这不太明晰,我们一般会写出来我们要放到那个地方。其次就是我们的被传送文件的路径,格式是:IP:AbsPath,必须是绝对路径,~是针对用户而言的,uboot肯定不知道你这个~是啥意思。

=> nfs 0x80800000 192.168.137.10:/home/charliechen/linux/nfs/zImage
Using FEC1 device
File transfer via NFS from server 192.168.137.10; our IP address is 192.168.137.4; sending through gateway 192.168.137.1
Filename '/home/charliechen/linux/nfs/zImage'.
Load address: 0x80800000
Loading: ###################################################################################################################################################################################################...##########################
done
Bytes transferred = 6785480 (6789c8 hex)

出于严谨,我们对比一下到底是不是发生了传送:

=> md.b 80800000 100
80800000: 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1    ................
80800010: 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1 00 00 a0 e1    ................
80800020: 03 00 00 ea 18 28 6f 01 00 00 00 00 c8 89 67 00    .....(o.......g.
80800030: 01 02 03 04 00 90 0f e1 e8 04 00 eb 01 70 a0 e1    .............p..
80800040: 02 80 a0 e1 00 20 0f e1 03 00 12 e3 01 00 00 1a    ..... ..........
80800050: 17 00 a0 e3 56 34 12 ef 00 00 0f e1 1a 00 20 e2    ....V4........ .
80800060: 1f 00 10 e3 1f 00 c0 e3 d3 00 80 e3 04 00 00 1a    ................
80800070: 01 0c 80 e3 0c e0 8f e2 00 f0 6f e1 0e f3 2e e1    ..........o.....
80800080: 6e 00 60 e1 00 f0 21 e1 09 f0 6f e1 00 00 00 00    n.`...!...o.....
80800090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
808000a0: 0f 40 a0 e1 3e 43 04 e2 02 49 84 e2 0f 00 a0 e1    .@..>C...I......
808000b0: 04 00 50 e1 ac 01 9f 35 0f 00 80 30 00 00 54 31    ..P....5...0..T1
808000c0: 01 40 84 33 6d 00 00 2b 5e 0f 8f e2 4e 1c 90 e8    .@.3m..+^...N...
808000d0: 1c d0 90 e5 01 00 40 e0 00 60 86 e0 00 a0 8a e0    ......@..`......
808000e0: 00 90 da e5 01 e0 da e5 0e 94 89 e1 02 e0 da e5    ................
808000f0: 03 a0 da e5 0e 98 89 e1 0a 9c 89 e1 00 d0 8d e0    ................

嗯,一眼扫过去没毛病。

tftp指令

我们还要做的一个事情就是搭建tftp环境,这个是所有版本的ubuntu协议都可以用的。这里简单的说一下如何搭建tftp服务。

上面我们刚刚切换到的桥接模式要改回来可以上网的NAT,然后可能需要重启一下ubuntu,我没重启,发现可以直接上网,当然如果发现上不了网,重启一下ip addr看看ip有没有恢复

sudo apt-get install tftp-hpa tftpd-hpa 
sudo apt-get install xinetd

下一步就是建立一个tftp文件夹,笔者建立在了:/home/charliechen/linux/tftp,然后需要

  • 创建一个配置文件:sudo gedit /etc/xinetd.d/tftp,然后需要将自己的server_args指向的文件夹改成自己打算设置成的tftp协议文件夹

# /etc/xinetd.d/tftp 
server tftp 
{ socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /home/charliechen/linux/tftp/ disable = no per_source = 11 cps = 100 2 flags = IPv4 
} 

然后记得重启,看看配置是否成功,ubuntu service指令中

sudo service tftpd-hpa start
sudo service tftpd-hpa status

查看一下服务的状态是一个很好的习惯,不要开了就拍拍屁股走人了。

/etc/default/tftpd-hpa这个文件是已经存在的,我们改一下TFTP_DIRECTORY就好了,还是指向我们的tftp文件夹。

# /etc/default/tftpd-hpa
​
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/charliechen/linux/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"

老样子,我们把我们的/home/charliechen/linux/tftp的权限改成777(之前不信邪,发现就是这个管用,不然死活permission denied,看来有时间必须好好理解一下tftp协议了)

=> tftp 80800000 zImage          
Using FEC1 device
TFTP from server 192.168.137.10; our IP address is 192.168.137.4
Filename 'zImage'.
Load address: 0x80800000
Loading: ###############################################################################################################################################################################################################################################################################################################################################################################################################################################################################2.2 MiB/s
done
Bytes transferred = 6785480 (6789c8 hex)
​

注意,这个协议比较简单,uboot会操作主机直接到我们设置的serverip指向的设备,查找其tftp根目录下的文件下载过来

-rw-rw-r-- 1 charliechen charliechen 6785480 Mar  6 04:21 zImage

这个协议下面的文件只需要保证可读即可。所以没必要拉满权限,但是tftp文件夹是需要的。

Boot系列指令

bootz

要启动Linux,需要先将 Linux 镜像文件拷贝到 DRAM 中,如果使用到设备树的话也需要将设备树拷贝到 DRAM 中。可以从 EMMC 或者NAND 等存储设备中将Linux 镜像和设备树文 件拷贝到 DRAM,也可以通过 nfs 或者 tftp 将 Linux 镜像文件和设备树文件下载到 DRAM 中

Usage:
bootz [addr [initrd[:size]] [fdt]]- boot Linux zImage stored in memory

比如说,我们可以尝试启动一下:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-7-800x480-c.dtb
bootz 80800000 - 83000000

可以看到我们可以启动成功板子的,但是可惜的是没有根文件系统,无法完全启动。

boot

boot 命令也是用来启动Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系 统,bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命 令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内是可以修改的。

换而言之,我们的boot就相当于一个启动集合指令。这里就不再赘述了,直接给出来一个模板,一看就懂:

setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-800x480-c.dtb; bootz 80800000 - 83000000'
saveenv
boot

相关文章:

IMX6ULL驱动开发uboot篇02

目录 网络操作 第零步&#xff1a;先将网线跟电脑接好&#xff0c;打开串口连接到开发板上&#xff0c;然后上电&#xff0c;让UBoot停下来 第一步&#xff1a;查看我们的网线构成的虚拟子网是哪一个 第二步&#xff1a;我们必须把虚拟机的网卡模式从NAT改成桥接&#xff0c…...

智谱AI-FunctionCall

智谱AI-FunctionCall 编写FuncationCall大模型的函数调用&#xff0c;先直观的感受一下的感受下FunctionCall的魅力 文章目录 智谱AI-FunctionCall[toc]1-参考网址2-思路整理3-代码拆件1-[非核心]两个业务函数2-[非核心]业务函数的JsonSchema定义3-[核心]FunctionCall的调用1-打…...

数据保险箱:备份文件的关键价值与自动化实践

在信息化社会&#xff0c;数据已经成为我们生活、工作和学习的核心组成部分。无论是企业机密、个人隐私&#xff0c;还是创意作品、研究数据&#xff0c;它们都以数字形式存在于我们的电子设备中。然而&#xff0c;数据如同脆弱的玻璃制品&#xff0c;稍有不慎就可能面临丢失或…...

数字电路基础——逻辑门

逻辑门是数字电子技术中的基本构建块。这些组件用于对1和0进行操作,可以将它们组合起来创建其他构建块,并设计出如锁存器、触发器、加法器、移位寄存器等电路。 七种主要的逻辑门类型: 一、基本逻辑门 1.1 与门(AND gate) 1.1.1 逻辑运算规则 与门有多个输入端和一个输出…...

爬虫逆向:脱壳工具BlackDex的详细使用

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、BlackDex简介二、下载与安装三、基本使用步骤3.1 启动BlackDex3.2 导入目标APK文件3.3 开始脱壳3.4 查看脱壳结果四、后续分析4.1 使用 JADX 反编译 Dex 文件4.2 使用 Apktool 反编译 Dex 文件4.3 JD-GUI4.4 dex2ja…...

JavaScript中的Math()

目录 一、Math() 1.1floor() 1.2ceil() 1.3round() 1.4random() 1.5max() 1.6min() 1.7pow() 1.8sqrt() 1.9trunc() 二、parseFloat() 三、toFixed() 四、toString() 4.1Number类型转换为字符串 4.2Boolean类型转换为字符串 4.3Date()类型转换为字符串 4.4Arr…...

深度学习模型Transformer初步认识整体架构

第一章&#xff1a;人工智能之不同数据类型及其特点梳理 第二章&#xff1a;自然语言处理(NLP)&#xff1a;文本向量化从文字到数字的原理 第三章&#xff1a;循环神经网络RNN&#xff1a;理解 RNN的工作机制与应用场景(附代码) 第四章&#xff1a;循环神经网络RNN、LSTM以及GR…...

【从模仿到超越:AIGC的崛起与AGI的终极梦想】

一、基本概念 1. AIGC&#xff08;人工智能生成内容&#xff09; 定义&#xff1a;基于人工智能技术生成文本、图像、音频、视频等数字内容的方法。技术基础&#xff1a;依赖深度学习模型&#xff08;如GPT、DALL-E、Stable Diffusion&#xff09;和自然语言处理&#xff08;…...

标量、向量、矩阵与张量:从维度理解数据结构的层次

在数学和计算机科学中&#xff0c;维度描述了数据结构的复杂性&#xff0c;而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展&#xff0c;以下是详细解析&#xff1a; 1. 标量&#xff08;Scalar&#xff09;&#xff1a;0维数据 …...

windows 上删除 node_modules

在 Windows 11 上&#xff0c;你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤&#xff1a; 删除 node_modules 打开命令提示符&#xff08;Command Prompt&#xff09;或终端&#xff08;PowerShell&#xff09;。 导航到项目目录。你可以使用 …...

单例模式的五种实现方式

1、饿汉式 ①实现&#xff1a;在类加载的时候就初始化实例 ②优点&#xff1a;线程安全 ③缺点&#xff1a;实例在类加载的时候创建&#xff0c;可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…...

启智平台华为昇腾910B使用MS-Swift微调Janus-Pro-7/1B

最近想要微调一下DeepSeek出品的Janus多模态大模型 利用启智平台的昇腾910B国产计算卡进行大模型的微调 查看了一下MS-Swift支持了Janus模型的微调&#xff0c;LLamafactory好像暂时还不支持该模型的微调 看到了MS-Swift有单独对昇腾的支持&#xff0c;因此首先要安装swift&…...

蓝桥试题:传球游戏(二维dp)

一、题目描述 上体育课的时候&#xff0c;小蛮的老师经常带着同学们一起做游戏。这次&#xff0c;老师带着同学们一起做传球游戏。 游戏规则是这样的&#xff1a;n 个同学站成一个圆圈&#xff0c;其中的一个同学手里拿着一个球&#xff0c;当老师吹哨子时开始传球&#xff0…...

迷你世界脚本小地图接口:Mapmark

小地图接口&#xff1a;Mapmark 彼得兔 更新时间: 2023-10-25 10:33:48 具体函数名及描述如下: 序号 函数名 函数描述 1 newShape(...) 新增一个形状(线&#xff0c;矩形&#xff0c;圆形) 2 deleteShape(...) 删除一个形状 3 setShapeColor(...) 设置…...

从零开始在Windows使用VMware虚拟机安装黑群晖7.2系统并实现远程访问

文章目录 前言1.软件准备2. 安装VMware17虚拟机3.安装黑群晖4. 安装群晖搜索助手5. 配置黑群晖系统6. 安装内网穿透6.1 下载cpolar套件6.2 配置群辉虚拟机6.3 配置公网地址6.4 配置固定公网地址 总结 前言 本文主要介绍如何从零开始在Windows系统电脑使用VMware17虚拟机安装黑…...

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能&#xff0c;可以将C写的软件到浏览器中运行&#xff0c;最近一段时间正在研究这方便内容&#xff0c;普通的控件响应都能实现&#xff0c;今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境&#xff1a;window11&#xff0c;Qt6.8.2…...

Java阻塞队列深度解析:高并发场景下的安全卫士

一、阻塞队列的核心价值 在电商秒杀系统中&#xff0c;瞬时涌入的10万请求如果直接冲击数据库&#xff0c;必然导致系统崩溃。阻塞队列如同一个智能缓冲带&#xff0c;通过流量削峰和异步解耦两大核心能力&#xff0c;成为高并发系统的核心组件。 二、Java阻塞队列实现类对比 …...

软件信息安全性测试流程有哪些?专业软件测评服务机构分享

在数字化时代&#xff0c;软件信息安全性测试的重要性愈发凸显。尤其是对于企业来说&#xff0c;确保软件的安全性不仅是维护用户信任的关键&#xff0c;也是满足合规要求的必要条件。 软件信息安全性测试是指通过一系列系统化的测试手段&#xff0c;评估软件应用在受到攻击时…...

Linux - 网络基础(应用层,传输层)

一、应用层 1&#xff09;发送接收流程 1. 发送文件 write 函数发送数据到 TCP 套接字时&#xff0c;内容不一定会立即通过网络发送出去。这是因为网络通信涉及多个层次的缓冲和处理&#xff0c;TCP 是一个面向连接的协议&#xff0c;它需要进行一定的排队、确认和重传等处理…...

C++11新特性:auto遇上const时的推导规则

当auto推导变量类型时&#xff0c;const修饰符会影响推导结果&#xff0c;我们具体看一下有哪些影响 1、普通变量 例如&#xff1a; const int ci 42; auto a ci; // a 的类型是 int (顶层 const 被忽略) const auto ca ci; // ca 的类型是 const int (顶层 const 被…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...