【正点原子FPGA连载】第二十章Linux图形化配置及其原理 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

news2024/9/22 11:23:10

1)实验平台:正点原子MPSoC开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第二十章Linux图形化配置及其原理

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

14.1U-Boot图形化配置体验

uboot或Linux内核可以通过输入“make menuconfig”来打开图形化配置界面,menuconfig是一套图形化的配置工具,需要ncurses库支持。ncurses库提供了一系列的API函数供调用者生成基于文本的图形界面,因此需要先在Ubuntu中安装ncurses库(我们在安装Petalinux工具的时候已经安装,因而不需要再安装),命令如下:
sudo apt-get install build-essential libncurses5 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-linux-gnueabihf- zynq_altk_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
如果显示如下所示错误信息:
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
scripts/kconfig/Makefile:37: recipe for target ‘menuconfig’ failed
make[1]: *** [menuconfig] Error 1
Makefile:479: recipe for target ‘menuconfig’ failed
make: *** [menuconfig] Error 2
这是因为终端窗口有点小了,用鼠标调大点就可以了。
打开后的图形化界面如下图所示:
在这里插入图片描述

图 14.1.1 uboot图形化配置界面
上图就是主界面,主界面上方的英文就是简单的操作说明,操作方法我们在使用Petalinux时已经介绍过,具体见6.3.4节配置petalinux工程。
uboot有许多配置项,可通过键盘上的上下键移动到配置项。后面跟着“—>”表示此配置项有子配置项,按回车键就可以进入子配置项。
我们以如何使能dns命令为例,讲解一下如何通过图形化界面来配置uboot。进入“Command line interface —>”这个配置项,此配置项用于配置uboot的命令,进入以后如下图所示:
在这里插入图片描述

图 14.1.2 Command line interface配置项
从上图可以看出,有很多配置项,这些配置项也有子配置项,选择“Network commands —>”,进入网络相关命令配置项,如下图所示:
在这里插入图片描述

图 14.1.3 Network commands配置项
从上图可以看出,uboot中有很多和网络有关的命令,比如bootp、tftpboot、dhcp等等。选中dns,然后按下键盘上的“Y”键,此时dns前面的“[ ]”变成了“[ * ]”,如下图所示:
在这里插入图片描述

图 14.1.4选中dns命令
每个选项有3种编译选项,分别为:编译进uboot、取消编译(也就是不编译这个功能模块)、编译为模块。按下“Y”键表示编译进uboot,此时“[ ]”变成了“[ * ]”;按下“N”表示不编译,“[ ]”默认表示不编译;有些功能模块是支持编译为模块的,这个一般在Linux内核里面很常用,uboot下面不使用,如果要将某个功能编译为模块,那就按下“M”,此时“[ ]”就会变为“< M >”。
选中dns,然后按下“H”或者“?”键可以打开dns命令的提示信息,如下图所示:
在这里插入图片描述

图 14.1.5 dns命令提示信息
按两下ESC键即可退出提示界面,相当于返回上一层。选择dns命令以后,按两下ESC键(按两下ESC键相当于返回上一层),退出当前配置项,进入到上一层配置项。如果没有要修改的就按两下ESC键,退出到主配界面,如果也没有其他要修改的,那就再次按两下ESC键退出menuconfig配置界面。如果修改过配置的话,在退出主界面的时候会有如下图所示提示:
在这里插入图片描述

图 14.1.6是否保存新的配置文件对话框
上图询问是否保存新的配置文件,通过键盘的←或→键来选择“Yes”或“No”项,此处我们保持默认选择“Yes”,然后按下键盘上的回车键确认保存。至此,我们就完成了通过图形界面使能了uboot的dns命令,打开.config文件,会发现多了“CONFIG_CMD_DNS=y”这一行,如下图中的488行所示:
在这里插入图片描述

