正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-4 uboot目录分析
前言:
本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。
引用:
正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com
《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》
正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档
正点原子imx6ull-mini-Linux驱动之Linux I2C 驱动实验(21)-CSDN博客
正文:
本文是 “Arm(iMX6U)Linux系统移植和根文件系统构键篇--4讲uboot目录分析。本节将参考正点原子的视频教程和配套的正点原子开发指南文档进行学习。

0. 概述
1 U-Boot 工程目录分析
本书我们以 EMMC 版本的核心板为例讲解,为了方便, uboot 启动源码分析就在 Windows下行,将正点原子提供的 uboot 源码进行解压,解压完成以后的目录如图 31.1.1 所示

图 31.1.1 是正点原子提供的未编译的 uboot 源码目录,我们在分析 uboot 源码之前一定要先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot 源码不可或缺的文件。使用上一章创建的 shell 脚本来完成编译工作,命令如下:
cd alientek_uboot //进入正点原子 uboot 源码目录
./mx6ull_alientek_emmc.sh //编译 uboot
cd ../ //返回上一级目录
tar -vcjf alientek_uboot.tar.bz2 alientek_uboot //压缩
最终会生成一个名为 alientek_uboot.tar.bz2 的压缩包,将 alientek_uboot.tar.bz2 拷贝到 windows系统中并解压,解压后的目录如图 31.1.2 所示:

对比图 31.1.2 和图 31.1.1,可以看出编译后的 uboot 要比没编译之前多了好多文件,这些文件夹或文件的含义见表 31.1.1 所示
| 文件夹 | 描述 | 备注 |
| api | 与硬件无关的 API 函数 | uboot 自带 |
| arch | 与架构体系有关的代码 | uboot 自带 |
| board | 不同板子(开发板)的定制代码 | uboot 自带 |
| cmd | 命令相关代码 | uboot 自带 |
| common | 通用代码 | uboot 自带 |
| configs | 配置文件 | uboot 自带 |
| disk | 磁盘分区相关代码 | uboot 自带 |
| doc | 文档 | uboot 自带 |
| drivers | 驱动代码 | uboot 自带 |
| dts | 设备树 | uboot 自带 |
| examples | 示例代码 | uboot 自带 |
| fs | 文件系统 | uboot 自带 |
| include | 头文件 | uboot 自带 |
| lib | 库文件 | uboot 自带 |
| Licenses | 许可证相关文件 | uboot 自带 |
| net | 网络相关代码 | uboot 自带 |
| post | 上电自检程序 | uboot 自带 |
| scripts | 脚本文件 | uboot 自带 |
| test | 测试代码 | uboot 自带 |
| tools | 工具文件夹 | uboot 自带 |
| .config | 配置文件,重要的文件 | 编译生成的文件 |
| .u-boot.xxx.cmd (一系列) | 这是一系列的文件,用于保存着一 些命令 | 编译生成的文件 |
| config.mk | 某个 Makefile 会调用此文件 | uboot 自带 |
| imxdownload | 正点原子编写的 SD 卡烧写软件 | 正点原子提供 |
| Kbuild | 用于生成一些和汇编有关的文件 | uboot 自带 |
| Kconfig | 图形配置界面描述文件 | uboot 自带 |
| MAKEALL | 一个 shell 脚本文件,帮助编译 uboot 的 | uboot 自带 |
| Makefile | 主 Makefile,重要文件! | uboot 自带 |
| System.map | 系统映射文件 | 编译生成的文件 |
| u-boot | 编译出来的 u-boot 文件 | 编译生成的文件 |
| u-boot.xxx (一系列) | 生成的一些 u-boot 相关文件,包括 u-boot.bin、 u-boot.imx.等 | 编译生成的文件 |
表 31.1.1 中的很多文件夹和文件我们都不需要去关心,我们要关注的文件夹或文件如下
1、 arch 文件夹
这个文件夹里面存放着和架构有关的文件,如图 31.1.3 所示

