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

[Linux]从零开始的STM32MP157 Busybox根文件系统构建

一、前言

        在上一篇教程中,已经教了大家如何使用Buildroot构建根文件系统,并且在最后我们已经完整的构建了一个可以运行的根文件系统。但是,Buildroot的集成度太高了,不利于小白理解根文件系统,所以本次教程,我们将会使用一种更为复杂的方式来构建根文件系统,那就是Busybox,它可以让我们自己去手动复制一些文件来构建根文件系统,可以让我们对根文件系统有更深刻的认识,如果你准备好了,就让我们开始吧!

二、谁适合本次教程

        如果你之前已经构建好了Buildroot根文件系统,那么本篇教程对你来说应该是完全没问题的,虽说Busybox根文件系统的构建过程繁琐但是绝对谈不上很难。如果你之前没有构建过Buildroot根文件系统还是建议先看我的上一篇教程。当然,如果你使用的开发板不是STM32MP157也可以将本篇教程作为参考,毕竟道理都是大差不差的。

三、资料的准备

        本次教程我们依然使用正点原子官方的资料,关于资料的下载在之前的交叉编译环境搭建的教程中就已经讲过了,如果你还没有下载正点原子的官方资料可以看下面的教程:

STM32MP157交叉编译环境搭建:[Linux]从零开始的STM32MP157交叉编译环境配置_stm32mp157 linux 开发 单片机开发-CSDN博客

资料下载完成以后如图所示:

将资料准备完成以后,就可以进行下一步了。

四、Busybox的编译

        我们为了使用Busybox那么首先就是编译Busybox,正点原子的资料中已经提供了Busybox的源码。这里也建议大家直接使用正点原子官方给的源码,不要去官网自己下载,从官网下载的源码可能版本太新,从而导致编译失败。正点原子官方提供的源码被放在了正点原子资料目录下的“01、程序源码\06、BusyBox源码”目录下,如图所示:

如果你发现你没有这个目录,可以找到对应的压缩包将其解压。

这里我们在Ubuntu的用户目录的linux目录下新建一个名为“BUSYBOX”的目录,完成以后如图所示:

然后我们可以将正点原子提供的Busybox的源码拷贝到这个我们新建的目录中,这里不管大家是使用sftp也好,直接复制也好,只要将源码压缩包拷贝到这个目录即可,完成以后如图所示:

然后我们再使用下面的命令解压源码:

tar -xvf busybox-1.32.0.tar.bz2

解压完成以后,得到如下文件夹:

进入这个文件夹中可以看到如下内容:

这些就是Busybox的源码了,我们下面会对源码进行一些修改操作。

这里我们首先使用vs code打开Busybox源码目录,方便我们修改,如图所示:

这里我们首先来配置Busybox的编译器,这里需要我们打开Busybox的顶层Makefile:

这里我们往下滑,找到大约在164行的“CROSS_COMPILE ?=”,如图所示:

这里我们直接将“CROSS_COMPILE ?=”的值写为“arm-none-linux-gnueabihf-”即可,因为我们已经将交叉编译器的路径配置到环境变量了,所以不用写绝对路径。修改完成以后如图所示:

CROSS_COMPILE ?=arm-none-linux-gnueabihf-

然后我们来到大约191行处,找到“ARCH ?= $(SUBARCH)”,如图所示:

这一行是为了配置编译的架构,我们直接写成“arm”即可,修改完成以后如图所示:

至此我们顶层Makefile就修改好了。大家保存退出即可。

默认情况下Busybox是没有提供中文支持的,我们需要修改一部分的代码使其支持中文,这里我们打开Busybox源码文件夹下的“libbb/printable_string.c”文件,打开以后,如图所示:

这里我们将31与32行的代码直接注释掉:

这里代码的意思是,当字符的编码大于“0x7f”的话就直接跳出函数了。

然后我们看到大约第45行的“if (c < ' ' || c >= 0x7f)”代码,如图所示:

这里我们需要将其注释掉,并且在它的下面写入下面的内容:

if( c < ' ')