图 14.1.7.config文件
使用如下命令编译uboot:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
编译完成以后下载到开发板中运行,下载方式见12.3.3。下载完成后输入“?”查看是否有“dns”命令,一般肯定有的。测试一下dns命令工作是否正常,使用dns命令来查看一下百度官网“www.baidu.com”的IP地址。要先设置一下dns服务器的IP地址,也就是设置环境变量dnsip的值,命令如下:
setenv dnsip 114.114.114.114
saveenv
设置好以后就可以使用dns命令查看百度官网的IP地址了,输入命令:
dns www.baidu.com
结果如下图所示:
在这里插入图片描述

图 14.1.8 dns命令
从上图可以看出,“www.baidu.com”的IP地址为180.101.49.12,说明dns命令工作正常。这个就是通过图形化命令来配置uboot,一般用来使能一些命令还是很方便的,这样就不需要到处找命令的配置宏是什么,然后再到配置文件里面去定义。
14.2menuconfig图形化配置原理
14.2.1make menuconfig过程分析
当输入“make menuconfig”以后会匹配到顶层Makefile的如下代码:
示例代码 顶层Makefile代码段
478 %config: scripts_basic outputmakefile FORCE
479 ( Q ) (Q) (Q)(MAKE) $(build)=scripts/kconfig $@
这个在错误!未找到引用源。小节已经详细的讲解过了,其中build=-f ./scripts/Makefile.build obj,将479行的规则展开就是:
@ make -f ./scripts/Makefile.build obj=scripts/kconfig menuconfig //也可以没有@
Makefilke.build会读取scripts/kconfig/Makefile中的内容,在scripts/kconfig/Makefile中可以找到如下代码:
示例代码 scripts/kconfig/Makefile代码段
36 menuconfig: $(obj)/mconf
37 $< $(silent) $(Kconfig)
其中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文件开始构建图形配置界面。
14.2.2Kconfig语法简介
上一小节我们已经知道了scripts/kconfig/mconf会调用uboot根目录下的Kconfig文件开始构建图形化配置界面,接下来简单学习一下Kconfig的语法。因为后面学习Linux驱动开发的时候可能会涉及到修改Kconfig,对于Kconfig语法我们不需要太深入的去研究,关于Kconfig的详细语法介绍,可以参考linux内核源码(uboot源码中没有这个文件)中的文件Documentation/kbuild/kconfig-language.txt,本节我们大概了解其原理即可。打开uboot根目录下的Kconfig,这个Kconfig文件就是顶层Kconfig,我们就以这个文件为例来简单学习一下Kconfig语法。
1、mainmenu
故名思议mainmenu就是主菜单,也就是输入“make menuconfig”以后打开的默认界面,在顶层Kconfig中有如下代码:
示例代码 顶层Kconfig代码段
6 mainmenu “U-Boot $UBOOTVERSION Configuration”
上述代码就是定义了一个名为“U-Boot $UBOOTVERSION Configuration”的主菜单,其中UBOOTVERSION=2018.01,因此主菜单名为“U-Boot 2018.01 Configuration”,如下图所示:
在这里插入图片描述

图 14.2.1主菜单名字
2、调用其他目录下的Kconfig文件
和makefile一样,Kconfig也可以调用其他子目录中的Kconfig文件,调用方法如下:
source “xxx/Kconfig” //xxx为具体的目录名,相对路径
在顶层Kconfig中有如下代码:

示例代码 顶层Kconfig代码段source代码
13  source "arch/Kconfig"
......
403 source "api/Kconfig"
404 
405 source "common/Kconfig"
406 
407 source "cmd/Kconfig"
408 
409 source "disk/Kconfig"
410 
411 source "dts/Kconfig"
412 
413 source "env/Kconfig"
414 
415 source "net/Kconfig"
416 
417 source "drivers/Kconfig"
418 
419 source "fs/Kconfig"
420 
421 source "lib/Kconfig"
422 
423 source "test/Kconfig"

