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

8路CXP相机采集系统介绍

8xCXP相机采集系统介绍

目录

1 系统概述 4

2 硬件架构 5

2.1 FPGA处理单元 5

2.2 CXP接口层 6

2.3 CXP相机说明与使用要求 7

2.4 SSI控制器板 8

3 FPGA方案 9

3.1 FPGA实现 9

3.2 Block Design说明 10

4 软件方案 14

4.1 嵌入式层 14

4.2 上位机软件(C#)​ 14

4.2.1 启动与相机扫描 15

4.2.2 参数配置 15

4.2.3 数据可视化 16

图 1 系统整体架构 4

图 2 ­ 硬件连接示意图 5

图 3 ALINX ZU19EG FPGA板卡 5

图 4 FMC-CXP-4R 板卡 6

图 5 a2A2448-210cm 机械结构 7

图 6 6芯GPIO线缆 7

图 7 485接线图 8

图 8 SSI时序图 8

图 9 FPGA数据流 9

图 10 ISP处理 10

图 11 核心模块 11

图 12 cxp_phy Block Design 12

图 13 cxp host图像输出端口 12

图 14 cxp rx Block Design 13

图 15 Rx Block Design 13

图 16 ssi数据输出Block Design 14

图 17 C# 范例界面图 15

图 18 采集图像演示 17

系统概述

✅ 应用需求:

  • 连接控制8路CXP 单lane 相机,支持POE,相机工作在外触发模式;
  • 可以通过网络接口监控CXP相机图像(只监控最新图像),传输控制指令,修改相机参数;
  • 支持3路SSI接口;

根据上述需求,本系统通过双CXP FMC子卡接入8台CoaXPress(CXP)工业相机,利用Xilinx ZYNQ SoC芯片实现高速图像采集、传输及上位机实时显示。系统采用软硬件协同设计,支持实时数据流处理与灵活的上位机控制,可广泛应用于机器视觉、工业检测等高带宽场景。

图 1 系统整体架构

特色与优势:

✅ 多通道高速采集:支持 8台相机同时工作,确保大规模采集的稳定性。
✅ 智能参数管理:匹配不同品牌相机的参数配置。
✅ 动态缓存分配:根据实际连接的相机数和参数,动态调整Rx存储,提高内存利用率。
✅ 实时数据监控:图像界面实时显示采集数据,同时可监控可用帧数,避免缓存溢出。
✅ 高效数据传输:结合 DDR4+AXIS总线,保证高吞吐量的稳定采集。
✅ 多种触发模式支持:适应不同应用场景,如工业检测、航空影像采集、武器测试等。

硬件架构

IMG_256

图 2­ 硬件连接示意图

FPGA处理单元

利用现有商用FPGA主控板,搭载外设完成系统设计。

IMG_256

图 3 ALINX ZU19EG FPGA板卡

Z19开发板主要由 ZU19EG + 4 个 DDR4+DDR4 SODIMM + eMMC +2 个 QSPI FLASH 构成。主芯片采用 Xilinx 公司的 Zynq UltraScale+ MPSoCs 系列的芯片,型号为 XCZU19EG- -2FFVC1760I。ZU19EG 芯片可分成处理器系统部分 Processor System(PS)和可编程逻辑 部分 Programmable Logic(PL)。 在 ZU19EG 芯片的 PS 端和 PL 端分别挂了 4 片 DDR4 和 1 个 260 脚 DDR4 SODIMM 卡槽,PS 端的每片 DDR4 容量高达 2GB,使得 ARM 系统和 FPGA 系统能独立处理和存储的数据的功能。PS 端的 32GB eMMC FLASH 存储芯片和 2 片 256Mb 的 QSPI FLASH 用来静态存储 MPSoCs 的操作系统、文件系统及用户数据。

该板卡有如下特点适合我们的应用场景:

  • 2个FMC HPC可以用于CXP HOST FMC子卡的连接,实现CXP相机的采集和控制;
  • 千兆以太网:提供高速稳定的网络连接,确保大数据量的快速传输,适合实时数据处理需求。
  • DDR4内存:增强数据处理能力,满足复杂运算和大容量数据处理的需求。
  • 2路485可以方便扩展外设;​

CXP接口层

IMG_256

图 4 FMC-CXP-4R 板卡

2块FMC子卡提供8路CXP-12接口,单链路带宽达12.5 Gbps,支持PoCXP供电,支持1.25,2.5,3.125,5,6.25,10,12.5 Gbps速率。FMC-CXP-4R 子卡特性如下:

  • HPC FMC连接器,使用FMC高密度连接器,符合VITA 57.1标准;
  • Equalizer/Driver均衡器与驱动器,接收来自相机的高速downlink信号,发送来组FMC IO的低速控制信号;
  • LED,每个通道配置1个双色LED,可以通过FMC IO实现R,G颜色任意组合;
  • EEPROM,使用I2C接口的MT24C02 EEPROM,256Bytes容量,可以用于存储用户数据;
  • 24V DC Power, 24V DC电源电路,可以接受来自FMC的12V或者来自外部电源的12V供电电源,为power on cable功能提供DC电源,理论CXP每通道提供最大13W输出功率;
  • Power monitor,每路CoaXPress提供1路电流、电压监测电路,当电流超过门限后,会通过alert 端口向外发出警告;
  • HDBNC, 根据CoaXPress标准,子板使用MircroBNC连接器连接Device设备;
  • SMA,双向数字输入输出接口,通常用于触发信号的路由;

名称

别名

方向

电气

接头

宽度

描述

CH0-CH3

CXP

双向

24V,12.5Gbps

Micro BNC

4

CoaXPress 物理通道,支持POE

Trigger

触发

双向

1.8V-3.3V

SMA

1

数字触发信号

CXP相机说明与使用要求

参考 a2A2448-210cm | Basler Product Documentation

IMG_256

图 5 a2A2448-210cm 机械结构

IMG_256

图 6 6芯GPIO线缆

相机会工作在外部触发模式,触发信号从Line 1/2/3 输入,注意接线时Line 1 有独立的GND。

SSI控制器板

SSI 控制板由ZYNQ7020 作为主控,通过485接口与Z19板卡完成通讯,Z19板卡上使用485接口1(A1 B1 GND),在SSI开发板上,预留好了一个RS-485接口,使用导线按照图7所示连接。

图 7 485接线图

设计通过RS485接口接收数据,经UART协议解析后转换为AXI4 Stream数据流,在第一次握手信号成功后将数据转换为源同步的方式将数据从TX1发送,每次数据会在同步时钟的上升沿改变如图8所示,第二次握手成功后数据也会按照源同步的方式从TX3输出,其他以此类推,数据是在奇数路输出,同步时钟在偶数路输出,总共能够输出4路数据与4路时钟

考虑到SSI板上没有PL端使用的按键,因此每次接收到数据32‘h55555555会使SSI板上复位,之后每一路源同步数据会转换成RS-422协议由每一路的Y和Z口输出。

图 8 SSI时序图

FPGA方案

FPGA实现

图 9 FPGA数据流

  1. 图像采集部分(左侧)

如图7所示为本系统的FPGA数据流的示意图。系统使用了8个相机(Camera1 ~ Camera8)进行图像采集,每4个相机的数据分别由一块CXP FMC采集卡接收。采用CoaXPress(CXP)高速接口,保证数据的高带宽传输。CXP FMC Card 1 连接 Camera1 ~ Camera4,负责接收这4个相机的数据流。CXP FMC Card 2 连接 Camera5 ~ Camera8,负责接收这4个相机的数据流。这两个FMC采集卡分别通过CXP链路,将数据传输到下一级数据处理模块。

  1. 数据解析部分(中间)

每块FMC采集卡的数据先通过External PHY,完成CXP链路的物理层解析。External PHY 主要用于信号处理、数据恢复,并将物理层数据转换为可供CXP Host解析的格式。

  1. CXP Host协议解析

External PHY 之后,数据进入CXP Host协议解析模块,用于解析相机数据和相机信息(如帧头、状态等)。使用Hello-FPGA的CXP HOST IP Core 接收CXP相机的视频数据、发送主机的控制信号,控制信号的发送通过AXI Lite 接口完成,适配数据的接收通过AXI Stream Video格式接收。如图8所示,stream数据一分为二,一份送给PS作为监控使用,一份送给ISP 模块进行后续处理,ISP将处理结果通过DMA存储到PS DDR内存,然后软件可以读取计算结果,该计算结果与VIDEO数据一一对应,存在同步关系。

  1. 数据流处理部分(右侧)

AXIS数据流拆分,解析后的数据被划分为8路AXIS数据流(Stream 1 ~ Stream 8),每路数据流分别对应一个相机。这些数据流由Rx(数据接收引擎)模块处理,确保数据的稳定传输。Stream 1 Rx 处理 Camera1 数据流,Stream 2 Rx 处理 Camera2 数据流...(依次类推)。每个Rx独立工作,保证多通道数据的高效传输。经过Rx处理后的8路数据流被存储到ZYNQ PS端的DDR4中。DDR4作为高速缓存,保证数据不会因为带宽限制而丢失。存储的数据可用于进一步处理,如,直接传输到上位机进行显示或存储。

这里8路相机,每个相机大概分配不超过128MB的缓存,主要用于视频监控。8路计算结果合并成1路通过DMA存储到PS DDR内存,软件读取的时候按照存储顺序对计算结果机型划分。

IMG_256

图 10 ISP处理

Block Design说明

如图 11 所示,Block Design 的核心部分由 cxp_phy 和 cxp_rx 组成。其中,cxp_phy 负责 CXP 链路的物理层解析,包括信号处理和数据恢复,并将数据转换为标准的图像格式;cxp_rx 则对 cxp_phy 解析后的图像数据进行拆分和接收。

图 11 核心模块

图 12 展示了 cxp_phy 的内部结构,主要由 ext_phy 和 cxp_host 组成:

  • ext_phy 实现 CXP 物理层处理;
  • cxp_host 负责 CXP 协议解析,并输出图像数据。

本设计采用两个 ext_phy 模块,实现八路 CXP 相机的输入。cxp_host 输出的 dma_data[511:0] 包含所有八路相机的数据,每个相机的数据位宽是64位。其中:

第1路相机数据:dma_data[63:0]

第2路相机数据:dma_data[127:64]

……

第8路相机数据:dma_data[511:448]

此外,数据流控制信号定义如下:

  • dma_ready[7:0]:指示下游模块是否已准备好接收对应通道的数据。
  • dma_valid[7:0]:表示当前时刻对应相机的数据是否有效。
  • dma_sop[7:0](Start of Packet):标识新帧的起始,仅在帧的第一行首个像素时拉高。
  • dma_eol[7:0](End of Line):标识一行数据的结束,在每行最后一个像素时拉高。

图 12 cxp_phy Block Design

图 13 cxp host图像输出端口

如图 14 所示,cxp_rx 内部通过 video_to_axis 模块,将八路图像数据拆分,并转换为 AXI Stream 格式。如果需要对某一路相机的数据进行图像处理,只需复制该通道的 AXI Stream 数据并送入图像处理模块。复制操作可通过简单的组合逻辑实现,只需在 Block Design 中添加复制模块,并分别连接至图像处理模块和原有模块。

图 14 cxp rx Block Design

cxp_rx 还包含 Rx,用于将接收到的图像数据缓存至 DDR,如图 15 所示。

图 15 rx Block Design

如图 16 所示,ssi 数据输出部分的 Block Design 采用自定义的 axi_stream_generate 模块生成 AXI Stream 数据,并通过 axis_broadcaster 进行分流:

  • 一路数据进入 axi_stream_FIFO,供上位机监测;
  • 另一路通过 axis_to_uart 模块转换为串口数据,并通过 RS485 传输至 ssi 板卡。

在实际应用中,可将 axi_stream_generate 模块替换为用户的图像处理模块,确保处理后的图像参数输出符合 AXI Stream 格式,并连接至 axis_broadcaster 以实现数据分流。

图 16 ssi数据输出Block Design

软件方案

嵌入式层

嵌入PS的Linux系统驱动PL IP核,通过AXI总线控制Rx,实现内存到网络的数据搬运。嵌入式系统基于ZYNQ架构,PS端运行Linux系统,并包含相应的网络驱动。图像数据采集后,通过CXP Host模块解析并整理成AXIS数据流,随后传输至PS端的DDR4缓存区,等待上位机读取。

上位机软件(C#)​

hello-fpga会提供C++/C# API接口,提供8个相机控制、显示的C# 范例,这里8路相机默认使用相同的配置,如果需要每个相机进行不同的配置,可以修改范例程序得到。

上位机软件基于C++/C#开发,主要包含设备管理、参数配置、实时显示及数据存储模块。上电后,上位机首先执行设备扫描,读取相机的设备信息。基于厂商提供的XML文件解析相机配置参数的地址和格式,并进行初始化配置。

在采集启动前,上位机会根据检测到的相机数量,动态分配 Rx 的缓存空间,并发送启动命令。采集过程中,上位机定期查询 Rx 的缓存状态,并从中读取数据,实时解码并显示在界面上。此外,界面右侧实时更新可用帧数,确保数据流畅显示,并支持用户参数调整和存储功能。

图 17 C# 范例界面图

启动与相机扫描

8个相机控制、显示的C# 范例如图9所示,上电后,软件首先执行 Scan Cameras 操作,以检测并识别系统中可用的CXP相机。扫描流程如下:上位机会向每个连接的相机发送查询命令,并从相机端读取一系列关键寄存器信息,如,厂商名称、型号、制造信息、固件版本等。

为了正确解析相机参数,上位机会根据不同厂商的XML配置文件解析相机的参数结构,获取XML文件中的寄存器地址映射,获取参数存储地址和数据格式。

根据扫描结果,动态创建相机实例,存储相机相关信息,以便后续参数配置和数据采集。

参数配置

在成功扫描到相机后,用户可以在右侧参数面板中配置相机的工作模式,参数包括:

  • 图像尺寸

Image Width(ROI_X):设置横向分辨率。

Image Height(ROI_Y):设置纵向分辨率。

  • 帧率控制

Acquisition Frame Rate:设置采集帧率(FPS),影响数据吞吐量。

  • 触发模式

Trigger Source:选择触发信号源,如**软件触发、外部触发(IP Line0)**等。

  • 曝光设置

Exposure Mode:设置曝光模式(自动/手动)。

Exposure Time(μs):手动模式下的曝光时间,单位为微秒。

  • 图像增强

Camera Gain:调整增益,提高低亮度场景下的图像清晰度。

Black Level:设置黑电平,提高图像对比度。

  • 采集模式

TakeContinueMode(连续模式):启用后,相机会持续采集数据,直到用户手动停止。

Trigger Mode(触发模式):仅在收到触发信号时采集图像。

数据可视化

在用户点击 Start 按钮后,系统进入正式的数据采集流程:

(1)动态分配Rx缓存

由于不同相机的分辨率、帧率可能不同,为了优化内存使用,上位机会根据读取扫描到的相机数,动态分配 Rx 缓存空间。计算每个相机的数据吞吐量,合理分配DDR4存储区域,避免溢出或带宽瓶颈。为每个相机创建独立的缓存队列,保证数据存储有序。

(2)实时数据传输、显示

如图10所示,为8个相机采集画面的截图(只装了两个镜头,其余相机机盖未打开显示为黑色画面)。上位机不断查询 Rx 缓存中的数据量,即当前可读取的帧数。当缓存中有新数据时,上位机会将其读取并进行解码,采集到的数据会通过图形界面显示,每个窗口对应一个相机的数据流。右侧“Available Frames”区域会动态显示当前可用帧数,帮助用户监测数据采集状态。

(3)数据停止与存储

当用户点击 Stop 按钮时,系统会: 停止向 Rx 发送新的采集请求。读取并存储剩余的缓存数据,确保数据完整性。释放动态分配的缓存空间,提高系统资源利用率。

图 18 采集图像演示

相关文章:

8路CXP相机采集系统介绍

8xCXP相机采集系统介绍 目录 1 系统概述 4 2 硬件架构 5 2.1 FPGA处理单元 5 2.2 CXP接口层 6 2.3 CXP相机说明与使用要求 7 2.4 SSI控制器板 8 3 FPGA方案 9 3.1 FPGA实现 9 3.2 Block Design说明 10 4 软件方案 14 4.1 嵌入式层 14 4.2 上位机软件(C…...

Stable Diffusion 基础模型结构超级详解!

1. Transformer 第一个只用 Attention 机制来解决序列到序列问题的模型,最早被 Google 用来解决翻译问题 对于中英翻译而言,需要解决三个具体的问题: 如何用数字表示中文和英文 如何让神经网络理解语义 如何让神经网络生成英文 1.1 Tok…...

【Linux网络(七)】数据链路层

目录 1、认识MAC地址 2、 mac帧格式 3、局域网的通信原理 4、ARP协议 浏览器输入url1后发生的事情:(面试题) 数据链路层解决的是:直接相连的主机(不仅仅包括电脑,还包括路由器)之间&#x…...

Nginx RTMP 处理模块 (ngx_rtmp_handler.c) 详细分析

ngx_rtmp_handler 是 Nginx RTMP 模块中的核心处理部分,主要负责处理 RTMP 流会话中的数据接收、发送、ping 操作以及分块大小的设置等。 1. 全局变量 ngx_rtmp_naccepted: 记录接受的 RTMP 连接数。 ngx_rtmp_bw_out 和 ngx_rtmp_bw_in: 分别表示输出带宽和输入带…...

2025年渗透测试面试题总结-某奇安信-Ateam(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 奇安信-Ateam 一、SQL注入攻防技术体系 1.1 SQL注入类型矩阵(基于利用方式) …...

前端工程化--gulp的使用

gulp 介绍 gulp 是一个基于 Nodejs 的自动化构建工具,中文主页能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的合并、压缩、检查、监听文件变化、浏览器自动刷新、测试等任务 使用步骤: 安装 nodejs 全局安装 gulp npm install…...

谈谈对spring IOC的理解,原理和实现

一、IoC 核心概念 1. 控制反转(Inversion of Control) 传统编程中对象自行管理依赖(主动创建),而IoC将控制权转移给容器,由容器负责对象的创建、装配和管理,实现依赖关系的反向控制。 2. 依赖…...

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架,也兼容支持老框架MFC。使得用户在Windows 10 IoT下可以对原MFC工程进行功能升级,不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在Windows 10 IoT平台下继续使用MFC进行开发。 本文展示MFC串口程序…...

31天Python入门——第16天:模块与库详解

你好,我是安然无虞。 文章目录 Python模块模块之间的调用 Python包库的概念Python标准库安装第三方库 \_\_name\_\_ \_\_main\_\_ Python模块 在 Python 中, 模块是一个包含函数、变量和类等代码定义的py文件. 所以也可以说, 普通的py文件就是一个模块. 模块可以…...

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象,同时确保良好的性能表现。它通过复制现有对象(原型)来创建新对象,而非使用传统的构造函数创建方式。这种设计…...

Redis + Caffeine多级缓存电商场景深度解析

Redis Caffeine多级缓存 Redis Caffeine多级缓存电商场景深度解析一、实施目的二、具体实施2.1 架构设计2.2 组件配置2.3 核心代码实现 三、实施效果3.1 性能指标对比3.2 业务指标改善3.3 系统稳定性 四、关键策略4.1 缓存预热4.2 一致性保障4.3 监控配置Prometheus监控指标 …...

spring-ai ollama小试牛刀

序 本文主要展示下spring-ai ollama的使用 示例 pom.xml <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency>这里以ollama示例 配置 spring:ai:olla…...

在 CentOS 系统中开机自动执行 Shell 脚本

在 CentOS 系统中&#xff0c;可以通过以下方法设置开机自动执行 Shell 脚本。推荐使用 systemd 服务&#xff08;现代 Linux 系统的标准方式&#xff09;&#xff0c;也可以使用传统的 /etc/rc.local 方法。 方法 1&#xff1a;使用 Systemd 服务&#xff08;推荐&#xff09;…...

【Linux】应用层协议 HTTP

应用层协议 HTTP 一. HTTP 协议1. URL 地址2. urlencode 和 urldecode3. 请求与响应格式 二. HTTP 请求方法1. GET 和 POST (重点) 三. HTTP 状态码四. HTTP 常见报头五. 手写 HTTP 服务器 HTTP&#xff08;超文本传输协议&#xff09;是一种应用层协议&#xff0c;用于在万维网…...

Linux下的socket演示程序3(udp)

server.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h>#define SER_PORT 8888 //端口号 #define SER_IP "10.148.4.168" //服务器IP…...

数据可视化TensorboardX和tensorBoard安装及使用

tensorBoard 和TensorboardX 安装及使用指南 tensorBoard 和 TensorBoardX 是用于可视化机器学习实验和模型训练过程的工具。TensorBoard 是 TensorFlow 官方提供的可视化工具&#xff0c;而 TensorBoardX 是其社区驱动的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…...

【Hugging Face 开源库】Diffusers 库 —— 扩散模型

Diffusers 的三个主要组件1. DiffusionPipeline&#xff1a;端到端推理工具__call__ 函数callback_on_step_end 管道回调函数 2. 预训练模型架构和模块UNetVAE&#xff08;Variational AutoEncoder&#xff09;图像尺寸与 UNet 和 VAE 的关系EMA&#xff08;Exponential Moving…...

AWTK-WEB 快速入门(6) - JS WebSocket 应用程序

WebSocket 可以实现双向通信&#xff0c;适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序&#xff0c;并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer&#xff1a; https://awtk.zlg.cn/web/index.html …...

tcl语法中的命令

tcl语法中存在多少个命令呢&#xff1f; 如下&#xff0c; after errorInfo load pwd tcl_rcFileName append eval lrange re_syntax tcl_startOfNextWord apply exec lrepeat read tcl_startOfPreviousWord argc exit lreplace refchan tcl_traceCompile argv expr lreverse r…...

ESLint报错:Could not find config file.

如果你的ESLint的版本大于 8&#xff0c;同时使用 .eslinrc.js 和 .eslintignore 作为配置文件&#xff0c;且目前用的是 VSCODE &#xff0c;就有可能遇到报错&#xff1a; Could not find config file. 这个是因为 VSCode 中 ESLint 插件的配置 eslint.useFlatConfig 的问题…...

北斗导航 | 基于北斗三号短报文通信的北斗-YOLO融合系统原理,算法公式,系统流程框图,matlab代码,应用场景

以下是关于基于北斗三号短报文通信的北斗-YOLO融合系统的详细解析,包含原理、算法公式、系统流程、Matlab代码框架和应用场景。一、系统原理 北斗-YOLO融合系统结合了北斗三号短报文通信(双向通信能力)和YOLO目标检测算法,用于在无地面网络覆盖区域实现实时目标检测与数据传…...

Vue3 中使用 vuedraggable 实现拖拽排序功能,分组拖拽

Vue3 中使用 vuedraggable 实现拖拽排序功能&#xff0c;分组拖拽 安装draggable npm install vuedraggablenext --save基础用法示例 <template><div class"app-container"><draggable v-model"list" item-key"id":group"…...

使用VSCODE导致CPU占用率过高的处理方法

1&#xff1a;cpptools 原因&#xff1a;原因是C/C会在全局搜索文件&#xff0c;可以快速进行跳转&#xff1b;当打开的文件过大&#xff0c;全局搜索文件会占用大量CPU&#xff1b; 处理方法&#xff1a; 1&#xff1a;每次只打开小文件夹&#xff1b; 2&#xff1a;打开大文…...

【力扣hot100题】(004)盛水最多的容器

现在能这么快做出来纯粹是因为当时做的时候给我的印象实在太深了。 犹记得这题是当年开启我用CSDN记录leetcode日记历史的开端。 总之印象太深了不会都不行啊&#xff01;&#xff01;记得当年是想到用各种动态规划回溯等等等等最终发现是最简单贪心和双指针。 解法也是非常简…...

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …...

宝塔面板部署 Laravel 项目无法访问静态资源的解决方法

提示:“奔跑吧邓邓子” 的常见问题专栏聚焦于各类技术领域常见问题的解答。涵盖操作系统(如 CentOS、Linux 等)、开发工具(如 Android Studio)、服务器软件(如 Zabbix、JumpServer、RocketMQ 等)以及远程桌面、代码克隆等多种场景。针对如远程桌面无法复制粘贴、Kuberne…...

C/C++中的条件编译指令#if

#if 是 C/C 中的预处理指令&#xff0c;用于条件编译。它允许根据预定义的条件来决定是否编译某段代码。#if 通常与 #define、#ifdef、#ifndef、#else 和 #endif 等指令一起使用。 基本语法 #if 条件表达式// 如果条件表达式为真&#xff0c;编译这部分代码 #else// 如果条件…...

【设计模式】策略模式(Strategy Pattern)详解

策略模式&#xff08;Strategy Pattern&#xff09;详解 一、策略模式的定义 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一组算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以相互替换&#xff0c;从而让算法的…...

Eclipse IDE for ModusToolbox™ 3.4环境通过JLINK调试CYT4BB

使用JLINK在Eclipse IDE for ModusToolbox™ 3.4环境下调试CYT4BB&#xff0c;配置是难点。总结一下在IDE中配置JLINK调试中遇到的坑&#xff0c;以及如何一步一步解决遇到的问题。 1. JFLASH能够正常下载程序 首先要保证通过JFLASH(我使用的J-Flash V7.88c版本)能够通过JLIN…...

修改git在提交代码时的名称

在git中&#xff0c;如果想修改提交代码作者的名字&#xff0c;可以进行以下操作&#xff1a; 1.在桌面或者文件夹内右击鼠标&#xff0c;点开Git Bash here。 2.进入后&#xff0c;通过git config user.name 回车查看当前名称。 3.通过git config --global user.name "…...