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

Vitis Accelerated Libraries 学习笔记--Vision 库的组织结构

1. 简介

Vision 库的组织结构如下:

├── L1/
│   ├── README.md
│   ├── examples/
│   ├── include/
│   ├── lib/
│   └── tests/
├── L2/
│   ├── README.md
│   ├── examples/
│   └── tests/
├── L3/
│   ├── README.md
│   ├── benchmarks/
│   ├── examples/
│   └── tests/
├── data/
├── LICENSE.txt
├── README.md
├── docs/
│   ├── images/
│   ├── include/
│   ├── Makefile
│   ├── Makefile.sphinx
│   ├── rst files
│   ├── conf.py
│   ├── conf_bhp.py
│   ├── env.csh
├── ext/
│   └── xcl2/
└── library.json

2. 分类介绍

2.1 L1/examples

包含示例测试平台代码,以方便在 Vitis/Vivado HLS 上运行单元测试。 example/ 包含带有算法名称的文件夹。每个算法文件夹包含 testbench、accel、config、Makefile、Json 文件和“build”文件夹。

2.2 L1/include/aie

包含基础设施标头和 AIE 内核定义。

2.3 L1/include/common

包含公共库基础结构标头,例如特定于库的类型。

2.4 L1/include/core

包含核心库功能标头,例如 math 函数。

2.5 L1/include/features

包含特征提取核函数定义。例如,Harris。

2.6 L1/include/imgproc

包含与图像处理定义相关的所有内核函数定义。

2.7 L1/include/video

包含所有与视频处理功能相关的内核函数定义。例如:光流。

2.8 L1/include/dnn

包含与深度学习预处理相关的所有核函数定义。

2.9 L1/tests

包含用于运行模拟、综合和导出 RTL 的所有测试文件夹。测试文件夹包含带有算法名称的文件夹。每个算法文件夹还包含配置文件夹,其中包含用于运行测试的 makefile 和 tcl 文件。

2.10 L1/examples/build

包含 xf_config_params.h 文件,其中具有与特定示例相关的可配置宏和变量。

2.11 L1/lib/sw

包含 AIE 数据移动器库对象文件。

2.12 L2/examples

包含示例测试平台代码,以方便在 Vitis 上运行单元测试。 example/ 包含带有算法名称的文件夹。每个算法文件夹包含 testbench、accel、config、Makefile、Json 文件和“build”文件夹。

2.13 L2/tests

包含用于运行软件、硬件仿真和硬件构建的所有测试文件夹。测试包含带有算法名称的文件夹。每个算法文件夹还包含配置文件夹,其中包含用于运行 PL 测试的 makefile 和配置文件。

2.14 L2/tests/aie

包含运行 x86 模拟、硬件模拟和硬件构建的所有测试文件夹。测试包含带有算法名称的文件夹。每个算法文件夹还包含配置文件夹,其中包含 makefile、testbench、config 和运行 AIE 测试所需的其他文件。

2.15 L2/examples/build

包含 xf_config_params.h 文件,其中具有与特定示例相关的可配置宏和变量。

2.16 L3/examples

包含用于在 Vitis 上构建管道功能的示例测试台代码。 example/ 包含带有算法名称的文件夹。每个算法文件夹包含 testbench、accel、config、Makefile、Json 文件和“build”文件夹。

2.17 L3/tests

包含运行软件、硬件仿真和硬件构建的所有测试文件夹。测试包含带有算法名称的文件夹。每个算法名称文件夹都包含配置文件夹,配置文件夹内的 makefile 用于运行测试。

2.18 L3/examples/build

包含 xf_config_params.h 文件,其中具有与特定示例相关的可配置宏和变量。

2.19 L3/benchmarks

包含基准示例,用于比较软件实现与使用 Vitis 视觉库的 FPGA 实现。

2.20 ext

包含与 opencl 主机代码相关的实用函数。

3. 脚本解析

3.1 TCL 脚本

