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

乐享数科:供应链金融—三个不同阶段的融资模式

供应链金融是与产业链紧密结合的融资模式&#xff0c;它主要体现在订单采购、存货保管、销售回款这三个不同的业务阶段&#xff0c;并针对这些阶段提供了相应的金融服务。以下是这三个阶段中主要的融资模式及其特点&#xff1a; 供应链金融融资模式主要分为以下几种&#xff1…...

vmware虚拟机Ubuntu Desktop系统怎么和我的电脑相互复制文件、内容

1、先安装vmware workstation 17 player&#xff0c;然后再安装Ubuntu Desktop虚拟机&#xff0c;然后再安装vmware tools&#xff0c;具体可以参考如下视频&#xff1a; VMware虚拟机与主机实现文件共享&#xff0c;其实一点也不难_哔哩哔哩_bilibili 2、本人亲自试过了&…...

【React】React 基础(2)

JSX 是什么 JSX是一种 JavaScript 的语法扩展(extension), 也在很多地方称之为 JavaScript XML, 因为看起就是一段XML语法。它用于描述我们的Ul界面&#xff0c;并且其完成可以和 JavaScript 融合在一起使用&#xff1b; 为什么 React 选择使用 jsx&#xff1f; React 认为渲…...

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…...

ASP.NET MVC AJAX 文件上传

如何使用 MVC 5 和 AJAX&#xff08;.NET Framework&#xff09;上传文件。 使用AJAX和ASP.NET MVC 上传文件 再简单不过了。对于最纯粹的人来说&#xff0c;这不需要使用jQuery。此代码实际上允许上传多个文件。 注意&#xff1a;以下代码示例支持 ASP.NET MVC 5。如果使用 .…...

npm使用了代理,但是代理软件已经关闭导致创建失败

如果在关闭前打开了vscode&#xff0c;此时vscode中的终端没有刷新&#xff0c;就会出现这个问题&#xff0c;最开始会一直转圈圈&#xff0c;直到超时&#xff0c;然后出现该报错 ❯ npm create vuelatest npm error code ECONNREFUSED npm error syscall connect npm error …...

Spring Boot定时任务原理

Spring Boot定时任务原理 在现代应用中&#xff0c;定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持&#xff0c;通过注解驱动的方式&#xff0c;开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理…...

公文派2025:免费社区版重大安装更新!

大家好&#xff0c;感谢对「公文派」的支持。 距离上一次更新已经过去了将近一年的时间&#xff0c;今天我们带来了全新的免费2025社区版&#xff0c;该版本也是目前最新的版本&#xff0c;无需授权即可使用所有的功能。 我们先来看下本版本的更新及特色功能 聚合多个AI功能…...

Ubuntu24.04LTS的下载安装超细图文教程(VMware虚拟机及正常安装)

&#x1f638;个人主页&#x1f449;&#xff1a;神兽汤姆猫 &#x1f4d6;系列专栏&#xff1a;开发语言环境配置 、 Java学习 、Java面试 、Markdown等 学习上的每一次进步&#xff0c;均来自于平时的努力与坚持。 &#x1f495;如果此篇文章对您有帮助的话&#xff0c;请点…...

ES6相关操作

一.JavaScript的基础语法 1.Demo1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JavaScrip…...

【运维】源码编译安装cmake

背景&#xff1a; 已经在本地源码编译安装gcc/g&#xff0c;现在源码安装cmake 下载源码 下载地址&#xff1a;CMake - Upgrade Your Software Build System 安装步骤&#xff1a; ./bootstrap --prefix/usr/local/cmake make make install 错误处理 1、提示找不到libmpc.…...

代码随想录_回溯

代码随想录_回溯 回溯 77.组合 77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路: 回溯 优化: 剪枝 注意代码中i&#xff0c;就是for循环里选择的起始位置。 for (int i startIndex; i <…...

tauri2实现监听记住窗口大小变化,重启回复之前的窗口大小

要想实现记住窗口大小的功能&#xff0c;整体逻辑就是要监听窗口大小变化&#xff0c;将窗口大小保存下来&#xff0c;重启之后&#xff0c;读取保存的大小&#xff0c;然后恢复。这里可以使用rust层实现&#xff0c;也可以在前端实现。我这里就纯rust层实现了。 监听窗口变化…...