从图 31.1.3 可以看出有很多架构,比如 arm、 avr32、 m68k 等,我们现在用的是 ARM 芯片,所以只需要关心 arm 文件夹即可,打开 arm 文件夹里面内容如图 31.1.4 所示:

图 31.1.4 只截取了一部分,还有一部分 mach-xxx 的文件夹。 mach 开头的文件夹是跟具体的设备有关的,比如“mach-exynos”就是跟三星的 exyons 系列 CPU 有关的文件。我们使用的是I.MX6ULL,所以要关注“imx-common”这个文件夹。另外“cpu”这个文件夹也是和 cpu 架构有关的,打开以后如图 31.1.5 所示:

从图 31.1.5 可以看出有多种 ARM 架构相关的文件夹,
- I.MX6ULL 使用的 Cortex-A7 内核,Cortex-A7 属于 armv7,所以我们要关心“armv7”这个文件夹。
- cpu 文件夹里面有个名“uboot.lds”的链接脚本文件,这个就是 ARM 芯片所使用的 u-boot 链接脚本文件!
- armv7 这个文件夹里面的文件都是跟 ARMV7 架构有关的,是我们分析 uboot 启动源码的时候需要重点关注的。
2、 board 文件夹
board 文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面(正点原子添加的), borad 文件夹里面有个名为“freescale”的文件夹,如图 31.1.6 所示:

所有使用 freescale 芯片的板子都放到此文件夹中, I.MX 系列以前属于 freescale,只是freescale 后来被 NXP 收购了。打开此 freescale 文件夹,在里面找到和 mx6u(I.MX6UL/ULL)有关的文夹,如图 31.1.7 所示:


图 31.1.7 中有 5 个文件夹,这 5 个文件夹对应 5 种板子,以“mx6ul”开头的表示使用I.MX6UL 芯片的板子,以 mx6ull 开头的表示使用 I.MX6ULL 芯片的板子。 mx6ullevk 是 NXP官方的I.MX6ULL开发板,正点原子的ALPHA开发板就是在这个基础上开发的,因此mx6ullevk也是正点原子的开发板。我们后面移植 uboot 到时候就是参考 NXP 官方的开发板,也就是要参考 mx6ullevk 这个文件夹来定义我们的板子。
3、 configs 文件夹
此文件夹为 uboot 配置文件, uboot 是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”, xxx 表示开发板名字,这些 defconfig 文件都存放在 configs文件夹,因此, NXP 官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中,如图31.1.8 所示:

图 31.1.8 中这 6 个文件就是正点原子 I.MX6U-ALPHA 开发板所对应的 uboot 默认配置文件。我们只关心 mx6ull_14x14_ddr512_emmc_defconfig 和 mx6ull_14x14_ddr256_nand_defconfig这两个文件,分别是正点原子 I.MX6ULL EMMC 核心板和 NAND 核心板的配置文件。使用“make xxx_defconfig”命令即可配置 uboot,比如:
make mx6ull_14x14_ddr512_emmc_defconfig
上述命令就是配置正点原子的 I.MX6ULL EMMC 核心板所使用的 uboot。
在编译 uboot 之前一定要使用 defconfig 来配置 uboot!
在 mx6ull_alientek_emmc.sh 中就有下面这一句:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_
defconfig
这个就是调用 mx6ull_14x14_ddr512_emmc_defconfig 来配置 uboot,只是这个命令还带了一些其它参数而已。
4、 .u-boot.xxx_cmd 文件
.u-boot.xxx_cmd 是一系列的文件,这些文件都是编译生成的,都是一些命令文件,比如文件.u-boot.bin.cmd,看名字应该是和 u-boot.bin 有关的,此文件的内容如下:
cmd_u-boot.bin := cp u-boot-nodtb.bin u-boot.bin
.u-boot.bin.cmd 里面定义了一个变量: cmd_u-boot.bin,此变量的值为“cp u-boot-nodtb.bin u-boot.bin”,也就是拷贝一份 u-boot-nodtb.bin 文件,并且重命名为 u-boot.bin,这个就是 uboot.bin
的来源,来自于文件 u-boot-nodtb.bin。
那 么 u-boot-nodtb.bin 是 怎 么 来 的 呢 ? 文 件 .u-boot-nodtb.bin.cmd 就 是 用 于 生 成 uboot.nodtb.bin 的,此文件内容如下:
cmd_u-boot-nodtb.bin := arm-linux-gnueabihf-objcopy \ --gap-fill=0xff -j .text -j .secure_text \-j .rodata -j .hash -j .data -j .got -j .got.plt \-j .u_boot_list -j .rel.dyn -O binary u-boot u-boot-nodtb.bin
这里用到了 arm-linux-gnueabihf-objcopy,使用 objcopy 将 ELF 格式的 u-boot 文件转换为二进制的 u-boot-nodtb.bin 文件。
文件 u-boot 是 ELF 格式的文件,文件.u-boot.cmd 用于生成 u-boot,文件内容如下
cmd_u-boot := arm-linux-gnueabihf-ld.bfd -pie --gc-sections -Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o --start-group arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.o arch/arm/imx-common/built-in.o arch/arm/lib/built-in.o board/freescale/common/built-in.o board/freescale/mx6ullevk/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o --end-group arch/arm/lib/eabi_compat.o -L /home/dimon/I.MX6ULL/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4 -lgcc -Map u-boot.map
.u-boot.cmd 使用到了 arm-linux-gnueabihf-ld.bfd,也就是链接工具,使用 ld.bfd 将各个 builtin.o文件链接在一起就形成了 u-boot 文件。
uboot 在编译的时候会将同一个目录中的所有.c 文件都编译在一起,并命名为 built-in.o,相当于将众多的.c 文件对应的.o 文件集合在一起,这个就是 u-boot 文件的来源。
如果我们要用 NXP 提供的 MFGTools 工具向开发板烧写 uboot,此时烧写的是 u-boot.imx文件,而不是 u-boot.bin 文件。 u-boot.imx 是在 u-boot.bin 文件的头部添加了 IVT、 DCD 等信息。这个工作是由文件.u-boot.imx.cmd 来完成的,此文件内容如下:
cmd_u-boot.imx := ./tools/mkimage \-n board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp \-T imximage -e 0x87800000 -d u-boot.bin u-boot.imx >/dev/null
可以看出,这里用到了工具 tools/mkimage,而 IVT、 DCD 等数据保存在了文件board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp 中 ( 如 果 是 NAND 核 心 板 的 话 就 是imximage-ddr256.cfg.cfgtmp),工具 mkimage 就是读取文件 imximage-ddr512.cfg.cfgtmp 里面的信息,然后将其添加到文件 u-boot.bin 的头部,最终生成 u-boot.imx。
文件.u-boot.lds.cmd 就是用于生成 u-boot.lds 链接脚本的,由于.u-boot.lds.cmd 文件内容太多,这里就不列出来了。
uboot 根目录下的 u-boot.lds 链接脚本就是来源于 arch/arm/cpu/u-boot.lds文件。
cmd_u-boot.lds := arm-linux-gnueabihf-gcc -E -Wp,-MD,./.u-boot.lds.d \-D__KERNEL__ -D__UBOOT__ -D__ARM__ -marm -mno-thumb-interwork \-mabi=aapcs-linux -mword-relocations -fno-pic -mno-unaligned-access \-ffunction-sections -fdata-sections -fno-common -ffixed-r9 -msoft-float \-pipe -march=armv7-a -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -nostdinc \-isystem /home/dimon/I.MX6ULL/gcc-linaro-4.9.4- 2017.01-x86_64_arm-linux-gnueabihf/bin/../lib/\gcc/arm-linux-gnueabihf/4.9.4/include \-include ./include/u-boot/u-boot.lds.h \-DCPUDIR=arch/arm/cpu/armv7 \-ansi -D__ASSEMBLY__ -x assembler-with-cpp \-P -o u-boot.lds arch/arm/cpu/u-boot.ldssource_u-boot.lds := arch/arm/cpu/u-boot.ldsdeps_u-boot.lds := \$(wildcard include/config/armv7/secure/base.h) \$(wildcard include/config/armv7/nonsec.h) \include/u-boot/u-boot.lds.h \include/config.h \$(wildcard include/config/imx/config.h) \$(wildcard include/config/mx6ull/evk/emmc/rework.h) \$(wildcard include/config/boarddir.h) \include/config_defaults.h \
还有一些其它的.u-boot.lds.xxx.cmd 文件,大家自行分析一下,关于.u-boot.lds.xxx.cmd 文件就讲解到这里。
5、 Makefile 文件
- 这个是顶层 Makefile 文件, Makefile 是支持嵌套的,也就是顶层 Makefile 可以调用子目录中的 Makefile 文件。
- Makefile 嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。
- 每个功能模块目录下都有一个 Makefile,这个 Makefile 只处理本模块的编译链接工作,这样所有的编译链接工作就不用全部放到一个 Makefile 中,可以使得 Makefile 变得简洁明了。
uboot 源码根目录下的 Makefile 是顶层 Makefile,他会调用其它的模块的 Makefile 文件,比如 drivers/adc/Makefile。当然了,顶层 Makefile 要做的工作可远不止调用子目录 Makefile 这么简单,关于顶层 Makefile 的内容我们稍后会有详细的讲解。
6、 u-boot.xxx 文件
u-boot.xxx 同样也是一系列文件,包括 u-boot、 u-boot.bin、 u-boot.cfg、 u-boot.imx、 u-boot.lds、u-boot.map、 u-boot.srec、 u-boot.sym 和 u-boot-nodtb.bin,这些文件的含义如下:
- u-boot:编译出来的 ELF 格式的 uboot 镜像文件。
- u-boot.bin:编译出来的二进制格式的 uboot 可执行镜像文件。
- u-boot.cfg: uboot 的另外一种配置文件。
- u-boot.imx: u-boot.bin 添加头部信息以后的文件, NXP 的 CPU 专用文件。
- u-boot.lds:链接脚本。
- u-boot.map: uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
- u-boot.srec: S-Record 格式的镜像文件。
- u-boot.sym: uboot 符号文件。
- u-boot-nodtb.bin:和 u-boot.bin 一样, u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。
7、 .config 文件
uboot 配置文件,使用命令“make xxx_defconfig”配置 uboot 以后就会自动生成, .config 内容如下:

可以看出.config 文件中都是以“CONFIG_”开始的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值, uboot 的顶层 Makefile 或子 Makefile 会调用这些变量值。在.config 中会有大量的变量值为‘y’,这些为‘y’的变量一般用于控制某项功能是否使能,为‘y’的话就表示功能使能,比如:
CONFIG_CMD_BOOTM=y
如果使能了 bootd 这个命令的话, CONFIG_CMD_BOOTM 就为‘y’。在 cmd/Makefile 中有如下代码:
ifndef CONFIG_SPL_BUILD# core commandobj-y += boot.oobj-$(CONFIG_CMD_BOOTM) += bootm.oobj-y += help.oobj-y += version.o
在示例代码 31.1.6 中,有如下所示一行代码
obj-$(CONFIG_CMD_BOOTM) += bootm.o
CONFIG_CMD_BOOTM=y,将其展开就是
obj-y += bootm.o
也就是给 obj-y 追加了一个“bootm.o”, obj-y 包含着所有要编译的文件对应的.o 文件,这里表示需要编译文件 cmd/bootm.c。相当于通过“CONFIG_CMD_BOOTD=y”来使能 bootm 这个命令,进而编译 cmd/bootm.c 这个文件,这个文件实现了命令 bootm。在 uboot 和 Linux 内核中都是采用这种方法来选择使能某个功能,编译对应的源码文件。
8、 README
README 文件描述了 uboot 的详细信息,包括 uboot 该如何编译、 uboot 中各文件夹的含义、相应的命令等等。建议大家详细的阅读此文件,可以进一步增加对 uboot 的认识。
关于 uboot 根目录中的文件和文件夹的含义就讲解到这里,接下来就要开始分析 uboot 的启动流程了.
相关文章:
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-4 uboot目录分析
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Unity开发——点击事件/射线检测
一、IPointerClickHandler接口 通过为 UI 元素添加自定义脚本,实现IPointerClickHandle接口,在点击事件发生时进行处理。 这种方式适用于对特定 UI 元素的点击检测。 using UnityEngine; using UnityEngine.EventSystems;public class UIClickHandler…...
【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 3D刚体组件Rigidbody
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出
引言: DeepSeek,作为一款先进的自然语言处理模型,以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息,进行深度推理,并快速给出准确的回应。DeepSeek模型支持流式处理,这意味着它可以边计算边输…...
55年免费用!RevoUninstaller Pro专业版限时领取
今天,我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件,堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大,但通常需要付费才能解锁全部功能。…...
Markdig:强大的 .NET Markdown 解析器详解
在现代开发中,Markdown 已经成为了一种广泛使用的轻量级标记语言,特别是在文档、博客和内容管理系统中,Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中,Markdig 是一款非常强大的 Markdown 解析器…...
基于ensp的IP企业网络规划
基于ensp的IP企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网(VLAN)与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转换&#…...
谷歌Chrome或微软Edge浏览器修改网页任意内容
在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...
初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
最近,我开始接触大模型开发,并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo,我不仅加深了对大模型的理解,还体验到了 LangChain 和 DeepSeek 的强大功能。下面,我将分享我的开发过程以及一些…...
【Linux】进程(1)进程概念和进程状态
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…...
关闭win11根据内容自动调整屏幕亮度
在win11笔记本上使用编程软件的时候,用的是深色背景,但是屏幕会慢慢变暗;等切换回明亮的桌面时,又会慢慢变亮,带来不适应的感觉。这个博客记录一下解决这个问题的办法 ps:有些人修改的是电源选项ÿ…...
2021-05-23 C++百元百鸡
此是草稿,有值得优化的地方,如从公鸡先循环再母鸡再小鸡这样可以提高效率,且有输出后也可优化为公鸡母鸡小鸡初始化。 void 百元百鸡() {//缘由https://ask.csdn.net/questions/7434093?spm1005.2025.3001.5141int xj 1, mj 1, gj 1, y …...
理解langchain langgraph 官方文档示例代码中的MemorySaver
以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为:定义一个流程,这个流程中用到的数据类型是Messages。 <---定义一个有向图&…...
C# 建造者模式(Builder Pattern)详细讲解
一、什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这个模式主要应用于那些构建过程复杂且涉及多个步骤的…...
Android自动化测试工具
细解自动化测试工具 Airtest-CSDN博客 以下是几种常见的Android应用自动化测试工具: Appium:支持多种编程语言,如Java、Python、Ruby、JavaScript等。可以用于Web应用程序和原生应用程序的自动化测试,并支持iOS和Android平台。E…...
【蓝桥杯】24省赛:数字串个数
思路 本质是组合数学问题: 9个数字组成10000位数字有9**10000可能 不包括3的可能8**10000 不包括7的可能8**10000 既不包括3也不包括77**10000 根据容斥原理:结果为 9 ∗ ∗ 10000 − 8 ∗ ∗ 10000 − 8 ∗ ∗ 10000 7 ∗ ∗ 10000 9**10000 - 8**10…...
SpringBoot中使用kaptcha生成验证码
简介 kaptcha是谷歌开源的简单实用的验证码生成工具。通过设置参数,可以自定义验证码大小、颜色、显示的字符等等。 Maven引入依赖 <!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha --><dependency><groupId>pro.fessional<…...
解密乐天音乐如何通过抗指纹浏览器刷变现
作者:药尘-韩立----->🚀🌍❤️( hanli068 ) 专栏:反反爬技术 日期:2025年3月15日 原创声明:本文为作者原创,未经允许不得转载 在音乐流媒体平台(“日本乐天音乐”)中…...
自定义tiptap插件
本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~ 具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘…...
软考网络安全专业
随着信息技术的迅猛发展,网络安全问题日益凸显,成为社会各界普遍关注的焦点。在这样的背景下,软考网络安全专业应运而生,为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析,探讨其在信…...
蓝桥杯嵌入式赛道复习笔记1(led点亮)
前言 基础的文件创建,参赛资源代码的导入,我就不说了,直接说CubeMX的配置以及代码逻辑思路的书写,在此我也预祝大家人人拿国奖 理论讲解 原理图简介 1.由于存在PC8引脚到PC15引脚存在冲突,那么官方硬件给的解决方案…...
订单超时自动取消功能如何设计
在一个 Java 电商项目中,订单超时自动取消功能可以通过多种方式设计和实现。常见的实现方式包括使用定时任务(例如 ScheduledExecutorService 或 Spring 的 Scheduled 注解)或者基于事件驱动的方式(如使用消息队列)。以…...
FPGA为何要尽量减少组合逻辑的使用
在FPGA设计中,组合逻辑的使用确实需要谨慎,尤其是要尽量减少它的复杂性。这并不是因为组合逻辑本身不好,而是因为它在实际应用中容易引发一系列问题,而这些问题往往与FPGA的设计哲学和硬件特性相冲突。让我从几个关键点来和你聊聊…...
六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Hooks 是什么? 2. useState 的作用 3. 基本语法解析 4. 工作原理 5. 参数详解 a) 初始值设置方式 b) 更新函数特性 6. 注意事项 7. 类组…...
芯科科技推出的BG29超小型低功耗蓝牙®无线SoC,是蓝牙应用的理想之选
具有扩大的内存和超低功耗特性的超小型BG29是互联健康设备的理想之选 低功耗无线领域内的领导性创新厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日宣布:推出全新的第二代无线开发平台产品BG29系列无线片上系统…...
联想小新 Pro16 锐龙版本 type c 充电掉速降频问题
小新Pro-16 2021 锐龙版 Type-C接口连接电源适配器卡顿降频的解决方案 通过网盘分享的文件:小新Pro-16 2021 锐龙版 Type-C接口连接电源适配器卡顿降频的解决方案.zip 链接: https://pan.baidu.com/s/1713s9AO5QC31bdsf8g1ZIw?pwd1234 提取码: 1234 --来自百度网盘…...
export、export default 和 module.exports 深度解析
文章目录 1. 模块系统概述1.1 模块系统对比1.2 模块加载流程 2. ES Modules2.1 export 使用2.2 export default 使用2.3 混合使用 3. CommonJS3.1 module.exports 使用3.2 exports 使用 4. 对比分析4.1 语法对比4.2 使用场景 5. 互操作性5.1 ES Modules 中使用 CommonJS5.2 Com…...
qwen2.5-vl多机多卡分布式部署
记录一下工作中进行多机多卡部署qwen2.5-vl多模态大模型踩过的坑 第一个天坑就是官方提供的镜像qwenllm/qwenvl:2.5-cu121有问题,在titan显卡会抛出cuda error:no kernel image is availabe for execution on the device. 这是cuda内核与GPU不兼容的问题,…...
tsfresh:时间序列特征自动提取与应用
tsfresh:时间序列特征自动提取与应用 本文系统介绍了 tsfresh 技术在 A 股市场数据分析与量化投资中的应用。从基础特征提取到高级策略开发,结合实战案例,详细讲解了如何利用 tsfresh 构建量化投资策略,并优化风险控制,…...
C++Primer学习(7.1 定义抽象数据类型)
类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是种依赖于接口(interface)和实现(implementation)分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。 封…...
