正点原子嵌入式linux驱动开发——U-boot图形化配置及其原理

经过之前对uboot的学习可以知道:uboot可以通过stm32mp15_trusted_defconfig来配置,或者通过文件stm32mp1.h来配置uboot。还有另外一种配置uboot的方法,就是图形化配置,以前的uboot是不支持图形化配置,只有Linux内核才支持图形化配置。不过不知道从什么时候开始,uboot也
支持图形化配置了,本章就来学习一下如何通过图形化配置uboot,并且学习一下图形化配置的原理,因为后面学习Linux驱动开发的时候可能要修改图形配置文件。

U-Boot图形化配置体验

uboot或Linux内核可以通过输入“make menuconfig”来打开图形化配置界面menuconfig是一套图形化的配置工具,需要ncurses库支持。ncurses库提供了一系列的API函数供调用者生成基于文本的图形界面,因此需要先在Ubuntu中安装ncurses库,命令如下:

sudo apt-get install build-essential
sudo apt-get install libncurses5-dev

menuconfig重点会用到两个文件:.config和Kconfig.config文件前面已经说了,这个文
件保存着uboot的配置项
,使用menuconfig配置完 uboot以后肯定要更新.config文件。Kconfig文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有Kconfig文件。

在打开图形化配置界面之前,要先使用“make xxx_defconfig”对uboot进行一次默认配置,只需要一次即可。如果使用“make clean”清理了工程的话就那就需要重新使用“ make xxx_defconfig”再对 uboot进行一次配置。进入uboot根目录,输入如下命令:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- stm32mp15_atk_trusted_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig

如果已经在uboot的顶层Makefile中定义了ARCH和CROSS_COMPILE的值,那么上述命令可以简化为:

make stm32mp15_atk_trusted_defconfig
make menuconfig

打开的图形化界面如下图所示:
uboot图形化配置界面
上图就是主界面,主界面上方的英文就是简单的操作说明,操作方法如下:

通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的代码编译进Uboot中,菜单前面变为“[*]”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“[M]”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。


在配置界面下方会有五个按钮, 这五个按钮的功能如下:
<Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。
<Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。
<Help>:帮助按钮,查看选中菜单的帮助信息。
<Save>:保存按钮,保存修改后的配置文件。
<Load>:加载按钮,加载指定的配置文件。

上图中有很多不同配置的主配置项,通过键盘上的上下键调节配置项。后面跟着“—>”表示此配置项是有子配置项的,按下回车键就可以进入子配置项。

以如何使能dns命令为例,讲解一下如何通过图形化界面来配置uboot。进入“Command line interface —>”这个配置项,此配置项用于配置uboot的命令,进入以后如下图所示:
Command line interface配置项
从上图可以看出,有很多配置项,这些配置项也有子配置项,选择“Network commands —>”,进入网络相关命令配置项,如下图所示:
Network commands配置项
从上图可以看出,uboot中有很多和网络有关的命令,比如bootp、dhcp、tftpboot等等。选中dns,然后按下键盘上的“Y”键,此时dns前面的“[ ]”变成 “[ * ]”,如下图所示:
选中dns命令
每个配置项有3种编译选项:编译进uboot中(也就是编译进u-boot.bin中)、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进uboot中,此时“[ ]”变成了“[ * ]”;按下"N”表示不编译,“[ ]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在Linux内核里面很常用, uboot下面不使用,如果要将某个功能编译为模块,那就按下“M”,此时 “[ ]”就会变为 “< M >”。

选中dns,然后按下“H”或者“?”键可以打开dns命令的提示信息,如下图所示:
dns命令提示信息
按两下“ESC”键即可退出提示界面,相当于返回上一层。选择dns命令以后,按两下“ESC”键(按两下 ESC键相当于返回上一层),退出当前配置项,进入到上一层配置项。如果没有要修改的就按两下 “ESC”键,退出到主配界面,如果也没有其他要修改的,那就再次按两下“ESC”键退出menuconfig配置界面。如果修改过配置的话,在退出主界面的时候会有如下图提示:
是否保存新的配置文件对话框
上图询问是否保存新的配置文件,通过键盘的“←”或“→”键来选择“Yes”项,然后按下键盘上的回车键确认保存。至此,我们就完成了通过图形界面使能了uboot的dns命令,打开 .config文件,会发现多了“CONFIG_CMD_DNS=y”这一行,如下图中323行所示:
.config文件
使用如下命令编译uboot:

make DEVICE_TREE=stm32mp157d-atk all -j12

千万不能使用如下命令:

./stm32mp157d_alientek.sh

因为stm32mp157d_alientek.sh在编译之前会清理工程,会删除掉.config文件!通过图形化界面配置所有配置项都会被删除。

编译完成以后烧写到SD卡中,重启开发板进入uboot命令模式,输入“?”查看是否有dns命令,如果dns命令存在的话就会输出相应的使用信息,如下图所示:
dns帮助信息
测试一下dns命令工作是否正常,使用dns命令来查看一下百度官网“www.baidu.com”的IP地址。

首先用dhcp命令从路由器动态获取一个IP地址,防止自己设置的静态IP地址和网段内其他设备冲突,导致dns命令失败,直接输入“dhcp”即可,结果如下图所示:
dhcp获取IP地址
从上图可以看出,此时开发板从路由器获取到的IP地址为192.168.1.200,接下来要设置一下dns服务器的IP地址,也就是设置环境变量dnsip的值,命令如下:

setenv dnsip 114.114.114.114
saveenv

设置好以后就可以使用dns命令查看百度官网的IP地址了,输入命令:

dns www.baidu.com

结果如下图所示:
dns命令结果
从上图可以看出,“www.baidu.com”的IP地址为12.215.177.38,说明dns命令工作正常,这个就是通过图形化命令来配置uboot,一般用来使能一些命令,就可以避免查找命令的宏然后去配置文件里面定义。

menuconfig图形化配置原理

make menuconfig过程分析

当输入make menuconfig以后会匹配到顶层Makefile的如下代码:
示例14.2.1.1 顶层Makefile代码段
这个在前面已经详细的讲解过了,其中build=-f ./scripts/Makefile.build obj,将542行的规则展开就是:

@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig

Makefile.build会读取scripts/kconfig/Makefile中的内容,在scripts/kconfig/Makefile中可以找到如下代码:
示例代码14.2.1.2 scripts/kconfig/Makefile代码段
其中obj=scripts/kconfig silent是设置静默编译的,在这里可以忽略不计,Kconfig=Kconfig,因此扩展以后就是:

menuconfig: scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig

目标menuconfig依赖scripts/kconfig/mconf,因此scripts/kconfig/mconf.c这个文件会被编译,生成mconf这个可执行文件。目标menuconfig对应的规则为scripts/kconfig/mconf Kconfig,也就是说 mconf会调用uboot根目录下的Kconfig文件开始构建图形配置界面。

Kconfig语法简介

上一小节已经知道了scripts/kconfig/mconf会调用uboot根目录下的Kconfig文件开始构建图形化配置界面,接下来简单学习一下Kconfig的语法。因为后面学习Linux驱动开发的时候可能会涉及到修改Kconfig,对于Kconfig语法不需要太深入的去究,关于Kconfig的详细语法介绍,可以参考linux内核源码(uboot源码没有)中的文件Documentation/kbuild/kconfig-language.txt,本节大概了解其原理即可。打开uboot根目录下的Kconfig,这个Kconfig文件就是顶层Kconfig,以这个文件为例来简单学习一下Kconfig语法。

mainmenu

顾名思义mainmenu就是主菜单,也就是输入“make menuconfig”以后打开的默认界面,在顶层Kconfig中有如下代码:
示例代码14.2.2.1 顶层Kconfig代码段
上述代码就是定义了一个名为“U-Boot $UBOOTVERSION Configuration”的主菜单,其中UBOOTVERSION=2020.01-stm32mp-r1,因此主菜单名为“U-Boot 2020.01-stm32mp-r1 Configuration”,如下图所示:
主菜单名字

调用其他目录下的Kconfig文件

和Makefile一样,Kconfig也可以调用其他子目录中的Kconfig文件,调用方法如下:

source "xxx/Kconfig" //xxx为具体的目录名,相对路径

在顶层Kconfig有如下代码:
示例代码14.2.2.2 顶层Kconfig代码段
从示例代码14.2.2.2中可以看出,顶层Kconfig文件调用了很多其他子目录下的Kcofig文件,这些子目录下的Kconfig文件在主菜单中生成各自的菜单项。

menu/endmenu条目