修改完以后,如图所示:

至此,我们的“printable_string.c”文件就修改完成了。大家记得保存。

然后打开Busybox源码目录下的“libbb/unicode.c”:

我们来到1028行,找到如图所示代码“*d++ = (c >= ' ' && c < 0x7f) ? c : '?';”:

将其注释掉,在它的下面加上如下内容:

*d++ = (c >= ' ') ? c : '?';

然后来到大约1037行的位置,找到下面的代码“if (c < ' ' || c >= 0x7f)”,如图所示:

我们将其注释掉,添加如下内容:

if(c < ' ')

修改完以后,如图所示:

Busybox也是支持图形化配置的,下面的配置我们需要借助图形化来进行,如果你还没有配置过图形化或者想知道图形化配置的原理可以看下面的文章:

Uboot图形化配置及原理:[Linux]从零开始的STM32MP157 U-Boot图形化配置及Kconfig文件讲解_kconfig图形化配置应用于应用层软件代码项目中-CSDN博客

这里我们直接在Busybox的源码目录中使用下面的命令加载一下默认配置:

make defconfig

完成后如图所示:

然后使用下面的命令启动图形化配置:

make menuconfig

启动以后如图所示:

这里我们首先看到“Settings  --->  ”选项:

进入后,可以看到以下内容:

我们往下滑找到“Build static binary (no shared libs) ”:

这行配置是决定使用静态编译还是动态编译的,我们这里使用动态编译,所以这里不使能,注意是不使能。

然后我们再往下找到“vi-style line editing commands ”选项:

我们这里需要将其选中,如图所示:

然后我们再回到最外面的目录,找到“Linux Module Utilities  ---> ”:

进入后可以看到如下选项:

这里我们需要取消勾选“Simplified modutils”选项:

然后我们再回到最外面的目录,找到“Linux System Utilities  --->  ”选项:

进入以后如图所示:

往下滑,我们找到“[*] mdev (17 kb) ”,确保它下面的选项都是选中的状态:

下面我们需要使能“unicode”编码,使Busybox构建的根文件系统支持中文,我们同样回到最外面的目录,然后进入“Settings  --->  ”往下滑找到“[*] Support Unicode ”,将其使能,如图所示:

然后将它下面的“Check $LC_ALL, $LC_CTYPE and $LANG environment variables”也使能,如图所示:

至此,我们的Busybox配置就已经完成了,下面我们回到最外层的目录,找到“Save Configuration to an Alternate File”选项:

来到这个选项回车以后,会问我们将配置文件保存在哪儿,这里我们将其保存到“configs”目录下斌且名为“stm32mp1_atk_defconfig”:

./configs/stm32mp1_atk_defconfig 

完成配置以后,我们退出即可,退出时提示我们是否要保存新配置,选择“yes”即可:

当我们配置完Busybox以后,就可以准备编译了,我们首先在Busybox的源码目录下方输入下面的命令加载默认配置文件:

make stm32mp1_atk_defconfig

然后使用下面的命令开始编译,这里编译的线程数大家根据自己电脑的实际情况调整即可:

make -j16

编译完成以后如图所示:

这里我们也会像使用Buildroot构建根文件系统时一样用nfs来挂载根文件系统,这里我们需要在nfs目录下新建一个rootfs目录,如果之前创建过了直接删掉重新创建即可:

完成以后,我们再次回到Busybox的源码目录中,使用下面的命令将编译出来的根文件系统安装到我们创建的rootfs目录中:

make install CONFIG_PREFIX=/home/chulingxiao/linux/nfs/rootfs

这里因为用户名不同,所以路径也会不同,大家根据自己的情况调整命令即可:

命令执行完成后如图所示:

这时候我们来到rootfs目录中,可以发现其中已经有一些基本目录了:

当然,只有这些目录的话我们的Linux根文件系统并不是完整的,下面我们来完善根文件系统。

我们首先使用下面的命令在rootfs目录下新建两个目录,后面我们会往这两个目录中复制库文件:

mkdir lib usr/lib

