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

Versal - 基础6(Linux 开发 AIE-ML + 自动化脚本解析)

目录

1. 简介

2. 步骤解析

2.1 概览

2.1.1 步骤依赖关系

2.1.2 总目录结构

2.2 Vitis XPFM

2.2.1 Dir

2.2.2 Makefile

2.2.3 vitis_pfm.py

2.3 Kernels

2.3.1 Dir

2.3.2 Makefile

2.3.3 config 文件

2.4 AIE_app

2.4.1 Dir

2.4.2 Makefile

2.4.3 aie 要点

2.5.1 Link 概要

2.5.2 Makefile

2.5.3 system.cfg

2.6 Host_app

2.6.1 Dir

2.6.2 sdk

2.6.2 Makefile

2.7 Package

2.8 在硬件中运行

2.8.1 烧写

2.8.2 运行

3. All Makefile

4. 总结


1. 简介

本文以官方 AIE/Feature_Tutorials/09-debug-walkthrough/ 示例为基准,在 VD100 硬件平台上实现 Linux 开发 AIE,并分析自动化脚本。

Feature_Tutorials/09-debug-walkthrough /cmd_src/https://github.com/Xilinx/Vitis-Tutorials/tree/2024.1/AI_Engine_Development/AIE/Feature_Tutorials/09-debug-walkthrough/cmd_src

同时参考 XD101 文档:《Vitis Tutorials: Vitis Platform Creation (XD101)》
Vitis Tutorials: Vitis Platform Creation (XD101)https://docs.amd.com/r/2024.1-English/Vitis-Tutorials-Vitis-Platform-Creation/Customize-Root-File-System-Kernel-Device-Tree-and-U-boot

2. 步骤解析

2.1 概览

2.1.1 步骤依赖关系

  • Vivado XSA
    • 输入:HW Design
    • 输出:Vivado XSA
  • Petalinux
    • 输入:Vivado XSA
    • 输出:Linux 镜像
  • Vitis XPFM
    • 输入:Vivado XSA、Linux 镜像(通用镜像 或者 petalinux)
    • 输出:Vitis platform(*.xpfm)
  • Kernels
    • 输入:.xpfm、s2mm.cpp、s2mm.cfg、mm2s.cpp、mm2s.cfg
    • 输出:s2mm.xo、mm2s.xo
  • AIE_app
    • 输入:.xpfm、aie 目录所有文件(.cpp / .cc / .h)
    • 输出:libadf.a
  • Vpp_link_XSA
    • 输入:.xpfm、s2mm.xo、mm2s.xo、libadf.a
    • 输出:binary_container_1.xsa
  • Host_app
    • 输入:Linux 镜像(sdk)、host.cpp
    • 输出:host.exe
  • Package
    • ​​​​​​​输入:.xpfm、Linux 镜像、host.exe、binary_container_1.xsa、libadf.a
    • 输出:sd_card.img

2.1.2 总目录结构

├── aie
│   ├── graph.cpp
│   ├── graph.h
│   └── kernels
│       ├── data_shuffle.cc
│       ├── kernels.h
│       ├── peak_detect.cc
│       └── upscale.cc
├── data
│   └── inx.txt
├── Makefile
├── platform
│   ├── Makefile
│   ├── petalinux
│   │   ├── vd100
│   │   └── vd100_ex_pfm.xsa
│   └── vitis_pfm.py
├── pl_kernels
│   ├── mm2s.cfg
│   ├── mm2s.cpp
│   ├── s2mm.cfg
│   └── s2mm.cpp
├── sw
│   ├── data.h
│   ├── embedded_exec.sh
│   └── host.cpp
└── system.cfg

2.2 Vitis XPFM

2.2.1 Dir

├── Makefile
├── petalinux
│   ├── vd100
│   │   ├── build
│   │   ├── components
│   │   ├── images
│   │   └── project-spec
│   └── vd100_ex_pfm.xsa
└── vitis_pfm.py

1)在 images/linux 目录下,有重要的组件:

NameDescriptionComponent
ImageLinux kernel ImageLinux Software Components
rootfs.ext4Linux file systemLinux Software Components
sysrootCross compile and header filesLinux SDK
boot.scrU-boot configuration file to store in FAT32 partition of SD cardFAT32 partition
bl31.elfArm trusted firmware / secure monitorBOOT.BIN
u-boot.elfSecond stage boot loaderBOOT.BIN
system.dtbDevice tree information fileBOOT.BIN

注:内核映像、Linux 文件系统和 Sysroot 并非 Vitis 平台本身必需的组件,它们用于编译应用程序和生成 SD 卡映像。

2)通用镜像下载地址

Common Images for Embedded Vitis Platforms - 2024.1 Vivado, Vitis, Vitis Embedded Platform, PetaLinux, Device modelshttps://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/embedded-platforms/2024-1.html通用镜像包不包括 DTB 文件,因此需要额外步骤使用 createdts 命令生成设备树文件。

2.2.2 Makefile

1)本级 Makefile

.PHONY: vitis_pfm clean check_vitisvitis_pfm: check_vitisvitis -s vitis_pfm.pyclean:rm -rf ./vitis_pfm/check_vitis:@command -v vitis > /dev/null 2>&1 || { echo >&2 "Source Vitis Settings first."; exit 1; }

2)上级 Makefile

###########################################################################
RELATIVE_PATH := /platform/vitis_pfm/platform/export/platform/platform.xpfm
VITIS_PLATFORM := $(CURDIR)$(RELATIVE_PATH)vitis_platform: $(VITIS_PLATFORM)$(VITIS_PLATFORM):$(MAKE) vitis_pfm -C platform
###########################################################################

$(MAKE) :是一个特殊的变量,它引用当前正在使用的 make 工具的命令。

代码作用:从当前的 Makefile 中,切换到 platform 目录,递归地调用 make 命令,并在那个目录的 Makefile中执行 vitis_pfm 目标。

2.2.3 vitis_pfm.py

import vitisclient = vitis.create_client()
client.set_workspace(path="./vitis_pfm")platform = client.create_platform_component(name = "platform",hw_design = "./petalinux/vd100_ex_pfm.xsa",os = "linux",cpu = "psv_cortexa72",domain_name = "linux_psv_cortexa72")domain = platform.add_domain(cpu = "ai_engine", os = "aie_runtime", name = "aie_app", display_name = "aie_app")domain = platform.get_domain(name="linux_psv_cortexa72")status = domain.generate_bif()status = domain.set_qemu_args(qemu_option="PS", path="./vitis_pfm/platform/resources/linux_psv_cortexa72/qemu/qemu_args.txt")
status = domain.set_qemu_args(qemu_option="PMC", path="./vitis_pfm/platform/resources/linux_psv_cortexa72/qemu/pmc_args.txt")
status = domain.set_bif(path="./vitis_pfm/platform/resources/linux_psv_cortexa72/linux.bif")
status = domain.set_dtb(path="./petalinux/vd100/images/linux/system.dtb")
status = domain.set_boot_dir(path="./petalinux/vd100/images/linux")status = platform.build()
  • domain.generate_bif() 用于生成 linux.bif 文件。文件内容如下:
/* linux */
the_ROM_image:
{{ load=0x1000, file=<dtb,boot/system.dtb> }{ core=a72-0, exception_level=el-3, trustzone, file=<atf,boot/bl31.elf> }{ core=a72-0, exception_level=el-2, load=0x8000000, file=<uboot,boot/u-boot.elf> }
}

2.3 Kernels

2.3.1 Dir

├── pl_kernels
│   ├── mm2s.cfg
│   ├── mm2s.cpp
│   ├── s2mm.cfg
│   └── s2mm.cpp

2.3.2 Makefile

######################################################
VPP_XO_FLAGS := --compile   \--mode hls  \--platform $(VITIS_PLATFORM)kernels: ./pl_kernels/s2mm.xo ./pl_kernels/mm2s.xo./pl_kernels/s2mm.xo:v++ $(VPP_XO_FLAGS) --config ./pl_kernels/s2mm.cfg./pl_kernels/mm2s.xo:v++ $(VPP_XO_FLAGS) --config ./pl_kernels/mm2s.cfg
######################################################