menu用于生成菜单,endmenu就是菜单结束标志,这两个一般是成对出现的。在顶层Kconfig中有如下代码:
示例代码14.2.2.3 顶层Kconfig代码段
示例代码14.2.2.3中有两个menu/endmenu代码块,这两个代码块就是两个子菜单,第15行的“menu “General setup””表示子菜单:“General setup”。第301行的“menu "Boot””表示子菜单“Boot images”。体现在主菜单界面中就如下图所示:
子菜单
在“General setup”菜单上面还有“Architecture select(ARM architecture)”和“ARM architecture”这两个子菜单,但是在顶层 Kconfig中并没有看到这两个子菜单对应的menu/endmenu代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig文件生成的。包括主界面中的“API”、“Boot timing”等等这些子菜单,都是分别由顶层 Kconfig所调用的api/Kconfig、common/Kconfig等这些子Kconfig文件来创建的。

config条目

顶层Kconfig中的“General setup”子菜单内容如下:

示例代码14.2.2.4 顶层Kconfig代码段 
15 menu "General setup" 
16 
17 config BROKEN 
18     bool 
19     help 
20       This option cannot be enabled. It is used as dependency 
21       for broken and incomplete features. 
22 
23 config DEPRECATED 
24     bool 
25     help 
...... 
29 
30 config LOCALVERSION 
31     string "Local version - append to U-Boot release" 
32     help 
...... 
39 
40 config LOCALVERSION_AUTO 
41     bool "Automatically append version information to the version string"
42     default y 
43     help 
...... 
59 
60 config CC_OPTIMIZE_FOR_SIZE 
61     bool "Optimize for size" 
62     default y 
63     help 
...... 
68 
69 config CC_COVERAGE 
70     bool "Enable code coverage analysis" 
71     depends on SANDBOX 
72     help 
...... 
75 
76 config DISTRO_DEFAULTS 
77     bool "Select defaults suitable for booting general purpose Linux distributions" 
78     select AUTO_COMPLETE 
...... 
102 
103 config ENV_VARS_UBOOT_CONFIG 
104     bool "Add arch, board, vendor and soc variables to default environment" 
105     help 
...... 
285 config ERR_PTR_OFFSET 
286     hex 
287     default 0x0 
288     help 
...... 
299 endmenu # General setup

可以看出,在menu/endmenu代码块中有大量的“config xxxx”的代码块,这就是config条
目。config条目就是“General setup”菜单的具体配置项,如下图所示:
General setup配置项
示例代码14.2.2.4中第30行的“config LOCALVERSION”对应着第一个配置项,“config LOCALVERSION_AUTO”对应着第二个配置项,以此类推。示例代码最前面还有“config BROKEN”和“config DEPRECATED”这两个配置项,但是上图中并没有这两个配置项,因为这两个配置项现在不能使能,所以也就看不到。

以“config LOCALVERSION”和“config LOCALVERSION_AUTO”这两个为例来分析一下 config配置项的语法:
示例代码14.2.2.5 顶层Kconfig代码段
第30和40行,这两行都以config关键字开头,后面跟着LOCALVERSION和LOCALVERSION_AUTO,这两个就是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会在.config文件中生成CONFIG_LOCALVERSION_AUTO,这个在上一小节讲解如何使能dns命令的时候讲过了。由此可知,.config文件中的“CONFIG_xxx(xxx就是
具体的配置项名字)就是Kconfig文件中config关键字后面的配置项名字加上“CONFIG_”前缀

config关键字下面的这几行是配置项属性,31-38行是LOCALVERSION的属性, 41-58行是LOCALVERSION_AUTO的属性。属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等

第31行的string是变量类型,也就是“CONFIG_ LOCALVERSION”的变量类型。可以为bool、tristate、string、hex和int,一共5种。最常用的是bool、tristate和string这三种,bool类型有两种值:y和n,当为y的时候表示使能这个配置项,当为n的时候就禁止这个配置项。tristate类型有三种值:y、m和n,其中y和n的涵义与bool类型一样,m表示将这个配置项编译为模块。string为字符串类型,所以LOCALVERSION是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如下图所示:
本地版本号配置
string后面的“Local version - append to U-Boot release”就是这个配置项在图形界面上的显示出来的标题。

第32行,help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或 “?”弹出来的帮助界面就是help的内容。

第41行,说明“CONFIG_LOCALVERSION_AUTO”是个bool类型,可以通过按下Y或N键来使能或者禁止CONFIG_LOCALVERSION_AUTO。