当我们新建好文件夹以后,我们需要将一些必要的库文件复制到这两个文件夹中,这里我们先使用下面的命令去到编译器对应的文件夹中,这里可能会因为编译器位置的不同命令也不同,大家根据自己编译器的位置写命令:

cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/lib/

去到对应的目录以后,我们可以看到如图所示的文件:

我们使用下面的命令将这个目录下的所有文件复制到rootfs下的lib目录中,同样的大家根据自己的情况写命令:

cp *so* /home/chulingxiao/linux/nfs/rootfs/lib/ -d

完成以后如图所示:

在这些文件中,“ld-linux-armhf.so.3”是一个比较特殊的文件,它是一个软链接,我们可以使用下面的命令看它指向了哪个文件:

ls  ld-linux-armhf.so.3 -l

这里我们可以看到这个软链接指向了一个名为“ld-2.30.so”的文件:

因为软链接在实际使用中是无效的,我们将原本复制到rootfs中名为“ld-linux-armhf.so.3 ”删掉。然后使用下面的命令重新复制一份“ld-linux-armhf.so.3 ”文件:

cp ld-linux-armhf.so.3 /home/chulingxiao/linux/nfs/rootfs/lib/

完成以后,rootfs的lib目录内容如图所示:

然后我们再使用下面的命令进入另一个目录:

cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/lib

我们同样使用下面的命令将这个目录的文件也复制到“lib”目录中:

cp *so* *.a /home/chulingxiao/linux/nfs/rootfs/lib/ -d

完成以后lib目录如图所示:

我们现在向“usr/lib”目录添加文件,首先使用下面的命令切换文件夹:

cd /usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/lib

切换到对应目录后,使用下面的命令复制文件:

cp *so* *.a /home/chulingxiao/linux/nfs/rootfs/usr/lib/ -d

完成以后“usr/lib”目录下如图所示:

完成上面的步骤后,我们回到rootfs目录,我们使用下面的命令检查一下对应目录的大小:

du ./lib ./usr/lib/ -sh

这里可以看到,目录大小如下,如果你的目录大小和我差距非常大的话,看看是不是忘了什么步骤:

然后我们再使用下面的命令往我们的根文件系统中创建其它的基础文件夹:

 mkdir dev proc mnt sys tmp etc root

完成后我们的根文件系统如图所示:

因为要使用nfs挂载根文件系统,这里我们还需要修改以下nfs的配置文件,使用下面的命令打开配置文件:

sudo nano /etc/default/nfs-kernel-server

打开后可以看到以下内容:

我们在最后一行加上下面的内容:

RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog" 

修改完以后如图所示: 

最后我们保存退出即可。

修改完配置文件以后,我们使用下面的命令重新启动软件:

sudo /etc/init.d/nfs-kernel-server restart 

这里显示ok以后,nfs的配置就修改完成了:

现在在开发板端,我们需要修改一下bootargs环境变量,使用下面的命令:

setenv bootargs console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/chulingxiao/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.106:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off

这里大家注意,这是一行命令,不要换行。大家使用时,需要修改几个地方,下面一一来讲,首先是“nfsroot=192.168.1.100:/home/chulingxiao/linux/nfs/rootfs”这里大家需要把这里的IP地址修改为自己Ubuntu的地址。后面的路径大家写自己的rootfs文件夹的路径。然后是“ip=192.168.1.106:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off”这里有三个地址,按照从前到后的顺序是“开发板的IP地址”,“Ubuntu的IP地址”,“网关的IP地址”,大家根据自己的情况配置即可。

输入命令后,使用“saveenv”将环境变量保存到EMMC中:

完成以后,我们使用“boot”命令加载内核和根文件系统:

当出现以下提示以后,我们按回车即可:

回车以后就可以看到我们进入根文件系统了:

就算前面有报错也没关系,至少Busybox构建的根文件系统已经正常启动了,我们可以来测试一下基础命令,比如“ls”:

输入ls以后就能看到我们根文件系统的全部内容。

至此,我们使用Busybox构建根文件系统就已经完成了。