从上述示例代码中可以看出,顶层Kconfig文件调用了很多其他子目录下的Kcofig文件,这些子目录下的Kconfig文件在主菜单中生成各自的菜单项。
3、menu/endmenu条目
menu用于生成菜单,endmenu就是菜单结束标志,这两个成对出现,用于定义一个拥有若干配置选项或子菜单的配置菜单。在顶层Kconfig中有如下代码:

示例代码 顶层Kconfig代码段menu代码
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.
......
184 endmenu     # General setup
185 
186 menu "Boot images"
187 
188 config ANDROID_BOOT_IMAGE
189     bool "Enable support for Android Boot Images"
......
401 endmenu     # Boot images

上述示例代码中有两个menu/endmenu代码块,这两个代码块就是两个子菜单。第15行的“menu “General setup””表示子菜单“General setup”。第186行的“menu “Boot images””表示子菜单“Boot images”。体现在主菜单界面的效果如下图所示:
在这里插入图片描述

图 14.2.2子菜单
在“General setup”菜单上面还有“Architecture select (ARM architecture)”和“ARM architecture”这两个子菜单,但是在顶层Kconfig中并没有看到这两个子菜单对应的menu/endmenu代码块,那这两个子菜单是怎么来的呢?这两个子菜单就是arch/Kconfig文件生成的。包括主界面中的“Boot timing”、“Console recording”等等这些子菜单,都是分别由顶层Kconfig所调用的common/Kconfig、cmd/Kconfig等这些子Kconfig文件来创建的。
3、config条目
顶层Kconfig中的“General setup”子菜单内容如下:

示例代码 顶层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 LOCALVERSION
24      string "Local version - append to U-Boot release"
25      help
......
86  config SYS_MALLOC_F
87      bool "Enable malloc() pool before relocation"
88      default y if DM
89      help
......
95  config SYS_MALLOC_F_LEN
96      hex "Size of malloc() pool before relocation"
97      depends on SYS_MALLOC_F
98      default 0x400
99      help
......
132 menuconfig EXPERT
133     bool "Configure standard U-Boot features (expert users)"
134     default y
135     help
......
141 if EXPERT
142     config SYS_MALLOC_CLEAR_ON_INIT
143     bool "Init with zeros the memory reserved for malloc (slow)"
144     default y
145     help
......
166 endif # EXPERT
......
184 endmenu     # General setup

可以看出,在menu/endmenu代码块中有大量的“config xxxx”的代码块,也就是config条目。config条目就是“General setup”菜单的具体配置项,如下图所示:
在这里插入图片描述

图 14.2.3 General setup配置项
可以看到“config LOCALVERSION”对应着第一个配置项,“config LOCALVERSION_AUTO”对应着第二个配置项,以此类推,至于为什么没有“config BROKEN”的配置项,后面会说明。我们以“config LOCALVERSION”和“config LOCALVERSION_AUTO”这两个为例来分析一下config配置项的语法:

示例代码 顶层Kconfig代码段
23  config LOCALVERSION
24      string "Local version - append to U-Boot release"
25      help
26        Append an extra string to the end of your U-Boot version.
......
31        be a maximum of 64 characters.
32
33  config LOCALVERSION_AUTO
34      bool "Automatically append version information to the version string"
35      default y
36      help
37        This will try to automatically determine if the current tree is a
38        release tree by looking for Git tags that belong to the current
39        top of tree revision.
......
51    which is done within the script "scripts/setlocalversion".)