set CSIM 0
set CSYNTH 0
set COSIM 0
set VIVADO_SYN 0
set VIVADO_IMPL 0
set CUR_DIR [pwd]
set OPENCV_INCLUDE $::env(OPENCV_INCLUDE)
set OPENCV_LIB $::env(OPENCV_LIB)
set XF_PROJ_ROOT $CUR_DIR/../../../..
set XPART xcu200-fsgd2104-2-eset PROJ "resize.prj"
set SOLN "sol1"if {![info exists CLKP]} {set CLKP 3.3
}open_project -reset $PROJadd_files "${XF_PROJ_ROOT}/L1/examples/resize/xf_resize_accel.cpp" -cflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x" -csimflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x"
add_files -tb "${XF_PROJ_ROOT}/L1/examples/resize/xf_resize_tb.cpp" -cflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${OPENCV_INCLUDE} -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x" -csimflags " -I ${XF_PROJ_ROOT}/L1/tests/resize/resize_NPPC1_8UC1_8UC1_AREA -I${XF_PROJ_ROOT}/L1/include -I ./ -D__SDSVHLS__ -std=c++0x"
set_top resize_accelopen_solution -reset $SOLNset_part $XPART
create_clock -period $CLKPif {$CSIM == 1} {csim_design -ldflags "-L ${OPENCV_LIB} -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lopencv_highgui -lopencv_flann -lopencv_features2d" -argv "  ${XF_PROJ_ROOT}/data/128x128.png"
}if {$CSYNTH == 1} {csynth_design
}if {$COSIM == 1} {cosim_design -ldflags "-L ${OPENCV_LIB} -lopencv_imgcodecs -lopencv_imgproc -lopencv_core -lopencv_highgui -lopencv_flann -lopencv_features2d" -argv "  ${XF_PROJ_ROOT}/data/128x128.png"
}if {$VIVADO_SYN == 1} {export_design -flow syn -rtl verilog
}if {$VIVADO_IMPL == 1} {export_design -flow impl -rtl verilog
}exit
  • 设置环境变量和项目参数:初始化一些变量,包括仿真、综合、联合仿真、Vivado综合和实现的标志,当前目录,OpenCV库和头文件路径,项目根目录,FPGA部件型号(XPART),项目名和解决方案名。
  • 打开或创建项目和解决方案:通过open_project和open_solution命令重置并打开一个名为"resize.prj"的项目和名为"sol1"的解决方案。
  • 添加文件和设置顶层函数:使用add_files命令添加加速器实现文件和测试平台(testbench)文件,并通过set_top设置顶层函数为resize_accel。
  • 设置FPGA部件和时钟:通过set_part和create_clock命令设置FPGA部件型号和时钟周期。
  • 条件执行仿真和综合任务:根据设置的标志(CSIM、CSYNTH、COSIM、VIVADO_SYN、VIVADO_IMPL),条件性地执行C语言仿真、高层次综合、联合仿真、Vivado综合和Vivado实现。例如,如果CSIM标志设置为1,则执行C语言仿真。
  • 处理OpenCV库:在C语言仿真和联合仿真时,通过-ldflags传递OpenCV库的链接选项,以便能够在仿真中使用OpenCV函数。
  • 退出:最后,脚本使用exit命令退出。

3.2 Makefile 脚本