五、结语

        相信完成了以上步骤,大家对根文件系统一定有了更深刻的认识,但是我们目前也只是将根文件系统构建好,还有一些错误仍然没有解决,并且我们构建的根文件系统的功能我们也没有测试,这就留到下一篇教程再来为大家讲解吧,那么最后,感谢大家的观看!

 

相关文章:

[Linux]从零开始的STM32MP157 Busybox根文件系统构建

一、前言 在上一篇教程中&#xff0c;已经教了大家如何使用Buildroot构建根文件系统&#xff0c;并且在最后我们已经完整的构建了一个可以运行的根文件系统。但是&#xff0c;Buildroot的集成度太高了&#xff0c;不利于小白理解根文件系统&#xff0c;所以本次教程&#xff0c…...

C++ RAII机制

RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是一种编程范式&#xff0c;核心思想是&#xff1a;资源的生命周期与对象绑定——对象创建时获取资源&#xff0c;对象销毁时自动释放资源。这种机制通过构造函数和析构函数的配对执行&#xff0c;确保资源…...

spring中的@Value注解详解

一、核心功能与作用 Value是Spring框架中用于动态注入属性值的注解&#xff0c;支持从配置文件、环境变量、SpEL表达式等来源注入数据&#xff0c;实现代码与配置的解耦。 注入类型覆盖广泛 基本类型&#xff1a;字符串、数值&#xff08;int/double&#xff09;、布尔值等。 …...

模型欠拟合是什么?

模型的欠拟合:全面解析 一、定义与核心概念 欠拟合(Underfitting)是指模型在训练数据、验证数据和测试数据上均表现不佳的现象。其本质是模型过于简单或学习能力不足,无法捕捉数据中的潜在规律和复杂关系,导致泛化能力差。例如,用线性模型拟合非线性数据时,模型无法描…...

IC ATE集成电路测试学习——电流测试的原理和方法

电流测试 我们可以通过电流来判断芯片的工作状态时&#xff0c;首先先了解下芯片的电流是如何产生的。 静态电流 理论上&#xff0c;CMOS结构的芯片静态时几乎不耗电 CMOS基本结构&#xff1a;Pmos Nmos 串联当逻辑电平稳定时&#xff1a; ➜ 要么Pmos导通&#xff0c;Nmo…...

Wordpress头像无法加载太慢问题解决方式