第23和33行,这两行都以“config”关键字开头,后面跟着“LOCALVERSION”和“LOCALVERSION_AUTO”,这两个是配置项名字。假如我们使能了LOCALVERSION_AUTO这个功能,那么就会在.config文件中生成CONFIG_LOCALVERSION_AUTO,这个在上一小节讲解如何使能dns命令的时候讲过了。由此可知,.config文件中的“CONFIG_xxx”(xxx是具体的配置项名字)就是Kconfig文件中config关键字后面的配置项名字加上“CONFIG_”前缀。
config关键字下面的几行是配置项属性,第2331行是LOCALVERSION的属性,第3351行是LOCALVERSION_AUTO的属性。属性里面描述了配置项的类型、输入提示、依赖关系、帮助信息和默认值等。
第24行的string是变量类型,也就是“CONFIG_ LOCALVERSION”的变量类型。变量类型一共有5种,分别是:bool、tristate、string、hex和int,最常用的是bool、tristate和string这三种。bool类型有两种值:y和n,当为y的时候表示使能该配置项,当为n的时候表示禁止该配置项。tristate类型有三种值:y、m和n,其中y和n的涵义与bool类型一样,m表示将这个配置项编译为模块。string为字符串类型,所以LOCALVERSION是个字符串变量,用来存储本地字符串,选中以后即可输入用户定义的本地版本号,如下图所示:
在这里插入图片描述

图 14.2.4本地版本号配置
可以在上图中输入本地版本号,此处我们只是演示下,不输入,直接按“OK”退出。
另外,可以看到“string”后面的“Local version - append to U-Boot release”对应该配置项在图形界面上显示出来的标题。也就是说变量类型后面的输入提示会显示在图形配置界面上。由于“config BROKEN”只有“boot”变量类型,没有对应输入提示,所以没有显示在图形配置界面上。
第25行,help表示帮助信息,告诉我们配置项的含义,当我们按下“h”或“?”弹出来的帮助界面就是help的内容。
第34行,说明“CONFIG_LOCALVERSION_AUTO”是个bool类型,可以通过按下Y或N键来使能或者禁止CONFIG_LOCALVERSION_AUTO。
第35行,“default y”表示CONFIG_LOCALVERSION_AUTO的默认值就是y,所以这一行默认会被选中。
4、depends on和select
打开arch/arm/Kconfig文件,在里面有这如下代码:

示例代码 arch/arm/Kconfig代码段
1    menu "ARM architecture"
2       depends on ARM
3    
4    config SYS_ARCH
5       default "arm"
6    
7    config ARM64
8       bool
9       select PHYS_64BIT
10      select SYS_CACHE_SHIFT_6
第2行的“depends on”说明“ARM architecture”项依赖于“ARM”,也就是说“ARM”被选中以后“ARM architecture”才会显示。

第9~10行的“select”表示反向依赖,当选中“ARM64”以后,“PHYS_64BIT”、“SYS_CACHE_SHIFT_6”这两个也会被选中。
4、choice/endchoice
在arch/Kconfig文件中有如下代码:

示例代码 arch/ Kconfig代码段
7   choice
8       prompt "Architecture select"
9       default SANDBOX
10  
11  config ARC
12      bool "ARC architecture"
......
20  config ARM
21      bool "ARM architecture"
......
30  config MICROBLAZE
31      bool "MicroBlaze architecture"
......
1156 
1157 endchoice

choice/endchoice代码段用来定义一组可选择项,将多个类似的配置项组合在一起,供用户单选或者多选。上述示例代码就是选择处理器架构,可以从ARC、ARM、MICROBLAZE等这些架构中选择,这里是单选。在uboot图形配置界面上选择“Architecture select”,进入以后如下图所示:
在这里插入图片描述

图 14.2.5架构选择界面
可以在上图中通过移动光标来选择所使用的CPU架构。第8行的prompt给出这个choice/endchoice段的提示信息为“Architecture select”。
5、menuconfig
menuconfig和menu很类似,但是menuconfig是个带选项的菜单,其一般用法为:

示例代码 menuconfig用法
1 menuconfig MODULES 
2     bool "菜单"
3 if MODULES
4 ...
5 endif # MODULES

第1行,定义了一个可选的菜单MODULES,只有选中了MODULES后第3~5行的if到endif之间的内容才会显示。在顶层Kconfig中有如下代码:

示例代码 顶层Kconfig代码段
15  menu "General setup"
......
132 menuconfig EXPERT
133     bool "Configure standard U-Boot features (expert users)"
134     default y
135     help
136       This option allows certain base U-Boot options and settings
137       to be disabled or tweaked. This is for specialized
138       environments which can tolerate a "non-standard" U-Boot.
139       Use this only if you really know what you are doing.
140 
141 if EXPERT
142     config SYS_MALLOC_CLEAR_ON_INIT
143     bool "Init with zeros the memory reserved for malloc (slow)"
144     default y
145     help
146       This setting is enabled by default. The reserved malloc
147       memory is initialized with zeros, so first malloc calls
......
157 
158 config TOOLS_DEBUG
159     bool "Enable debug information for tools"
160     help
161       Enable generation of debug information for tools such as mkimage.
162       This can be used for debugging purposes. With debug information
163       it is possible to set breakpoints on particular lines, single-step
164       debug through the source code, etc.
165 
166 endif # EXPERT
......
184 endmenu     # General setup

第132~166行使用menuconfig实现了一个菜单,路径如下:
General setup
-> Configure standard U-Boot features (expert users) —>
如下图所示:
在这里插入图片描述

图 14.2.6菜单Configure standard U-Boot features (expert users)
从上图可以看到,前面有“[ ]”说明这个菜单是可选的,当选中这个菜单以后就可以进入到子选项中,也就是示例代码“menuconfig EXPERT”的第141~166行所描述的配置项,如下图所示:
在这里插入图片描述

图 14.2.7 EXPERT子菜单
如果不使能“Configure standard U-Boot features (expert users)”菜单,那么示例代码“menuconfig EXPERT”的第141~166行所描述的配置项就不会显示出来,进去以后是空白的,不显示配置项。
6、comment
comment用于注释,也就是在图形化界面中显示一行注释,打开文件cmd/Kconfig,有如下所示代码:

示例代码 cmd/Kconfig代码段
117  source "cmd/fastboot/Kconfig"
118  
119  config BUILD_BIN2C
120     bool
121  
122  comment "Commands"

第122行使用comment标注了一行注释,注释内容为:“Commands”,该行注释在配置项Command line interface的下面。在uboot图形配置界面上选择“Command line interface —>”,进入后如下图所示:
在这里插入图片描述

图 14.2.8注释“Generic NAND options”
从上图可以看出,在配置项“Fastboot support”下面有一行注释,注释内容为“*** Commands ***”。
7、source
source用于读取另一个Kconfig,比如:
source “arch/Kconfig”
这个在前面已经讲过了。
Kconfig语法就讲解到这里,基本上常用的语法就是这些,因为uboot相比Linux内核要小很多,所以配置项也要少很多,所以建议大家使用uboot来学习Kconfig。一般无需修改uboot中的Kconfig文件,甚至都不会去使用uboot的图形化界面配置工具,本小节学习Kconfig的目的主要还是为了Linux内核作准备。

14.3添加自定义菜单

图形化配置工具的主要工作是在.config文件下面生成前缀为“CONFIG_”的变量,这些变量一般都有对应的值,为y、m、字符串或数字,在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,在最后面加入如下代码:

示例代码 自定义菜单
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 tset!
8 
9 endmenu       # my test menu

添加完成以后打开图形化配置界面,如下图所示:
在这里插入图片描述

图 14.3.1主界面
从上图可以看出,主配置界面最后面出现了一个名为“My test menu”的菜单,这个就是我们添加进来的自定义菜单。进入此菜单,如下图所示:
在这里插入图片描述

图 14.3.2“My test menu”子菜单
从上图可以看出,配置项添加成功,选中“This is my test config”配置项,然后按下“H”键打开帮助文档,如下图所示:
在这里插入图片描述