第42行,“default y”表示CONFIG_LOCALVERSION_AUTO的默认值就是y,所以这一行默认会被选中。

depends on和select

打开顶层Kconfig文件,在里面有这如下代码:
示例代码14.2.2.6 arch/Kconfig代码段
第432行,“depends on”说明SPL_FIT_SIGNATURE”项依赖于“SPL_DM”,也就是说“SPL_DM”被选中以后“SPL_FIT_SIGNATURE”才能被选中。

第433-434行,“select”表示反向依赖,当选中“SPL_FIT_SIGNATURE”以后“SPL_FIT”和“SPL_RSA”这两个也会被选中。

choice/endchoice

在arch/Kconfig文件中有如下代码:

示例代码14.2.2.7 arch/Kconfig代码段 
7 choice 
8     prompt "Architecture select" 
9     default SANDBOX 
10 
11 config ARC 
12     bool "ARC architecture" 
...... 
19 
20 config ARM 
21     bool "ARM architecture" 
...... 
25 
26 config M68K 
27     bool "M68000 architecture" 
...... 
32 
33 config MICROBLAZE 
34     bool "MicroBlaze architecture" 
...... 
37 
38 config MIPS 39 bool "MIPS architecture" 
...... 
43 
44 config NDS32 
45     bool "NDS32 architecture" 
46     select SUPPORT_OF_CONTROL 
47 
48 config NIOS2 
49     bool "Nios II architecture" 
...... 
55 
56 config PPC 
57     bool "PowerPC architecture" 
......
62 
63 config RISCV 
64     bool "RISC-V architecture" 
...... 
215 
216 config XTENSA 
217     bool "Xtensa architecture" 
218     select CREATE_ARCH_SYMLINK 
219     select SUPPORT_OF_CONTROL 
220 
221 endchoice

choice/endchoice代码段定义了一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。示例代码14.2.2.7就是选择处理器架构,可以从ARC、ARM、M68K等这些架构
中选择,这里是单选。在uboot图形配置界面上选择“Architecture select”,进入以后如下图所示:
架构选择界面
可以在上图中通过移动光标来选择所使用的CPU架构。第8行的prompt给出这个choice/endchoice段的提示信息为“Architecture select”。

menuconfig

menuconfig和menu很类似,但是menuconfig是个带选项的菜单,其一般用法为:
menuconfig用法
第1行,定义了一个可选的菜单MODULES,只有选中MODULES第3-5行if到endif之间的内容才会显示。在顶层Kconfig中有如下代码:
示例代码14.2.2.9 顶层Kconfig代码段
第187-221行使用menuconfig实现了一个菜单,路径如下:

General setup -> Configure standard U-Boot features (expert users) --->

如下图所示:
菜单Configure standard U-Boot features(expert users)
从上图可以看到,前面有“[ ]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是示例代码14.2.2.9中的第196-221行所描述的菜单,如下图所示:
菜单Init with zeros the memory reserved for malloc(slow)
如果不选择“Configure standard U-Boot features (expert users)”,那么示例代码14.2.2.9中的第196-221行所描述的菜单就不会显示出来,进去以后是空白的。

comment

comment用于注释,也就是在图形化界面中显示一行注释,打开文件drivers/mtd/nand/raw/Kconfig,有如下代码:
示例代码14.2.2.10 drivers/mtd/nand/raw/Kconfig代码段
第306行使用comment标注了一行注释,注释内容为:“Generic NAND options”,这行注释在配置项NAND_STM32_FMC2的下面。在图形化配置界面中按照如下路径打开:

-> Device Drivers -> MTD Support -> Raw NAND Device Support

结果如下图所示:
注释“Generic NAND options”
从上图可以看出,在配置项“Support for NAND controller on STM32MP SoCs”下面有一行注释,注释内容为“*** Generic NAND options ***”。

source

source用于读取另一个Kconfig,比如:

source "arch/Kconfig"

Kconfig语法就讲解到这里,基本上常用的语法就是这些,因为uboot相比Linux内核要小很多,所以配置项也要少很多,所以建议使用uboot来学习Kconfig。一般不会修改uboot中的Kconfig文件,甚至都不会使用uboot的图形化界面配置工具,本小节学习Kconfig的目的主要还是为了Linux内核作准备。

添加自定义菜单