2.3.3 config 文件

1)s2mm.cfg

[hls]
flow_target=vitis
syn.file=./s2mm.cpp
syn.cflags=-I.
syn.top=s2mm
syn.debug.enable=1
package.ip.name=s2mm
package.output.syn = true
package.output.format=xo
package.output.file=s2mm.xo

2)mm2s.cfg

[hls]
flow_target=vitis
syn.file=./mm2s.cpp
syn.cflags=-I.
syn.top=mm2s
syn.debug.enable=1
package.ip.name=mm2s
package.output.syn = true
package.output.format=xo
package.output.file=mm2s.xo

2.4 AIE_app

2.4.1 Dir

├── aie
│   ├── graph.cpp
│   ├── graph.h
│   └── kernels
│       ├── data_shuffle.cc
│       ├── kernels.h
│       ├── peak_detect.cc
│       └── upscale.cc

2.4.2 Makefile

############################################################
AIE_INCLUDES := --include "./aie"          \--include "./data"         \--include "./aie/kernels"  \--include "./"             \--include "$(XILINX_VITIS)/aietools/include"aie: ./libadf.a./libadf.a:v++ --compile                       \--mode aie                      \--target hw                     \--platform $(VITIS_PLATFORM)    \--work_dir "./Work"             \$(AIE_INCLUDES)                 \--input_files "./aie/graph.cpp"@echo "COMPLETE: libadf.a created."
############################################################

2.4.3 aie 要点

在 Vitis 平台中编译和连接 AI Engine ADF Graph 的要点:

1)ADF Graph 与 Vitis PFM 的连接:

  • ADF Graph 可以与 Vitis Extensible Platform 连接。
  • Graph 的输入/输出(I/O)可以通过 v++ 连接指令连接到平台端口或 Vitis 内核的端口。

2)AI Engine ADF C++ Graph 的组成:

  • AI Engine ADF C++ Graph 仅包含 AI Engine 内核。
  • AI Engine 内核之间的所有互连都在 C++ Graph(project.h)中定义。

3)外部I/O的连接:

  • 所有与外部I/O的连接都在C++仿真测试平台(graph.cpp)中完全指定,该测试平台实例化了C++ ADF图对象。
  • 从 Graph 到 PLIO(Programmable Logic I/O)的所有平台连接都映射到 AI Engine 子系统图的端口上,这些端口通过 v++ 连接指令进行连接。

4)v++的限制:

  • v++ 不允许存在悬空端口或隐式连接。

5)流连接的指定:

  • 流连接通过 v++ 的 --sc 选项指定。
  • 可以使用基于 PL 的 Data Mover,这些 Data Mover 可以在平台中定义,也可以在 ADF Graph 外部定义为 Vitis PL 内核。

2.5.1 Link 概要

在 AIE_app、PL kernel 完成编译和模拟后,可以使用 v++ 将它们与平台链接起来,以生成一个 .xsa 文件。

2.5.2 Makefile

##############################################################
xsa: ./binary_container_1.xsa./binary_container_1.xsa:v++ --link                                \--target hw                           \--platform $(VITIS_PLATFORM)          \--config "./system.cfg"               \--output "./binary_container_1.xsa"   \--input pl_kernels/s2mm.xo pl_kernels/mm2s.xo libadf.a@echo "COMPLETE: .xsa created."
##############################################################

2.5.3 system.cfg

system.cfg 中的内容:

debug=1
save-temps=1
temp_dir=binary_container_1
report_dir=binary_container_1/reports
log_dir=binary_container_1/logs[advanced]
misc=solution_name=binary_container_1
param=compiler.addOutputTypes=hw_export[connectivity]
nk=mm2s:1:mm2s
nk=s2mm:2:s2mm_1.s2mm_2
sc=mm2s.s:ai_engine_0.inx
sc=ai_engine_0.data_shuffle:s2mm_1.s
sc=ai_engine_0.upscale_out:s2mm_2.s