Wordpress头像无法加载太慢问题解决方式 1、找到我们当前使用的主题目录中找到functions.php文件在文件最后面添加以下代码 if ( ! function_exists( get_cravatar_url ) ) {/***替换Gravatar头像为Cravatar头像** param string $url** return string*/function get_cravatar…...

《大模型微调实战:Llama 3.0全参数优化指南》

全参数微调&#xff08;Full Parameter Fine-Tuning&#xff09;是推动大模型适应垂直领域任务的核心技术&#xff0c;尤其对于Llama 3.0这类千亿级参数模型而言&#xff0c;其性能优化与场景适配能力直接决定了实际应用价值。然而&#xff0c;全参数微调面临计算成本高、内存占…...

ActiveMQ 生产环境问题排查与调优指南(二)

五、调优策略与实践 5.1 JVM 调优 JVM 调优对于提升 ActiveMQ 性能至关重要&#xff0c;合理的 JVM 配置可以使 ActiveMQ 更高效地利用系统资源&#xff0c;减少性能瓶颈。 设置合理的堆内存大小是 JVM 调优的关键步骤。堆内存是 JVM 中用于存储对象实例的区域&#xff0c;其…...

AugmentCode 非常昂贵的新定价

AugmentCode 现在的价格比 Cursor 和 Windsurf 的总和还要贵。 AugmentCode 曾是我开发工作流程的常用工具。出乎意料的是,他们改变了定价结构,让开发者们震惊不已。 原来的30 美元月费已经增长为50 美元月费,这是一个67%的增长。 改变我看法的不仅仅是价格上涨,还有他…...

Unity 红点系统

首先明确一个&#xff0c;即红点系统的数据结构是一颗树&#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中&#xff0c;之后再是对应的红点UI侧的注册&#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册&#xff0c;但是不销毁数据侧的红点注册 - …...

Python-UV多环境管理

Python-UV多环境管理 Python使用UV进行环境管理&#xff0c;系统了解UV的使用 文章目录 Python-UV多环境管理 [toc]1-学习要点2-核心知识点3-UV多环境管理4-venv和uv脚本对比1-venv环境管理2-uv环境管理3-venv对比uv 1-学习要点 1-熟悉【UV环境管理】2-熟悉【UV和Venv脚本区别…...

多空短线决策+飞云分仓操盘,两个副图指标组合操盘技术,短线更精准有效

如上图&#xff0c;两个副图指标&#xff0c;第一个【短线多空决策】&#xff0c;第二个副图指标【飞云分仓操盘】&#xff0c;指标组合使用&#xff0c;精准性和有效性更加有效。 如上图&#xff0c;两个指标组合使用&#xff0c;我们选择第二个副图指标出现红色和紫色区域的标…...

istio in action之应用弹性与容错机制

在分布式系统中&#xff0c;服务间的依赖关系就像一张错综复杂的网络&#xff0c;任何一个节点的抖动都可能引发连锁反应。这也是为什么我们需要强调弹性&#xff0c;因为在分布式系统中&#xff0c;服务之间通过网络进行通信&#xff0c;这本身就引入了无数个潜在的失败点。我…...

将PyQt5设计的程序打包成.exe文件

打包教程 因为打包的机制是会把当前的解释器的包也打包上&#xff0c;而我的环境经常会有一些较大的包&#xff0c;比如torch之类的。所以这里会创建一个单独的环境。 conda create -n image_process python3.8 激活环境 conda activate image_process 现在先安装我需要安装…...

Java原生结合MQTTX---完成心跳对话(附带源码)

简言&#xff1a;✨当Java遇上MQTT&#xff1a;打造会"隔空传话"的魔法程序✨ 导语&#xff1a;想不想让两个Java程序像哈利波特里的双面镜一样实时对话&#xff1f;今天我们将用MQTT协议EMQX&#xff0c;在Ubuntu上搭建一个魔法邮局&#xff0c;再亲手编写会传信的…...

redis数据结构-06(LRANGE、LINDEX、LSET、LREM)

列表操作&#xff1a;LRANGE、LINDEX、LSET、LREM Redis 列表不仅仅是简单的数组&#xff1b;它们是一种强大的数据结构&#xff0c;可以高效地操作有序数据。本课将深入探讨使用 Redis 列表的四个基本命令&#xff1a; LRANGE 、 LINDEX 、 LSET 和 LREM 。掌握这些命令将使您…...

4.4 os模块

os模块&#xff1a; chdir:修改工作路径 --- 文件所在位置的标识 getcwd():返回当前路径&#xff0c;如果修改了则显示修改后的路径 curdir:获取当前目录的表示形式 cpu_count():返回当前cpu的线程数 getppid(): 获取当前进程编号 getppid()&#xff1a;获取当前进程的父进…...

在 Windows 系统上选择与部署 DICOM 医学影像开发工具与库

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

MYSQL数据库集群高可用和数据监控平台(详细版)

项目说明 概述 该项目共分为2个子项目&#xff0c;由MYSQL集群高可用和数据监控平台两部分组成 MYSQL集群高可用属于云原生高级课数据库运维部分的知识 数据监控平台属于云原生拔高项目&#xff0c;旨在让学生增加知识面&#xff0c;提高项目实习经历&#xff0c;充实简历 …...

学习通刷课稳定版(美化面板+完全免费)

学习通刷 &#xff08;美化面板完全免费&#xff09; 安装教程方法一源码文件 方法二 提示结尾 安装教程 方法一 我们首先在浏览器打开脚本猫网站并获取该插件&#xff08;浏览器以Edge为例&#xff09; 脚本猫首页&#xff1a;https://scriptcat.org/zh-CN/ 第一步&#xff…...

python 实现sha加密

在Python中&#xff0c;SHA&#xff08;Secure Hash Algorithm&#xff09;是一种加密哈希函数&#xff0c;通常用于生成数据的哈希值。SHA算法是单向的&#xff0c;这意味着它只能用于加密&#xff08;生成哈希值&#xff09;&#xff0c;而不能用于解密。因此&#xff0c;SHA…...

Linux epoll 详解:概念、使用、数据结构、流程及应用

epoll是什么&#xff1f; epoll 是从 Linux 2.6 起&#xff0c;Linux内核提供的一种高性能I/O事件通知机制&#xff0c;用于解决传统 select 和 poll 在处理大量并发连接时遍历、最大数量限制、频繁拷贝数据等问题。epoll 可以用来监听多个文件描述符&#xff08;socket、管道…...

Kubernetes排错(十一):lsof命令实战场景

在Kubernetes生产环境中&#xff0c;lsof作为Linux系统的"透视眼"&#xff0c;是排查容器级疑难杂症的必备工具。本文将深入解析其在容器化场景下的高阶用法&#xff0c;助你快速定位隐藏问题。 一、基础环境准备 1. 容器内安装lsof # 临时进入容器安装&#xff0…...

Java基础语法之循环结构

循环结构 1.定义 控制一段代码重复执行多次 2.分类 2.1 for循环 2.1.1 定义 控制一段代码反复执行很多次。 2.1.2 for循环格式 for (初始化语句; 循环条件; 迭代语句) { 循环体语句(重复执行的代码); }示例 // 输出3次HelloWorld for (int i 0; i < 3; i) { System…...

冒泡排序的原理

冒泡排序是一种简单的排序算法&#xff0c;它通过重复地遍历待排序的列表&#xff0c;比较相邻的元素并交换它们的位置来实现排序。具体原理如下&#xff1a; 冒泡排序的基本思想 冒泡排序的核心思想是通过相邻元素的比较和交换&#xff0c;将较大的元素逐步“冒泡”到列表的…...

AUTOSAR图解==>AUTOSAR_TR_InteractionWithBehavioralModels

AUTOSAR与行为模型交互详解 深入解析AUTOSAR软件组件与行为模型的交互关系与转换机制 目录 引言 1.1 AUTOSAR编辑工具概述 1.2 源起与目标 1.3 术语定义需求追溯AUTOSAR中行为建模的用例 3.1 软件组件的行为建模 3.2 软件组件描述到行为模型 3.3 行为模型到软件组件描述 3.4 组…...

GO语言内存管理结构

文章目录 1、内存分区1.1、栈&#xff08;Stack&#xff09;1.2、堆&#xff08;Heap&#xff09; 2、堆内存管理结构2.1、内存分配器&#xff08;MCache → MArena → MSpan → MHeap&#xff09;2.2、大小分类&#xff08;Size Class&#xff09;2.3、分配流程 3、垃圾回收&a…...

分享一些资料供大家学习

群里收集来的&#xff0c;自己感觉还是比较经典的&#xff0c;希望大家喜欢&#xff01;&#xff01;&#xff01; 20250428 夸克网盘分享一大波经典IT架构好货20250429夸克网盘分享精品文档-管理咨询师必备的思维模型20250430夸克网盘分享清华大学DeepSeek教程又来了《文科生A…...

RAGMCP基本原理说明和相关问题解惑

一、RAG架构原理和局限性 1.1 概念解释 RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a;检索增强生成&#xff0c;让大模型接受外部输入后&#xff0c;总结输出 向量数据库&#xff1a;向量数据通常是高维空间中的点&#xff0c;代表复杂的数据结构…...

PyGame游戏开发(含源码+演示视频+开结题报告+设计文档)

前言&#xff1a; 大二小学期python课上基于pygame做的一个游戏小demo&#xff0c;当时老师花了一天讲解了下python基础语法后&#xff08;也是整个大学四年唯一学习python的时间&#xff09;&#xff0c;便让我们自学网课一周然后交项目&#xff0c;所以做的非常仓促&#xff…...

Git标签

Git标签 1. 添加标签 使用 tag 命令可以给某次 commit 提交的版本打上标签&#xff0c;相当于这个 commit id 的别名&#xff0c;在实践中&#xff0c;会使用 v1.0 之类的标签提示这是正式版的第一个版本。 git tag v1.0 [commit id]缺省输入 commit id会给最新的一次提交打…...

USB学习【6】USB传输错误的处理

1.前言 我们从物理层到信号层&#xff0c;到协议层&#xff0c;他们分别在不同的层面完成不同的功能。 总结一下&#xff1a; 物理层实现了高低电平的检测。 信号层更进一步&#xff0c;通过一些方法&#xff0c;实现了二进制的传输。 协议层&#xff0c;因为可以二进制传输了…...

深入解析 Vision Transformer (ViT) 与其在计算机视觉中的应用

在近年来&#xff0c;深度学习尤其在计算机视觉领域取得了巨大的进展&#xff0c;而 Vision Transformer&#xff08;ViT&#xff09;作为一种新的视觉模型&#xff0c;它的表现甚至在许多任务中超过了传统的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;如 ResNet。在…...

《Go小技巧易错点100例》第三十一篇

本期分享&#xff1a; 1.Go struct内存对齐 2.使用空结构体(struct{})节省内存 Go struct内存对齐 在计算机系统中&#xff0c;CPU 访问内存时并不是逐字节读取的&#xff0c;而是以特定大小的块&#xff08;通常为 4/8 字节&#xff09;为单位进行读取。当数据的内存地址正…...

全栈项目实战:Vue3+Node.js开发博客系统

全栈项目实战&#xff1a;Vue3Node.js开发博客系统 一、项目架构设计 1. 技术栈选型 前端技术栈&#xff1a; Vue 3 Composition APITypeScriptPinia状态管理Vue Router 4Element Plus UI组件库Vite构建工具 后端技术栈&#xff1a; Node.js (Express/Koa)MongoDB (Mong…...

查看YOLO版本的三种方法

查看YOLO版本的三种方法&#xff1a; 一、通过命令行直接查询 使用Python交互式查询&#xff1a; from ultralytics import __version__ print(__version__) # 示例输出: 11.0.5二、检查PyTorch环境兼容性 import torch, ultralytics print(f"PyTorch: {torch.__versi…...

基于Docker的Bitwarden的私有本地部署

基于Docker的Bitwarden的私有本地部署 文章目录 基于Docker的Bitwarden的私有本地部署 本文首发地址 https://h89.cn/archives/355.html bitwarden 默认连接的是国外服务器 https://bitwarden.com/ &#xff0c;连接不是很稳定&#xff0c;也没有安全感&#xff0c;所以我选择了…...

点和体素哪个好

3D 深度学习中基于体素和基于点云的方法哪种更优&#xff1f;-腾讯云开发者社区-腾讯云 https://zhuanlan.zhihu.com/p/372497398 GitHub - open-mmlab/OpenPCDet: OpenPCDet Toolbox for LiDAR-based 3D Object Detection....

C++ STL编程 vector空间预留、vector高效删除、vector数据排序、vector代码练习

vector空间预留&#xff0c;作用是避免申请每次申请内存&#xff0c;提高运行效率。 对应的接口是 vector.reverse() vector的高效删除&#xff0c;对应的代码见下&#xff0c;一个时间复杂度是n&#xff0c;一个时间复杂度是1 #include<iostream> #include<vector…...

Android架构模式推荐及分析和MVC架构模式制作一个简单的底部tab切换

目录 主流架构模式对比 适用场景 MVP‌&#xff1a;团队协作开发,需要高可测试性的项目 MVC架构模式制作一个简单的底部tab切换 &#xff08;Model-View-Controller&#xff09;结构 代码 效果 主流架构模式对比 ‌对比维度‌‌MVC‌ ‌MVP‌ ‌MVVM‌ ‌MVI‌ ‌学习…...

【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)