番茄工作法html实现

对比了deepseek-r1-online和本地部署的14b的版本&#xff0c;输出的输出的html页面。 在线满血版的功能比较强大&#xff0c;可以一次完成所有要求。14b版本的功能有一些欠缺&#xff0c;但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…...

C++:dfs,bfs各两则

1.木棒 167. 木棒 - AcWing题库 乔治拿来一组等长的木棒&#xff0c;将它们随机地砍断&#xff0c;使得每一节木棍的长度都不超过 5050 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态&#xff0c;但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序…...

【ORB-SLAM3】鲁棒核函数的阈值设置

问题背景 阈值 δ \delta δ 是 Huber 鲁棒核函数的重要参数。首先给出结论&#xff0c;在ORB-SLAM系列中&#xff0c;该阈值选取的原则为&#xff1a; 单目情况下&#xff0c;根据95%置信水平下两自由度卡方检验的临界值&#xff0c; δ \delta δ 设置为 5.991 \sqrt{5.9…...

四种常见图形库GLUT,SDL,SFML和GLFW简介

GLUT、SDL、SFML 和 GLFW 是四种常用的库&#xff0c;用于管理窗口、输入和上下文创建&#xff0c;通常与 OpenGL 结合使用以实现图形渲染。以下是它们的详细介绍、常用应用场合和具体案例。 1. GLUT&#xff08;OpenGL Utility Toolkit&#xff09; 简介 GLUT 是一个用于创建…...

C++类和对象进阶:初始化列表和static成员深度详解

C类和对象&#xff1a;初始化列表和static成员深度详解 1. 前言2. 构造函数初始化成员变量的方式2.1 构造函数体内赋值2.2 初始化列表2.2.1 初始化列表的注意事项 2.3 初始化列表的初始化顺序 3. 类的静态成员3.1 引入3.2 静态成员变量3.3 静态成员函数3.4 静态成员的注意事项3…...

