当前位置: 首页 > 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…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...