【PVE】ProxmoxVE8虚拟机&#xff0c;存储管理&#xff08;host磁盘扩容&#xff0c;qcow2/vmdk导入vm&#xff0c;vm磁盘导出与迁移等&#xff09; 文章目录 1、host 磁盘扩容2、qcow2/vmdk导入vm3、vm 磁盘导出与迁移 1、host 磁盘扩容 如何给host扩容磁盘&#xff0c;如增加…...

【JEECG 组件扩展】JSwitch开关组件扩展单个多选框样式

功能说明&#xff1a; 基于JeecgBoot开源框架&#xff0c;JSwitch开关组件扩展&#xff0c;支持单个多选样式。 效果展示&#xff1a; 使用示例&#xff1a; {field: JSwitch,component: JSwitch,label: JSwitch,},{field: JSwitchCheckBox,component: JSwitch,label: JSwitch…...

卷积神经网络-从零开始构建一个卷积神经网络

目录 一、什么是卷积神经网络CNN 1.1、核心概念 1.2、卷积层 二、什么是卷积计算 2.1、卷积计算的例子: 2.2、点积 2.3、卷积与点积的关系 2.4、Padding(填充) 2.4.1、Padding的主要作用 1、控制输出特征图尺寸 2、保留边缘信息 3. 支持深层网络训练 2.4.2、Str…...