图 14.3.3帮助信息
从上图可以看出,帮助信息也显示正确。配置项“MY_TESTCONFIG”默认也是被选中的,因此在图形界面点击“Save”后退出,在.config文件中会有“CONFIG_MY_TESTCONFIG=y”这一行,如下图所示:
在这里插入图片描述

图 14.3.4.config文件
至此,我们成功的在主菜单添加的自定义菜单。以后大家如果去半导体原厂工作的话,如果要编写Linux驱动,那么很有可能需要你来修改甚至编写Kconfig文件。Kconfig语法其实不难,重要的点就是14.2.2小节中的那几个,最主要的是记住:Kconfig文件的最终目的是在.config文件中生成以“CONFIG_”开头的变量。

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

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

相关文章

Python获取信用企业的数据

文章目录前言一、需求二、分析三、测试运行前言 本系列文章来源于真实的需求本系列文章仅供学习参考本系列文章你来提我来做 one:Leave a message at the end of the article two:Get wechat contact information 一、需求 需求 URL&#xff1a;https://szxt.zjamr.zj.gov.cn…

如何保持线上安全:你们的个人网络安全指南

在互联网上保持安全的最佳做法。 我们之前写过关于保护你们的加密资产的文章——你们可以在此处查看我们的加密操作安全指南。现在是时候准备一组更通用的提示来帮助你们保持线上安全。我们知道你们可能大部分的购物都是在网上进行的&#xff0c;我们真的不希望你们被黑客攻击。…

HTB_Funnel_ssh隧道转发

文章目录信息收集hydra ssh 暴破ssh 隧道转发 postgresql 流量postgresql 使用动态端口转发信息收集 nmap -sC -sV 10.129.143.249 账号密码 Anonymous:ftp 发现两个文件&#xff0c;下载 默认密码 funnel123#!# 一封邮件 邮箱名可能是用户名 hydra ssh 暴破 hydra -L userna…

Redis_主从复制

一、介绍主机数据更新后根据配置和策略&#xff0c;自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主。二、作用读写分离&#xff0c;性能拓展容灾快速恢复&#xff08;一主多从&#xff09;三、搭建配置1、创建/myredis文件夹2、复制Re…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (二)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

【GPLT 二阶题目集】L2-041 插松枝

人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; --->每人手边有一只小盒子&#xff0c;初始状态为空。 --->每人面前有用不完的松枝干和一个推送器&#xf…