2.6 Host_app

2.6.1 Dir

├── sw
│   ├── data.h
│   ├── embedded_exec.sh
│   └── host.cpp

2.6.2 sdk

1)Source ENV

与 sw_emu 中使用 g++ 编译器编译 host 不同,在 hw/hw_emu 中,需要使用 Arm cross-compiler aarch64-xilinx-linux-g++。因此需要使用 sdk。

source ./platform/petalinux/vd100/images/linux/sdk/environment-setup-cortexa72-cortexa53-xilinx-linux

2)CXX 已包含的内容:

>> echo $CXX
---
aarch64-xilinx-linux-g++         \-mcpu=cortex-a72.cortex-a53  \-march=armv8-a+crc           \-fstack-protector-strong     \-O2                          \-D_FORTIFY_SOURCE=2          \-Wformat                     \-Wformat-security            \-Werror=format-security      \--sysroot=<sdk>/sysroots/cortexa72-cortexa53-xilinx-linux

2.6.2 Makefile

#############################################################
GCC_FLAGS := -Wall -c -g \-std=c++17 -Wno-int-to-pointer-castGCC_INCLUDES = -I$(SDKTARGETSYSROOT)/usr/include/xrt \-I$(SDKTARGETSYSROOT)/usr/include     \-I./GCC_LIB := -lxrt_coreutilhost: ./sw/host.exe./sw/host.exe: ./sw/host.cppcd ./sw$(CXX) $(GCC_FLAGS) $(GCC_INCLUDES) -o host.o host.cpp$(CXX) *.o $(GCC_LIB) -std=c++17 -o host.exe@echo "COMPLETE: Host application created."
#############################################################

2.7 Package

1)Makefile

###########################################################################
ROOTFS = $(CURDIR)/platform/petalinux/vd100/images/linux/rootfs.ext4
IMAGE = $(CURDIR)/platform/petalinux/vd100/images/linux/Imagepackage: ./sw/sd_card.img./sw/sd_card.img:cd ./swv++ --package                               \--target hw                             \--platform $(VITIS_PLATFORM)            \--package.rootfs=$(ROOTFS)              \--package.image_format=ext4             \--package.boot_mode=sd                  \--package.kernel_image=$(IMAGE)         \--package.defer_aie_run                 \--package.sd_file ./embedded_exec.sh    \--package.sd_file ./host.exe ../binary_container_1.xsa ../libadf.a@echo "COMPLETE: Package created."
###########################################################################

2)选项解释

  • --package 流程将自动创建一个 a.xclbin 文件。
  • --package.defer_aie_run:AIE cores 将由 ps_app 启用。如果未设置,则在 PDI 加载期间生成 CDO 命令以启用 AIE cores。此操作在输入文件含 AIE Compiler archive file(libadf.a)并与 Versal 平台一起使用时有效。

3)输出

在 sw 目录下,输出 ​​​​​​​sd_card.img 文件,用于烧写。

2.8 在硬件中运行

2.8.1 烧写

烧写方法见:3.9 Run on VD100https://blog.csdn.net/DongDong314/article/details/145429197?spm=1001.2014.3001.5501#t35

2.8.2 运行

>> sudo su
>> cd /run/media/mmcblk1p1/
>> ls -l
---
total 30279
-rwxrwx--- 1 root disk  2694800 Jan  1  2015 BOOT.BIN
-rwxrwx--- 1 root disk 23865856 Jan  1  2015 Image
-rwxrwx--- 1 root disk  4118215 Jan  1  2015 a.xclbin
-rwxrwx--- 1 root disk     3472 Jan  1  2015 boot.scr
-rwxrwx--- 1 root disk      166 Jan  1  2015 embedded_exec.sh
-rwxrwx--- 1 root disk   321048 Jan  1  2015 host.exe

运行结果:

>> ./host.exe a.xclbin
---
XAIEFAL: INFO: Resource group Avail is created.
XAIEFAL: INFO: Resource group Static is created.
XAIEFAL: INFO: Resource group Generic is created.
Input memory virtual addr 0x0xffffb5997000x
Output memory virtual addr 0x0xffffb5996000x
Output memory virtual addr 0x0xffffb5995000x
run mm2s
run s2mm
graph run
graph end
After MM2S wait
After S2MM_1 wait
After S2MM_2 wait
TEST PASSED

3. All Makefile

在 Makefile 中有段检查环境的脚本,用于确保系统已正确安装 v++ 工具,并且 CXX 和 SDKTARGETSYSROOT 这两个关键变量已被定义。如果缺少其中的任何一个,会打印错误并中断构建。它们依次执行如下功能:

  • 检查 v++ 是否存在
  • 检查 CXX 是否定义
  • 检查 SDKTARGETSYSROOT 是否定义
##############################################################
ifeq (, $(shell which v++))$(error v++ not found, please install it or check your PATH)
endififeq ($(origin CXX), undefined)$(error CXX is not defined)
endififeq ($(origin SDKTARGETSYSROOT), undefined)$(error SDKTARGETSYSROOT is not defined)
endif.ONESHELL:
.PHONY: clean all vitis_platform kernels aie xsa host packageall: vitis_platform kernels aie xsa host package
#########################################################################################################################################
RELATIVE_PATH := /platform/vitis_pfm/platform/export/platform/platform.xpfm
VITIS_PLATFORM := $(CURDIR)$(RELATIVE_PATH)vitis_platform: $(VITIS_PLATFORM)$(VITIS_PLATFORM):$(MAKE) vitis_pfm -C platform
#################################################################################################################################
VPP_XO_FLAGS := --compile   \--mode hls  \--platform $(VITIS_PLATFORM)kernels: ./pl_kernels/s2mm.xo ./pl_kernels/mm2s.xo./pl_kernels/s2mm.xo:v++ $(VPP_XO_FLAGS) --config ./pl_kernels/s2mm.cfg./pl_kernels/mm2s.xo:v++ $(VPP_XO_FLAGS) --config ./pl_kernels/mm2s.cfg
##################################################################################################################
AIE_INCLUDES := --include "./aie"          \--include "./data"         \--include "./aie/kernels"  \--include "./"             \--include "$(XILINX_VITIS)/aietools/include"aie: ./libadf.a./libadf.a:v++ --compile                       \--mode aie                      \--target hw                     \--platform $(VITIS_PLATFORM)    \--work_dir "./Work"             \$(AIE_INCLUDES)                 \--input_files "./aie/graph.cpp"@echo "COMPLETE: libadf.a created."
##########################################################################################################################
xsa: ./binary_container_1.xsa./binary_container_1.xsa:v++ --link                                \--target hw                           \--platform $(VITIS_PLATFORM)          \--config "./system.cfg"               \--output "./binary_container_1.xsa"   \--input pl_kernels/s2mm.xo pl_kernels/mm2s.xo libadf.a@echo "COMPLETE: .xsa created."
###########################################################################################################################
GCC_FLAGS := -Wall -c -g \-std=c++17 -Wno-int-to-pointer-castGCC_INCLUDES = -I$(SDKTARGETSYSROOT)/usr/include/xrt \-I$(SDKTARGETSYSROOT)/usr/include     \-I./GCC_LIB := -lxrt_coreutilhost: ./sw/host.exe./sw/host.exe: ./sw/host.cppcd ./sw$(CXX) $(GCC_FLAGS) $(GCC_INCLUDES) -o host.o host.cpp$(CXX) *.o $(GCC_LIB) -std=c++17 -o host.exe@echo "COMPLETE: Host application created."
########################################################################################################################################
ROOTFS = $(CURDIR)/platform/petalinux/vd100/images/linux/rootfs.ext4
IMAGE = $(CURDIR)/platform/petalinux/vd100/images/linux/Imagepackage: ./sw/sd_card.img./sw/sd_card.img:cd ./swv++ --package                               \--target hw                             \--platform $(VITIS_PLATFORM)            \--package.rootfs=$(ROOTFS)              \--package.image_format=ext4             \--package.boot_mode=sd                  \--package.kernel_image=$(IMAGE)         \--package.defer_aie_run                 \--package.sd_file ./embedded_exec.sh    \--package.sd_file ./host.exe ../binary_container_1.xsa ../libadf.a@echo "COMPLETE: Package created."
###############################################################################################################################################################################
clean:rm -f pl_kernels/s2mm.xo pl_kernels/mm2s.xo libadf.a *.log *.db *.csv *.jsonrm -rf ./*binary_container_1* ./Work/ ./s2mm/ ./mm2s/ ./.ipcache ./platform/vitis_pfm/rm -f sw/sd_card.img sw/*.o sw/*.exe sw/*.xclbin sw/*.bin sw/*.BIN sw/*.bif sw/*.txt sw/*summaryrm -rf sw/sd_card/ sw/*.log sw/.Xil/ sw/_x/

4. 总结

  • 滤清 “2.1.1 步骤依赖关系” 非常重要,理解其中的输入输出关系。
  • Vpp_link_XSA 步骤是调用 vivado 执行综合、布局布线。
  • host.exe 存在问题,无法第二次运行。需要解决。

​​​​​​​

相关文章:

Versal - 基础6(Linux 开发 AIE-ML + 自动化脚本解析)

目录 1. 简介 2. 步骤解析 2.1 概览 2.1.1 步骤依赖关系 2.1.2 总目录结构 2.2 Vitis XPFM 2.2.1 Dir 2.2.2 Makefile 2.2.3 vitis_pfm.py 2.3 Kernels 2.3.1 Dir 2.3.2 Makefile 2.3.3 config 文件 2.4 AIE_app 2.4.1 Dir 2.4.2 Makefile 2.4.3 aie 要点 2.…...

什么是矩阵账号?如何高效运营tiktok矩阵账号

‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​​​‌​‌​‍‌​​‌​​‌​‍‌​‌‌​‌‌‌‍‌​‌​‌​​​‍‌​​‌​‌‌​‍‌​​​​‌‌​‍‌​‌​​‌‌‌‍‌​​‌‌​‌​‍‌​‌​​‌‌‌‍‌​‌‌‌​​‌‍‌‌​​‌‌‌​‍‌‌​​‌‌​​‍‌…...

tortoiseSVN 如何克隆项目到本地

导入项目成功&#xff0c;如下图&#xff1a;...

趣解PostGet请求的原理、应用场景及区别

趣解Post&Get请求的原理、应用场景及区别 POST 和 GET 的「身份之谜」&#xff1a;快递员与侦探的终极对决 一、角色设定&#xff1a;快递员&#xff08;POST&#xff09; vs 侦探&#xff08;GET&#xff09; GET&#xff08;侦探&#xff09;&#xff1a; 任务&#xff…...

在PHP Web开发中,实现异步处理有几种常见方式的优缺点,以及最佳实践推荐方法

1. 消息队列 使用消息队列&#xff08;如RabbitMQ、Beanstalkd、Redis&#xff09;将任务放入队列&#xff0c;由后台进程异步处理。 优点&#xff1a; 任务持久化&#xff0c;系统崩溃后任务不丢失。 支持分布式处理&#xff0c;扩展性强。 实现步骤&#xff1a; 安装消息…...

深入解析过滤器模式:数据筛选与处理的高效工具

过滤器模式&#xff1a;数据筛选与处理的高效工具 在软件开发的复杂领域中&#xff0c;数据的筛选与处理是常见的任务。过滤器模式作为一种实用的设计模式&#xff0c;为解决这类问题提供了有效的解决方案。它允许开发者根据不同的标准对一组对象进行过滤操作&#xff0c;从而…...

DeepSeek R1/V3满血版——在线体验与API调用

前言&#xff1a;在人工智能的大模型发展进程中&#xff0c;每一次新模型的亮相都宛如一颗投入湖面的石子&#xff0c;激起层层波澜。如今&#xff0c;DeepSeek R1/V3 满血版强势登场&#xff0c;为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...

排序链表--字节跳动

少年的书桌上没有虚度的光阴 题目描述 请你对链表进行排序 思路分析 核心思想&#xff1a;归并排序 有三个部分 链表排序实现 1. merge 函数 21.见 合并两个有序链表&#xff0c; 首先创建一个虚拟头节点 newhead&#xff0c;并使用指针 tail 来构建合并后的链表。 通过…...

Python爬虫-批量爬取股票数据猫各股票代码

前言 本文是该专栏的第47篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以股票数据猫为例子,基于Python爬虫,批量获取各股票代码数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废话不多说,下面跟着笔者直接往下看正文详细内容。(附…...

打开Firefox自动打开hao360.hjttif.com标签解决方案

现象 打开Firefox自动打开hao360.hjttif.com标签&#xff0c;同时用户自己设置的主页也会在一个新标签打开。点击hjttif这个标签&#xff0c;就会跳转到hao.360.com 打开Edge不会出现上述现象。搜遍全网都找不到解决方法。博客园上有一篇文章2025-02-14.防流氓软件篡改主页提到…...

【爬虫基础】第一部分 网络通讯-编程 P3/3

上节内容回顾&#xff1a;【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 前言 1.知识点碎片化&#xff1a;每个网站实现…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_atoi 函数

ngx_atoi 声明在 src/core/ngx_string.h ngx_int_t ngx_atoi(u_char *line, size_t n); 定义在 src/core/ngx_string.c ngx_int_t ngx_atoi(u_char *line, size_t n) {ngx_int_t value, cutoff, cutlim;if (n 0) {return NGX_ERROR;}cutoff NGX_MAX_INT_T_VALUE / 10;cutlim…...

PG:ERROR: cannot freeze committed xmax

目录 原因**问题原因****PostgreSQL 底层逻辑** 解决方案1**问题分析****排查步骤****1. 检查长时间运行的事务****2. 检查未提交的事务****3. 检查 autovacuum 配置****4. 检查事务 ID 使用情况****5. 检查表的 relfrozenxid** **解决方法****1. 手动运行 VACUUM FREEZE****2.…...

《论软件的可靠性评价》审题技巧 - 系统架构设计师

论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节&#xff0c;是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容&#xff1a; 首先&#xff0c;本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…...

【项目设计】自主HTTP服务器

目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI、URL、URN HTTP的协议格式 HTTP响应协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CGI机制的概念 CGI机制的实现步骤 CGI机制的意义 …...

Linux操作系统:基于Linux的个人Web服务器搭建与自动化运维实践

基于Linux的个人Web服务器搭建与自动化运维实践 摘要 在互联网的海洋中&#xff0c;每个人都想拥有一艘属于自己的小船——一个个人Web服务器。Linux作为开源界的“老大哥”&#xff0c;无疑是搭建Web服务器的最佳选择。本文通过幽默风趣的方式&#xff0c;详细介绍了在Linux…...

[创业之路-321]:创新开拓思维和经营管理思维的比较

目录 一、概述 1.1、定义与内涵 1、创新开拓思维&#xff1a; 2、经营管理思维&#xff1a; 1.2、特点与优势 1、创新开拓思维的特点与优势&#xff1a; 2、经营管理思维的特点与优势&#xff1a; 3、应用场景与限制 4、总结 二、创新开拓思维与经营管理思维&#xf…...

vivado修改下载器下载速率

Error Launching Program X Error while launching program: fpga configuration failed. DONE PIN is not HIGH 原因是下载器速度太快了。先从任务管理器中关闭hw_server.exe试一下,要是不行就按下面三种方法解决。 第一种方法可以不用修改下载速度,直接先从vivado中将bit流…...

运维基线方案说明

1. 总体思路 建立运维基线的核心目标是保障系统稳定性、提升安全性、及时响应异常事件并不断优化系统性能。初创公司资源有限&#xff0c;方案应尽可能简单、易用&#xff0c;同时具备一定的自动化和标准化能力。建议从以下几个层面入手&#xff1a; 标准化文档&#xff1a;制…...

pycharm中配置PyQt6详细教程

PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...