Linux 常用命令集合

以下是一份 Linux 常用命令集合&#xff0c;涵盖文件操作、系统管理、网络管理、权限管理、进程管理等常见任务&#xff0c;并附上代码示例&#xff1a; 1. 文件与目录操作 命令作用示例ls列出目录内容ls -l&#xff08;详细列表&#xff09; ls -a&#xff08;显示隐藏文件&a…...

STM32f103 标准库 零基础学习之按键点灯(不涉及中断)

注意&#xff0c;此次代码不涉及中断&#xff0c;不涉及中断&#xff0c;不涉及中断 目录 1.初始化LED 2.初始化按键 3.粗略的延时函数 4.判断引脚电平 5.通过异或反转电平 开始 │ ├── 初始化LED&#xff08;GPIOA Pin1 推挽输出&#xff09; ├── 初始化按键&…...

【c++】【数据结构】二叉搜索树详解

目录 二叉搜索树的定义二叉搜索树的模拟实现查找函数循环版递归版 插入函数循环版递归版 删除函数循环版递归版 二叉搜索树的定义 二叉搜索树是一种特别的二叉树&#xff0c;是二叉树的搜索特化版。学过排序的都知道&#xff0c;在数组有序的情况下二分查找可以以极高的频率找…...

高精地图数据错误的侵权责任认定与应对之道