图形化配置工具的主要工作就是在.config下面生成前缀为“CONFIG_”的变量,这些变量一般都有值,为y,m或n,在uboot源码里面会根据这些变量来决定编译哪个文件。本小节就来学习一下如何添加自己的自定义菜单,自定义菜单要求如下:

  1. 在主界面中添加一个名为“My test menu”,此菜单内部有一个配置项。
  2. 配置项为“MY_TESTCONFIG”,此配置项处于菜单“My test menu”中。
  3. 配置项的为变量类型为bool,默认值为y。
  4. 配置项菜单名字为“This is my test config”。
  5. 配置项的帮助内容为“This is a empty config, just for tset!”。

打开顶层Kconfig,在最后面加入如下代码:

示例代码14.3.1 自定义菜单 
1 menu "My test menu" 
2 
3 config MY_TESTCONFIG 
4     bool "This is my test config" 
5     default y 
6     help 
7       This is a empty config, just for test! 
8 
9 endmenu # my test menu

添加完成后打开图形化配置界面,如下图所示:
主界面
从上图可以看出,主菜单最后面出现了一个名为“My test menu”的子菜单,这个就是上面添加进来的子菜单。进入此子菜单,如下图所示:
“My test menu”子菜单
从上图可以看出,配置项添加成功,选中“This is my test config”配置项,然后按下“H”键打开帮助文档,如下图所示:
帮助信息
从上图可以看出,帮助信息也正确。配置项MY_TESTCONFIG默认也是被选中的,因此在.config文件中肯定会有“CONFIG_MY_TESTCONFIG=y”这一行,如下图所示:
.config文件
至此,在主菜单添加自己的自定义菜单就成功了,以后如果要编写Linux驱动,那么很有可能需要你来修改甚至编写Kconfig文件。Kconfig语法其实不难,重要的点就是那几个,最主要的是记住:Kconfig文件的最终目的就是在.config文件中生成以“CONFIG_”开头的变量

总结

本章的重点就是图形化界面的学习,主要就是对于Kconfig文件的解读。uboot可以用图形化界面配置,一般最多就是用图形化界面来定义宏从而使能功能。更多的意义是为了之后Linux内核的学习打下基础,熟悉一下Kconfig的语法,主要就是7个命令,通过这个命令来在.config文件中生成“CONFIG_”开头的变量。

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

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

相关文章

JMeter工具的介绍,安装

一、本文学习目标 1、能知道JMeter的优缺点 2、能掌握JMeter的安装流程 3、能掌握JMeter线程组的设置 4、能掌握JMeter参数化的使用 5、能掌握JMeter直连数据库操作 6、能掌握JMeter的断言. 二、JMeter简介 &#xff08;1&#xff09;Jmeter详细介绍 **JMeter&#xff08;A…

C++递归函数

在本文中&#xff0c;您将学习创建递归函数。调用自身的函数。 调用自身的函数称为递归函数。并且&#xff0c;这种技术称为递归。 递归在C 中如何工作&#xff1f; void recurse() {... .. ...recurse();... .. ... }int main() {... .. ...recurse();... .. ... } 下图显…

基于SSM+Vue的物流管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;VueHTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 …

[每日算法 - 阿里机试] leetcode19. 删除链表的倒数第 N 个结点

入口 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-nth-node-from-end…

(面试)谈谈我对C++面向对象特性的理解

&#x1f4af; 博客内容&#xff1a;C读取一行内个数不定的整数的方式 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&…

yolov5 web端部署进行图片和视频检测

目录 1、思路 2、代码结构 3、代码运行 4、api接口代码 5、web ui界面 6、参考资料 7、代码分享 1、思路 通过搭建flask微型服务器后端&#xff0c;以后通过vue搭建网页前端。flask是第一个第三方库。与其他模块一样&#xff0c;安装时可以直接使用python的pip命令实现…

字符串常量池位于JVM哪里

Java6 和6之前&#xff0c;常量池是存放在方法区&#xff08;永久代&#xff09;中的。Java7&#xff0c;将常量池是存放到了堆中。Java8 之后&#xff0c;取消了整个永久代区域&#xff0c;取而代之的是元空间。运行时常量池和静态常量池存放在元空间中&#xff0c;而字符串常…

c语言:通讯录管理系统(增删查改)