############################## Setting up Project Variables ##############################
MK_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
export CUR_DIR := $(patsubst %/,%,$(dir $(MK_PATH)))
export XF_PROJ_ROOT ?= $(shell bash -c 'export MK_PATH=$(MK_PATH); echo $${MK_PATH%/L1/*}')# setting default value
PLATFORM ?= xilinx_u200_gen3x16_xdma_2_202110_1export PATH := $(XILINX_VIVADO)/bin:$(PATH)
WORK_DIR ?= hls
TARGET ?= csim
CONFIG_FILE ?= $(CUR_DIR)/hls_config.cfg
CONFIG_TMPL ?= $(CUR_DIR)/hls_config.tmplifneq (,$(wildcard $(XILINX_VITIS)/bin/ldlibpath.sh))
export LD_LIBRARY_PATH := $(shell $(XILINX_VITIS)/bin/ldlibpath.sh $(XILINX_VITIS)/lib/lnx64.o):$(LD_LIBRARY_PATH)
endififeq ($(TARGET), vivado_syn)
TARGET_REL = impl
export VIVADO_FLOW := syn
else
export VIVADO_FLOW := impl
ifeq ($(TARGET), vivado_impl)
TARGET_REL = impl
else
TARGET_REL = $(TARGET)
endif
endif############################## Checking value ##############################
.PHONY: check_vivado
check_vivado:
ifeq (,$(wildcard $(XILINX_VIVADO)/bin/vivado))@echo "Cannot locate Vivado installation. Please set XILINX_VIVADO variable." && false
endif.PHONY: check_vpp
check_vpp:
ifeq (,$(wildcard $(XILINX_VITIS)/bin/v++))@echo "Cannot locate Vitis installation. Please set XILINX_VITIS variable." && false
endif.PHONY: check_part
ifeq (,$(XPART))
# MK_INC_BEGIN vitis_set_platform.mkifneq (,$(wildcard $(PLATFORM)))
# Use PLATFORM as a file path
XPLATFORM := $(PLATFORM)
else
# Use PLATFORM as a file name pattern
DEVICE_L := $(shell echo $(PLATFORM) | tr A-Z a-z)
# 1. search paths specified by variable
ifneq (,$(PLATFORM_REPO_PATHS))
# 1.1 as exact name
XPLATFORM := $(strip $(foreach p, $(subst :, ,$(PLATFORM_REPO_PATHS)), $(wildcard $(p)/$(DEVICE_L)/$(DEVICE_L).xpfm)))
# 1.2 as a pattern
ifeq (,$(XPLATFORM))
XPLATFORMS := $(foreach p, $(subst :, ,$(PLATFORM_REPO_PATHS)), $(wildcard $(p)/*/*.xpfm))
XPLATFORM := $(strip $(foreach p, $(XPLATFORMS), $(shell echo $(p) | awk '$$1 ~ /$(DEVICE_L)/')))
endif # 1.2
endif # 1
# 2. search Vitis installation
ifeq (,$(XPLATFORM))
# 2.1 as exact name vitis < 2022.2
XPLATFORM := $(strip $(wildcard $(XILINX_VITIS)/platforms/$(DEVICE_L)/$(DEVICE_L).xpfm))
ifeq (,$(XPLATFORM))
# 2.2 as exact name vitis >= 2022.2
XPLATFORM := $(strip $(wildcard $(XILINX_VITIS)/base_platforms/$(DEVICE_L)/$(DEVICE_L).xpfm))
# 2.3 as a pattern vitis < 2022.2
ifeq (,$(XPLATFORM))
XPLATFORMS := $(wildcard $(XILINX_VITIS)/platforms/*/*.xpfm)
XPLATFORM := $(strip $(foreach p, $(XPLATFORMS), $(shell echo $(p) | awk '$$1 ~ /$(DEVICE_L)/')))
# 2.4 as a pattern vitis > 2022.2
ifeq (,$(XPLATFORM))
XPLATFORMS := $(wildcard $(XILINX_VITIS)/base_platforms/*/*.xpfm)
XPLATFORM := $(strip $(foreach p, $(XPLATFORMS), $(shell echo $(p) | awk '$$1 ~ /$(DEVICE_L)/')))
endif # 2.4
endif # 2.3
endif # 2.2
endif # 2
# 3. search default locations
ifeq (,$(XPLATFORM))
# 3.1 as exact name
XPLATFORM := $(strip $(wildcard /opt/xilinx/platforms/$(DEVICE_L)/$(DEVICE_L).xpfm))
# 3.2 as a pattern
ifeq (,$(XPLATFORM))
XPLATFORMS := $(wildcard /opt/xilinx/platforms/*/*.xpfm)
XPLATFORM := $(strip $(foreach p, $(XPLATFORMS), $(shell echo $(p) | awk '$$1 ~ /$(DEVICE_L)/')))
endif # 3.2
endif # 3
endif
XPLATFORM := $(firstword $(XPLATFORM))XDEVICE := $(basename $(notdir $(XPLATFORM)))ifeq (1, $(words $(XPLATFORM)))
# Query the part name of device
ifneq (,$(wildcard $(XILINX_VITIS)/bin/platforminfo))
override XPART := $(shell $(XILINX_VITIS)/bin/platforminfo --json="hardwarePlatform.devices[0].fpgaPart" --platform $(XPLATFORM) | sed 's/^[^:]*://g' | sed 's/[^a-zA-Z0-9]/-/g' | sed 's/-\+/-/g')
endif
else
PART_ERROR := "To add more platform directories, set the PLATFORM_REPO_PATHS variable or point PLATFORM variable to the full path of platform .xpfm file."
endifcheck_part: check_vpp
ifeq (,$(XPART))@echo "$(PART_ERROR)"@echo "XPART is not set and cannot be inferred. Please run \`make help\` for usage info." && false
endif
else # XPART
check_part:@echo "Using part $(XPART)"
endif # XPART.PHONY: check_opencv
check_opencv:
ifeq (,$(OPENCV_INCLUDE))@echo "Cannot find OpenCV include path. Please set OPENCV_INCLUDE variable" && false
endif
ifeq (,$(OPENCV_LIB))@echo "Cannot find Opencv lib path. Please set OPENCV_LIB variable" && false
endifdefine CONFIG_GEN_PY
import os, string
with open('$(CONFIG_TMPL)', 'r') as fr:t = fr.read()
with open('$(CONFIG_FILE)', 'w') as f:f.write(string.Template(t).substitute(**dict(os.environ)))
endef
export CONFIG_GEN_PYVITIS_PYTHON3 = LD_LIBRARY_PATH=$(XILINX_VITIS)/tps/lnx64/python-3.8.3/lib $(XILINX_VITIS)/tps/lnx64/python-3.8.3/bin/python3$(CONFIG_FILE): $(CONFIG_TMPL)@echo "$${CONFIG_GEN_PY}" | (${VITIS_PYTHON3})all: check_vivado check_part check_opencv $(CONFIG_FILE)
ifneq ($(TARGET_REL), csim)v++ -c --mode hls --config $(CONFIG_FILE) --work_dir $(WORK_DIR) --part $(XPART)
endifrun: all
ifneq ($(TARGET_REL), csynth)@echo $(TARGET_REL)vitis-run --mode hls --config $(CONFIG_FILE) --$(TARGET_REL) --work_dir $(WORK_DIR)  --part $(XPART)
endifclean:rm -rf $(CONFIG_FILE) *_hls.log $(WORK_DIR)
  • 设置项目变量:定义了一些环境变量,如PLATFORM和WORK_DIR,以及如何找到Vitis和Vivado的安装路径。
  • 检查值:包含了一系列检查,确保必要的环境变量已经设置,例如XILINX_VIVADO和XILINX_VITIS,以及OpenCV的包含路径和库路径。
  • 配置文件生成:使用Python脚本从模板(CONFIG_TMPL)生成配置文件(CONFIG_FILE)。
  • 编译和运行:定义了如何编译HDL代码和运行硬件仿真。
  • 清理 (clean):删除生成的文件和日志。

4. 总结

本文档提供了Vision库的组织结构和详细分类介绍,包括各级目录(L1、L2、L3)下的示例代码、测试、库文件等的详细说明。此外,还包括了TCL和Makefile脚本的解析,这些脚本是在项目开发过程中用于自动化构建和测试的重要工具。TCL脚式主要用于设置环境变量、项目参数、添加文件、设置FPGA部件和时钟,以及条件执行仿真、综合等任务。而Makefile脚本则涉及到设置项目变量、检查环境配置、生成配置文件、编译和运行指令等。

通过这些脚本,用户可以更方便地管理和执行项目构建和测试过程,提高开发效率。同时,通过对Vision库结构的详细介绍,用户可以快速了解如何使用库中的不同组件,进行图像处理、视频处理、深度学习预处理等操作。

相关文章:

Vitis Accelerated Libraries 学习笔记--Vision 库的组织结构

1. 简介 Vision 库的组织结构如下&#xff1a; ├── L1/ │ ├── README.md │ ├── examples/ │ ├── include/ │ ├── lib/ │ └── tests/ ├── L2/ │ ├── README.md │ ├── examples/ │ └── tests/ ├── L3/ │ ├── R…...

HTML+CSS 彩色浮雕按钮

效果演示 实现了一个彩色按钮特效&#xff0c;包括一个按钮&#xff08;button&#xff09;和一个前景色&#xff08;::before&#xff09;。按钮具有四种不同的颜色&#xff0c;当鼠标悬停在按钮上时&#xff0c;前景色会出现渐变效果&#xff0c;并且按钮的颜色、文本阴影和边…...

ChatBI开源实现: 基于SuperSonic的AI+BI的产品设计

产品起源 为什么要做这样的产品&#xff1f;文章《ChatBI开源实现: AIBI的产品设计》中有介绍 为什么要自己做这样的产品&#xff1f;1、低成本试错&#xff1b;2、未来数据生态入口&#xff1b; 为什么要基于Supersonic做&#xff1f; 开源协议友好&#xff1a;可魔改商用 社区…...

【嵌入式Linux】i.MX6ULL 外部中断服务函数的初始化

文章目录 1. Cortex-A7 中断系统1.1 分析1.2 具体处理流程 2. 外部中断服务函数的初始化2.1 基本流程分析2.2 具体代码分析2.2.1. 定义中断处理类型和结构体2.2.2. 初始化中断系统2.2.3. 注册中断处理函数2.2.4. 具体的中断处理逻辑2.2.5. 默认的中断处理函数 3. 完整代码 本文…...

线性代数、矩阵计算

一、线性代数 1、对于向量&#xff0c;若a是标量&#xff0c;为a的绝对值乘以b的向量长度。 2、点乘 3、范数&#xff1a;向量或者矩阵的长度 L1范数&#xff1a;&#xff08;对向量&#xff09;每个元素的绝对值求和 L2范数&#xff1a;&#xff08;对向量&#xff09;torch.…...

PostgreSQL 高级功能(五)

1. 存储过程与函数 1.1 创建存储过程 存储过程是一组预编译的SQL语句&#xff0c;可以简化复杂的操作。以下是一个简单的存储过程示例&#xff1a; CREATE OR REPLACE FUNCTION add_user(username VARCHAR, email VARCHAR) RETURNS VOID AS $$ BEGININSERT INTO users (use…...

食品企业仓储式批发零售一体化解决方案

食品企业需要有效应对日益复杂的市场挑战和消费者需求的快速变化的挑战并提升市场竞争力&#xff0c;仓储式类的批发零售一体化需求应运而生。这一全新的商业模式不仅整合了传统的批发和零售模式&#xff0c;还优化了供应链管理和客户体验&#xff0c;成为食品行业发展的新引擎…...

chrome插件,修改对应URL的http请求的header头,包括ajax请求

要创建一个可以灵活修改HTTP请求头的Chrome扩展&#xff0c;包括一个用户界面来动态设置头部名称和值&#xff0c;可以按照以下步骤进行。我们会用到 chrome.storage API 来保存用户的设置&#xff0c;并在后台脚本中使用这些设置来修改请求头。 文件结构 my_chrome_extensio…...

C语言 | Leetcode C语言题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }...