[NSSRound#7 Team]Web学习

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录系列文章目录一、ecRCE二、Shadowflag三、[NSSRound#7 Team]新的博客四、[NSSRound#7 Team]0o0提示&#xff1a;以下是本篇文章正文内容&#xff0c;下…

【异常】发送失败,此请求可能存在风险,已被微信拦截

一、背景说明 今天上线了新年红包的功能&#xff0c;但是部分用户提示了如下的异常&#xff0c;没有明显的异常提示&#xff0c;就是在查询ELK时&#xff0c;看了如下的错误提示&#xff0c;错误截图如图 提示“发送失败&#xff0c;此请求可能存在风险&#xff0c;已被微信拦…

【Redis】hmdp点赞、排行榜、分页功能的实现

【Redis】hmdp点赞、排行榜、分页功能的实现 文章目录【Redis】hmdp点赞、排行榜、分页功能的实现1.点赞功能实现1.1 需求1.2 实现步骤1.3 思路分析1.4 代码实现1.5 逻辑解析2. 排行榜功能实现2.1 需求2.2 实现步骤2.3 思路分析2.4 代码实现2.5 逻辑解析3. 分页功能实现3.1 需求…

算法之美~贪心算法

如何理解贪心算法&#xff1f;假设有一个可以容纳100kg物品的背包&#xff0c;可以装各种物品。有以下5种豆子&#xff0c;每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大&#xff0c;如何选择在背包中装哪些豆子&#xff1f;每种豆子又该装多少呢&#…

Pikachu靶场攻略(代码分析)

2023年将会持续于B站、CSDN等各大平台更新&#xff0c;可加入粉丝群与博主交流:838681355&#xff0c;为了老板大G共同努力。 一、安装 Phpstudy_pro设置数据库用户名密码 root 123456 更改\pikachu\inc\config.inc.php 访问pikachu页面点击配置即可。 二、 攻略(包含审计…

BiQuadDesigner相关算法研究

一、获取相关源码方法如下 1、打开BiQuadDesigner相关网页如下 2、菜单:更多工具->开发者工具 3、在此重点研究BiQuadDesigner,选择BiQuadDesigner下的javascript,分别查看BiQuad.js和BiQuadFilter.js 二、研究频响曲线生成步骤如下 1、参数输入及换算滤波器系数如下参…

【数据结构基础】线性表 - 栈和队列

知识点栈 - LIFO示意图实现使用数组实现的叫静态栈使用链表实现的叫动态栈队列 - FIFO示意图实现使用数组实现的叫静态队列使用链表实现的叫动态队列栈和队列相关题目用栈实现队列232. Implement Queue using Stacks (Easy)栈的顺序为后进先出&#xff0c;而队列的顺序为先进先…

【前端设计】复位保护模块的整体设计思路

前言 复位保护模块,是在单系统进行动态复位的过程中,对接口进行硬性逻辑保护,避免异步复位过程中的毛刺对周围系统产生影响的模块。一般而言,简单的单系统动态复位流程可以归纳为: 停止业务功能,收齐接口上的rsp,进入待复位状态;使能复位保护,通过逻辑避免毛刺和误触…

【SCL】博图SCL语言回顾和第一个面向对象程序

西门子SCL语言回顾复习和编写第1个面向对象程序 &#xff08;形参&#xff1a;形参指的是指令上标记该指令要使用的数据位置的标识符;简单来说就是只有数据类型&#xff0c;没有实际的地址&#xff0c;在调用时可以写入&#xff09;。 &#xff08;实参&#xff1a;实参指的是包…

并发编程学习(九):同步模式之顺序控制、交替打印

1、固定运行顺序例如&#xff1a;两个线程&#xff0c;运行是必须先2后1打印。1.1、Object之wait、notify版在同步代码块中&#xff0c;wait开始后&#xff0c;CPU将释放给另一个线程使用&#xff0c;直到①若wait(xxxx)&#xff0c;则x秒后当前线程被唤醒&#xff0c;继续占用…

STM32项目设计:基于stm32f103c8t6智能电梯系统

文章目录一、项目功能概述二、项目材料选择三、原理图设计四、PCB板设计五、主程序设计六、成品展示资料链接&#xff1a;待更新~ 哔哩哔哩视频链接&#xff1a;https://www.bilibili.com/video/BV17D4y1V7HG/?vd_sourcee5082ef80535e952b2a4301746491be0&#xff08;bilibili…

STM32G431——串口通信

蓝桥杯嵌入式——串口通信 目录 USART 电平标准-TTL 电平标准与 RS232 电平标准 232通信标准 USB转232 异步通信 串口配置 程序设计 重定向 串口发送函数 发送字符串 串口接收——中断 1.USART 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异…

集成测试最全详解,看完必须懂了

什么是集成测试 集成测试&#xff08;Integration Testing&#xff09;&#xff0c;也叫组装测试或联合测试。在单元测试的基础上&#xff0c;将所有模块按照设计要求&#xff08;如根据结构图&#xff09;组装成为子系统或系统&#xff0c;进行集成测试。 集成测试&#xff…

chatgpt的一些思考

结论国内同行对chatgpt的认识是不够的&#xff0c;太轻视这个模式的颠覆性认知chatgpt是对思维过程的仿真&#xff0c;rlhf过程就是通过强化学习方式在利用人思维过程训练模型chatgpt比搜索更通用化&#xff0c;搜索是对单个点信息的匹配&#xff0c;chatgpt是对思维链一个序列…