前言&#xff1a;在大多数高校内&#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计&#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来&#xff0c;可以很好的锻炼学生的编程思维&#xff0c;本文旨在为通讯录管理系统的设计提供思路和…

雷达散射截面(RCS)相关概念

一、雷达散射截面(RCS) RCS被指定为直径为1.128 m的完美导电球体的倍数。该球体的可见表面为1 m,但仅具有较小的反向散射有效面积。因此,更好的反射表面可以具有比其几何尺寸大得多的RCS。 雷达截面积 二、简单目标的RCS 简单目标的RCS如下表所示: 三、瑞利、米氏和光学…

基于SSM的家庭财务管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

SpringBoot banner 样式 自动生成

目录 SpringBoot banner 样式 自动生成 图案网站&#xff1a; 1.第一步创建banner.txt文件 2.访问网站Ascii艺术字实现个性化Spring Boot启动banner图案&#xff0c;轻松修改更换banner.txt文件内容&#xff0c;收集了丰富的banner艺术字和图&#xff0c;并且支持中文banner下…

echarts

1 type值汇总 不同的type的值对应的图表类型如下&#xff1a; type: ‘bar’&#xff1a;柱状/条形图 type: ‘line’&#xff1a;折线/面积图 type: ‘pie’&#xff1a;饼图 type: ‘scatter’&#xff1a;散点&#xff08;气泡&#xff09;图 type: ‘effectScatter’&…

ansible - Role

1、简介&#xff1a; Ansible 中的角色&#xff08;Role&#xff09;是一种组织和封装Playbook的方法&#xff0c;用于管理和组织 Ansible代码。它可以将任务和配置逻辑模块化&#xff0c;以便在不同的Playbook中共享和重用。 2、通过 role 远程部署并配置 nginx (1) 准备目…

数组(数据结构)

优质博文&#xff1a;IT-BLOG-CN 一、简介 数组Array是一种线性表数据结构&#xff0c;它用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。 数组因具有连续的内存空间的特点&#xff0c;数据拥有非常高效率的“随机访问”&#xff0c;时间复杂度为O(1)。但因要保…

ubuntu使用whisper和funASR-语者分离-二值化

文章目录 一、选择系统1.1 更新环境 二、安装使用whisper2.1 创建环境2.1 安装2.1.1安装基础包2.1.2安装依赖 3测试13测试2 语着分离创建代码报错ModuleNotFoundError: No module named pyannote报错No module named pyannote_whisper 三、安装使用funASR1 安装1.1 安装 Conda&…

黑豹程序员-架构师学习路线图-百科:Database数据库

文章目录 1、什么是Database2、发展历史3、数据库排行网4、总结 1、什么是Database 当今世界是一个充满着数据的互联网世界&#xff0c;各处都充斥着大量的数据。即这个互联网世界就是数据世界。 支撑这个数据世界的基石就是数据库&#xff0c;数据库也可以称为数据的仓库。 …

typescript开发环境搭建

typescript是基于javascript的强类型标记性语言&#xff0c;使用typescript语言可开发出不同规模的、易于扩展的web前端页面应用&#xff0c;本文主要描述typescript的开发环境搭建。 npm install -g typescript 如上所示&#xff0c;在本地开发环境中&#xff0c;使用nodejs…

基于Redis实现消息队列的实践

为什么要基于Redis实现消费队列&#xff1f; 消息队列是一种典型的发布/订阅模式&#xff0c;是专门为异步化应用和分布式系统设计的&#xff0c;具有高性能、稳定性及可伸缩性的特点&#xff0c;是开发分布式系统和应用系统必备的技术之一。目前&#xff0c;针对不同的业务场…

localhost和127.0.0.1都可以访问项目,但是本地的外网IP不能访问

使用localhost和127.0.0.1都可以访问接口&#xff0c;比如&#xff1a; http://localhost:8080/zhgl/login/login-fy-list或者 http://127.0.0.1:8080/zhgl/login/login-fy-list返回json {"_code":10000,"_msg":"Success","_data":…

Pytorch目标分类深度学习自定义数据集训练

目录 一&#xff0c;Pytorch简介&#xff1b; 二&#xff0c;环境配置&#xff1b; 三&#xff0c;自定义数据集&#xff1b; 四&#xff0c;模型训练&#xff1b; 五&#xff0c;模型验证&#xff1b; 一&#xff0c;Pytorch简介&#xff1b; PyTorch是一个开源的Python机…