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 Vpp_link_XSA
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 目录下,有重要的组件:
| Name | Description | Component |
|---|---|---|
| Image | Linux kernel Image | Linux Software Components |
| rootfs.ext4 | Linux file system | Linux Software Components |
| sysroot | Cross compile and header files | Linux SDK |
| boot.scr | U-boot configuration file to store in FAT32 partition of SD card | FAT32 partition |
| bl31.elf | Arm trusted firmware / secure monitor | BOOT.BIN |
| u-boot.elf | Second stage boot loader | BOOT.BIN |
| system.dtb | Device tree information file | BOOT.BIN |
注:内核映像、Linux 文件系统和 Sysroot 并非 Vitis 平台本身必需的组件,它们用于编译应用程序和生成 SD 卡映像。
2)通用镜像下载地址
Common Images for Embedded Vitis Platforms - 2024.1 Vivado, Vitis, Vitis Embedded Platform, PetaLinux, Device models
https://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 Vpp_link_XSA
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 VD100
https://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 如何克隆项目到本地
导入项目成功,如下图:...
趣解PostGet请求的原理、应用场景及区别
趣解Post&Get请求的原理、应用场景及区别 POST 和 GET 的「身份之谜」:快递员与侦探的终极对决 一、角色设定:快递员(POST) vs 侦探(GET) GET(侦探): 任务ÿ…...
在PHP Web开发中,实现异步处理有几种常见方式的优缺点,以及最佳实践推荐方法
1. 消息队列 使用消息队列(如RabbitMQ、Beanstalkd、Redis)将任务放入队列,由后台进程异步处理。 优点: 任务持久化,系统崩溃后任务不丢失。 支持分布式处理,扩展性强。 实现步骤: 安装消息…...
深入解析过滤器模式:数据筛选与处理的高效工具
过滤器模式:数据筛选与处理的高效工具 在软件开发的复杂领域中,数据的筛选与处理是常见的任务。过滤器模式作为一种实用的设计模式,为解决这类问题提供了有效的解决方案。它允许开发者根据不同的标准对一组对象进行过滤操作,从而…...
DeepSeek R1/V3满血版——在线体验与API调用
前言:在人工智能的大模型发展进程中,每一次新模型的亮相都宛如一颗投入湖面的石子,激起层层波澜。如今,DeepSeek R1/V3 满血版强势登场,为大模型应用领域带来了全新的活力与变革。 本文不但介绍在线体验 DeepSeek R1/…...
排序链表--字节跳动
少年的书桌上没有虚度的光阴 题目描述 请你对链表进行排序 思路分析 核心思想:归并排序 有三个部分 链表排序实现 1. merge 函数 21.见 合并两个有序链表, 首先创建一个虚拟头节点 newhead,并使用指针 tail 来构建合并后的链表。 通过…...
Python爬虫-批量爬取股票数据猫各股票代码
前言 本文是该专栏的第47篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以股票数据猫为例子,基于Python爬虫,批量获取各股票代码数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废话不多说,下面跟着笔者直接往下看正文详细内容。(附…...
打开Firefox自动打开hao360.hjttif.com标签解决方案
现象 打开Firefox自动打开hao360.hjttif.com标签,同时用户自己设置的主页也会在一个新标签打开。点击hjttif这个标签,就会跳转到hao.360.com 打开Edge不会出现上述现象。搜遍全网都找不到解决方法。博客园上有一篇文章2025-02-14.防流氓软件篡改主页提到…...
【爬虫基础】第一部分 网络通讯-编程 P3/3
上节内容回顾:【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 前言 1.知识点碎片化:每个网站实现…...
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.…...
《论软件的可靠性评价》审题技巧 - 系统架构设计师
论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节,是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容: 首先,本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…...
【项目设计】自主HTTP服务器
目录 项目介绍 网络协议栈介绍 协议分层 数据的封装与分用 HTTP相关知识介绍 HTTP的特点 URL格式 URI、URL、URN HTTP的协议格式 HTTP响应协议格式 HTTP的请求方法 HTTP的状态码 HTTP常见的Header CGI机制介绍 CGI机制的概念 CGI机制的实现步骤 CGI机制的意义 …...
Linux操作系统:基于Linux的个人Web服务器搭建与自动化运维实践
基于Linux的个人Web服务器搭建与自动化运维实践 摘要 在互联网的海洋中,每个人都想拥有一艘属于自己的小船——一个个人Web服务器。Linux作为开源界的“老大哥”,无疑是搭建Web服务器的最佳选择。本文通过幽默风趣的方式,详细介绍了在Linux…...
[创业之路-321]:创新开拓思维和经营管理思维的比较
目录 一、概述 1.1、定义与内涵 1、创新开拓思维: 2、经营管理思维: 1.2、特点与优势 1、创新开拓思维的特点与优势: 2、经营管理思维的特点与优势: 3、应用场景与限制 4、总结 二、创新开拓思维与经营管理思维…...
vivado修改下载器下载速率
Error Launching Program X Error while launching program: fpga configuration failed. DONE PIN is not HIGH 原因是下载器速度太快了。先从任务管理器中关闭hw_server.exe试一下,要是不行就按下面三种方法解决。 第一种方法可以不用修改下载速度,直接先从vivado中将bit流…...
运维基线方案说明
1. 总体思路 建立运维基线的核心目标是保障系统稳定性、提升安全性、及时响应异常事件并不断优化系统性能。初创公司资源有限,方案应尽可能简单、易用,同时具备一定的自动化和标准化能力。建议从以下几个层面入手: 标准化文档:制…...
pycharm中配置PyQt6详细教程
PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