首席数据官高鹏律师团队 在自动驾驶与智慧交通快速发展的今天&#xff0c;高精地图作为核心基础设施&#xff0c;其数据准确性直接关系到公共安全。然而&#xff0c;技术并非完美&#xff0c;一旦因地图数据错误导致事故或损失&#xff0c;比如当自动驾驶汽车因高精地图数据错…...

Python训练营打卡——DAY22(2025.5.11)

复习日 学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号——来自灾难的机器学习 数据来源&#xff1a; kaggle泰坦里克号人员生还预测 挑战 泰坦尼克号沉没是历史上最臭名昭著的海难之一。 1912年4月15日&#xff0c;在被普…...

【计算机视觉】OpenCV实战项目 :Image_Cartooning_Web_App:基于深度学习的图像卡通化

Image_Cartooning_Web_App&#xff1a;基于深度学习的图像卡通化Web应用深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 模型部署3.3 处理流程示例 4. 常见问题与解决方案4.1 模型加载失败4.2 显存溢出4.3 边缘伪影 5. 关…...

王道计算机网络知识点总结

计算机网络知识点总结 一、计算机网络体系结构 &#xff08;一&#xff09;计算机网络概述 计算机网络概念&#xff1a;互连的、自治的计算机系统的集合&#xff0c;目的是资源共享&#xff0c;组成包括多台自治计算机&#xff0c;规则是网络协议。 计算机网络的组成&#…...