[C#]C# winform部署yolov12目标检测的onnx模型

yolov12官方框架&#xff1a;github.com/sunsmarterjie/yolov12 【测试环境】 vs2019 netframework4.7.2 opencvsharp4.8.0 onnxruntime1.16.3 【效果展示】 【调用代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.…...

阿里云k8s服务部署操作一指禅

文章目录 DockerFile镜像操作阿里云k8s服务部署 DockerFile # 使用 JDK 17 官方镜像 # linux架构&#xff1a;FROM --platformlinux/amd64 openjdk:17-jdk-slim # arm架构&#xff1a;openjdk:17-jdk-slim FROM --platformlinux/amd64 openjdk:17-jdk-slim# 设置工作目录 WORK…...

Transformer LLaMA

一、Transformer Transformer&#xff1a;一种基于自注意力机制的神经网络结构&#xff0c;通过并行计算和多层特征抽取&#xff0c;有效解决了长序列依赖问题&#xff0c;实现了在自然语言处理等领域的突破。 Transformer 架构摆脱了RNNs&#xff0c;完全依靠 Attention的优…...

球队训练信息管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用&a…...

【存储中间件API】MySQL、Redis、MongoDB、ES常见api操作及性能比较

常见中间件api操作及性能比较 ☝️ MySQL crud操作✌️ maven依赖✌️ 配置✌️ 定义实体类✌️ 常用api ☝️ Redis crud操作✌️ maven依赖✌️ 配置✌️ 常用api ☝️ MongoDB crud操作✌️ maven依赖✌️ 配置文件✌️ 定义实体类✌️ MongoDB常用api ☝️ ES crud操作 ⭐️…...

UE_C++ —— Gameplay Classes

目录 一&#xff0c;Adding Classes 二&#xff0c;Class Headers Class Declaration Class Specifiers Metadata Specifiers 三&#xff0c;Class Implementation Class Constructor 引擎中每个游戏类都由一个类头文件&#xff08;.h&#xff09;和一个类源文件&#x…...

windows上vscode cmake工程搭建

安装vscode插件&#xff1a; 1.按装fastc&#xff08;主要是安装MinGW\mingw64比较方便&#xff09; 2.安装C&#xff0c;cmake&#xff0c;cmake tools插件 3.准备工作完成之后&#xff0c;按F1&#xff0c;选择cmake:Quick Start就可以创建一个cmake工程。 4.设置Cmake: G…...

软件测试:1、单元测试

1. 单元测试的基本概念 单元&#xff08;Unit&#xff09;&#xff1a;软件系统的基本组成单位&#xff0c;可以是函数、模块、方法或类。 单元测试&#xff08;Unit Testing&#xff09;&#xff1a;对软件单元进行的测试&#xff0c;验证代码的正确性、规范性、安全性和性能…...

如果后台的Long类型的数据返回是null,那么Android客户端的数据bean的kotlin的Long类型的字段接受到数据后是null空指针吗?

如果后台的Long类型的数据返回是null&#xff0c;那么Android客户端的数据bean的kotlin的Long类型的字段接受到数据后是null空指针吗&#xff1f; DeepSeek R1 思考 35 秒 思考过程 好的&#xff0c;用户的问题是关于在Android客户端使用Kotlin处理后台返回的Long类型数据为n…...

Vue3 打造 Windows 桌面个性高效组件工具

软件介绍 Widgets 这款基于 Vue3 构建的开源 Windows 桌面小部件工具超实用。 其多样化组件库涵盖超 20 种&#xff0c;从倒计时、打工进度等实用工具&#xff0c;到抖音热榜等实时资讯组件应有尽有&#xff0c;各组件独立运行&#xff0c;满足多场景需求。 高度自定义布局支持…...

学习笔记-沁恒第四讲-米醋

一&#xff0c; 语音模块&#xff1a;数据包发送 刷卡模块&#xff1a;数据包接收 AS608&#xff1a;数据包发送接收 二&#xff0c;第三讲文件夹改成第四讲&#xff0c;工程也改成第四讲 三&#xff0c;目前在内存里面。保存新值&#xff0c;掉电会丢失 u8 password[6]{1,…...

epoll_event的概念和使用案例

epoll_event 是 Linux 下 epoll I/O 多路复用机制的核心数据结构&#xff0c;用于描述文件描述符&#xff08;File Descriptor, FD&#xff09;上发生的事件及其关联的用户数据。通过 epoll&#xff0c;可以高效地监控多个文件描述符的状态变化&#xff08;如可读、可写、错误等…...

容器和虚拟机选择对比

1. 概述 如果主要需求是学习和测试 Ubuntu 下的命令行工具或服务型应用&#xff0c;推荐使用 Docker Docker 更轻量、更高效&#xff0c;适合快速搭建和销毁环境。 启用 WSL 2&#xff0c;Docker Desktop 是一个非常好的选择。 如果需要完整的桌面环境或进行复杂的系统级开…...

C++17中std::chrono::duration和std::chrono::time_point的舍入函数

文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中&#xff0c; std::chrono库提供了一组强大的时间处理工具&#xff0c;包…...

基于SpringBoot的线上汽车租赁系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

基于Dancing Links的精确覆盖算法(解决NP难问题)和量子计算机模拟中的Shor算法(涉及数论与量子叠加态模拟)

一、Dancing Links算法实现数独求解(NP难问题) 算法方案 数独可转化为精确覆盖问题,使用Knuth提出的DLX算法实现高效求解。该算法通过双向十字循环链表实现快速回溯,时间复杂度可达O(n^k)(k为常数) #include <iostream> #include <vector> #include <c…...

体育品牌排行榜前十名:MLB·棒球1号位

MLB是一个融合了棒球文化与街头时尚元素的潮流运动品牌。以下是对该品牌的详细介绍&#xff1a; 一、品牌背景 • 全称&#xff1a;MLB全称是Major League Baseball&#xff0c;即美国职业棒球大联盟。不过&#xff0c;作为品牌的MLB并非由美国职业棒球大联盟直接运营&#x…...

Java网络编程封装

系列文章目录 Java知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、封装的目标&#x1f449;二、套接字层封装&#x1f449;壁纸分享&#x1f449;总结 &#x1f449;前言 Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来&#xff0c;提供简洁…...

数字内容体验标杆案例解析

内容概要 在数字化转型浪潮中&#xff0c;数字内容体验正成为企业构建核心竞争力的关键抓手。本文通过拆解金融、零售、文旅等领域的标杆案例&#xff0c;系统分析沉浸式设计与智能交互系统的技术融合路径&#xff0c;揭示头部企业如何通过XR技术、实时数据可视化及场景化内容…...

区块链相关方法-PEST分析

一、定义:一种用于分析企业外部宏观环境的工具。PEST 这四个字母分别代表政治&#xff08;Political&#xff09;、经济&#xff08;Economic&#xff09;、社会&#xff08;Social&#xff09;和技术&#xff08;Technological&#xff09;。这种分析方法帮助企业或组织了解宏…...

Dify安装教程:Linux系统本地化安装部署Dify详细教程

1. 本地部署 Dify 应用开发平台 环境:Ubuntu(24.10) docker-ce docker compose 安装 克隆 Dify 源代码至本地环境: git clone https://github.com/langgenius/dify.git 启动 Dify: cd dify/docker cp .env.example...

git使用-克隆远程项目、分支管理

文章目录 克隆远程项目到本地1. 远程找到需要克隆的项目&#xff0c;复制ssh地址2. idea开启git版本控制&#xff08;如果已经开了&#xff0c;忽略此步骤&#xff09;3. clone远端项目4. 克隆完成 分支管理1. 新建分支2. 切换分支3. 合并分支4. 储存变化 克隆远程项目到本地 …...

QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,压缩进度

前言 最近在做项目时遇到一个需求&#xff0c;需要将升级的文件压缩成zip&#xff0c;再进行传输&#xff1b; 通过网络调研&#xff0c;有许多方式可以实现&#xff0c;例如QT私有模块的ZipReader、QZipWriter&#xff1b;或者第三方库zlib或者libzip或者quazip等&#xff1…...

SQLMesh 系列教程8- 详解 seed 模型

在数据分析和建模过程中&#xff0c;外部模型&#xff08;External Models&#xff09;在 SQLMesh 中扮演着重要角色。外部模型允许用户引用外部数据源或现有数据库表&#xff0c;从而实现灵活的数据整合和分析。本文将介绍外部模型的定义、生成方法&#xff08;包括使用 CLI 和…...

oracle apex post接口

日常记录 使用到了apex_json方式接收 、、、1 首先&#xff0c;接口通过body传递过来&#xff0c;成功接收到&#xff0c; 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…...

复制所绑定元素文本的vue自定义指令

最近写了一个复制所绑定元素文本的vue自定义指令&#xff0c;给大家分享一下。 import { ElMessage } from element-plus// data-* 属性名 const dataCopyBtnTextAttribute data-copy-btn-text // 复制按钮的class&#xff0c;结合项目实际进行设置 const copyBtnClass icon…...

若依-@Excel新增注解numberFormat

Excel注解中原本的scale会四舍五入小数&#xff0c;导致进度丢失 想要的效果 显示的时候保留两个小数真正的数值是保留之前的数值 还原过程 若以中有一個專門的工具类&#xff0c;用来处理excel的 找到EXCEL导出方法exportExcel()找到writeSheet,写表格的方法找到填充数据的方法…...

内容中台重构智能服务:人工智能技术驱动精准决策

内容概要 现代企业数字化转型进程中&#xff0c;内容中台与人工智能技术的深度融合正在重构智能服务的基础架构。通过整合自然语言处理、知识图谱构建与深度学习算法三大技术模块&#xff0c;该架构实现了从数据采集到决策输出的全链路智能化。在数据层&#xff0c;系统可对接…...

网络安全:DeepSeek已经在自动的挖掘漏洞

大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...

C#从入门到精通(34)—如何防止winform程序被同时打开多次

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发上位机软件的过程中&#xff0c;评判一个人软件写的好不好&#xff0c;有一…...

Linux系统使用Docker部署Geoserver并做数据挂载进行地图服务的发布和游览

文章目录 1、前提环境2、拉取geoserver镜像3、创建数据挂载目录4、 运行容器5、 测试使用&#xff08;发布shp数据为服务&#xff09;5.1、创建工作区5.2、添加数据存储5.3、发布图层5.4、服务游览 1、前提环境 部署环境&#xff1a;Linux&#xff0c;Centos7 &#xff0c;Doc…...