【C++11(二)】lambda表达式和可变参数模板

一、可变参数模板 C11的新特性可变参数模板 能够让您创建可以接受 可变参数的函数模板和类模板 // Args是一个模板参数包&#xff0c;args是一个函数形参参数包 // 声明一个参数包Args...args&#xff0c;这个参数包中可以包含0到任意个模板参数。 template <class ...Arg…...

昇思25天学习打卡营第2天|张量Tensor

张量Tensor 创建张量张量的属性张量索引张量运算 稀疏张量 总结 简单讲讲张量&#xff0c;数学和物理学界以一种方式定义张量&#xff0c;机器学习上则是以另一种方式定义张量&#xff0c;这里的张量也与神经网络联系紧密&#xff0c;神经网络需要进行大量的数学计算&#xff0…...

[leetcode]valid-triangle-number. 有效三角形的个数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int triangleNumber(vector<int>& nums) {int n nums.size();sort(nums.begin(), nums.end());int ans 0;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {int left j 1, righ…...

java SQL server 多实例的情况

而对于java&#xff0c;对付多个数据库实例就有些要注意的了&#xff1a; 首先&#xff0c;同样连接字符串上加上“\实例名”&#xff1a; jdbc:sqlserver://127.0.0.1\\mssqlserver2008;DatabaseNameLPT; 此处应去掉端口1433。因为连接数据库自命名实例的url中没有端口号1433…...

html--404页面

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <title>404 错误页面不存在&…...

[word] Word如何删除所有的空行? #职场发展#学习方法

Word如何删除所有的空行&#xff1f; 很多网友从网页复制文字粘贴到word文档后发现段落之间有空行&#xff0c;如果文字不多&#xff0c;手动删除这些空行也没有多少工作量&#xff0c;但是如果文字的字数达到成千上万&#xff0c;一个个手动删除这些空行还是很繁琐的。那么&a…...

【CSS】深入探讨 CSS 的 `calc()` 函数

深入探讨 CSS 的 calc() 函数 calc() 是一个 CSS 函数&#xff0c;用于在样式表中进行数学计算&#xff0c;从而动态地设置 CSS 属性值。它允许开发者在指定长度、百分比、数值等时&#xff0c;进行加减乘除运算。通过 calc() 函数&#xff0c;我们可以实现更灵活和响应式的设…...

MongoDB异地备份数据文件脚本(带日志打印,便于排查)

此脚本是以文件夹的形式备份&#xff0c;非压缩包形式 如需备份成加密压缩包&#xff0c;可用此脚本&#xff1a;MongoDB定时异地备份所有数据库为加密压缩包-CSDN博客 1.可以直接下载本文件使用&#xff0c;将其放到mongo安装目录的bin目录下&#xff08;可手动执行&#xf…...

论文导读 | Manufacturing Service Operations Management近期文章精选

编者按 在本系列文章中&#xff0c;我们梳理了顶刊Manufacturing & Service Operations Management5月份发布有关OR/OM以及相关应用的文章之基本信息&#xff0c;旨在帮助读者快速洞察行业/学界最新动态。 推荐文章1 ● 题目&#xff1a;Robust Drone Delivery with Weath…...

【Linux命令】top linux下的任务管理器

一、概述 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。top是一个动态显示过程&#xff0c;即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令&#xff0c;它将独占前台&#…...

2024年在分数限制下,选好专业还是选好学校?

分数限制下&#xff0c;选好专业还是选好学校&#xff1f; 24年高考帷幕落下&#xff0c;一场新的思考与选择悄然来临。对于每一位高考考生&#xff0c;学校和专业都是开启大学新生活的两个前置必选项。但有时候“鱼与熊掌不可兼得”&#xff0c;在分数受限的条件下&#xff0…...

Monaco-Editor插件使用小坑

无法通过鼠标进行选中文本<div id"monacoEditor" class"monacoEditor"></div>外层添加了splinter拖拽组件&#xff0c;导致mousemove事件被拦截&#xff0c;给monaco-editor添加css&#xff1a;pointer-events&#xff1a;auto.monacoEditor .…...

python协同过滤算法的基于python二手物品交易网站系统

目录同行可拿货,招校园代理 ,本人源头供货商协同过滤算法在二手物品交易网站中的应用用户行为数据收集基于用户的协同过滤基于物品的协同过滤混合推荐策略冷启动问题处理实时推荐更新推荐结果评估代码实现示例系统功能整合性能优化项目技术支持源码获取详细视频演示 &#xff1…...

MySQL

我目前正在学习SQL语句,我所了解到的MySQL其实是一堆服务器,在下载服务器的时候,可以选择下载一些客户端,MySQL会自带一些客户端,像类似于终端的小黑框,还有什么bench;我还是喜欢外观好看的客户端 !我学SQL语句目前学到了数据类型,有数值型的,字符型的,二进制型的,值得一提的是…...

OpenCore Legacy Patcher终极指南:让老旧Mac焕发新生的完整方案

OpenCore Legacy Patcher终极指南&#xff1a;让老旧Mac焕发新生的完整方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher&#xf…...

如何用Bypass Paywalls Clean突破付费墙限制?技术解析与实战指南

如何用Bypass Paywalls Clean突破付费墙限制&#xff1f;技术解析与实战指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字内容付费墙日益严密的今天&#xff0c;Bypass Payw…...

嵌入式开发者的效率利器:在VS Code里实时看到MISRA-C违规提示(含头文件路径配置避坑)

嵌入式开发实战&#xff1a;用VS Code打造MISRA-C实时检查工作流 每次保存代码后才发现MISRA-C违规有多痛苦&#xff1f;想象一下这样的场景&#xff1a;你正在编写一段关键的车载控制逻辑&#xff0c;反复调试后终于通过了编译&#xff0c;却在提交前的静态检查中被揪出二十多…...

ftools架构深度解析:Stata大数据处理的技术革命

ftools架构深度解析&#xff1a;Stata大数据处理的技术革命 【免费下载链接】ftools Fast Stata commands for large datasets 项目地址: https://gitcode.com/gh_mirrors/ft/ftools 在数据科学和经济学研究的实践中&#xff0c;Stata用户经常面临一个共同的挑战&#x…...

XiaoMusic:让小爱音箱突破音乐限制的开源解决方案

XiaoMusic&#xff1a;让小爱音箱突破音乐限制的开源解决方案 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 你是否遇到过这样的困扰&#xff1a;想听的歌曲在各大…...

06-AI 编程助手实战

OpenClaw + ACP:AI 编程助手实战 “让 AI 帮你写代码、调 Bug、做重构——这就是 ACP 的魔力。” 在软件开发领域,如何让 AI 真正成为程序员的得力助手,而非仅仅是「代码补全工具」?OpenClaw 给出的答案是 ACP(Agent Coding Protocol)。通过这一协议,OpenClaw 能够与业界…...

WPF进阶:Canvas动态图形绘制与交互实现

1. Canvas动态图形绘制基础 WPF中的Canvas就像一块无限延伸的画布&#xff0c;我们可以在这块画布上自由地绘制各种图形元素。与静态绘制不同&#xff0c;动态绘制的魅力在于图形能够根据用户操作实时变化。我刚开始接触Canvas时&#xff0c;最让我兴奋的就是看到鼠标移动时能实…...