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

【征程 6】工具链 VP 示例中 Cmakelists 解读

1. 引言

在文章【征程 6】VP 简介与单算子实操中,介绍了 VP 是什么,并以单算子 rotate 为例,介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一起看一下 Cmakelists 在 VP 示例中扮演的角色。

作为对 C++不那么熟悉的伙伴,可能会好奇:Cmakelists.txt 怎么写?当有多层 Cmakelists.txt 时,他们的调用关系是什么?由于本人是属于对 C++不那么熟悉的同学,下面会从我的视角来介绍这个问题,如果其中有错误或表述不当的地方,欢迎评论指正。

本文是为了服务于另外一篇文章:【征程 6】工具链 VP 示例为什么能运行。

2. 基础知识

写一段 c++代码,怎么才能跑起来呢?

简单来说,需要在开发机上编译生成可执行文件,然后将可执行文件(bin)和相关依赖(lib,动静态链接库)拷贝到开发板上,执行“可执行文件”即可。

补充解释一下动静态链接库:

静态(函数)库 扩展名为(。a 或。lib, .a 是 linux 侧,。lib 是 windows 侧),静态库在编译时,会直接整合到目标程序中,编译出来的文件会比较大。

  • 优点:编译出的可执行文件 可以独立运行,不再需要向外部要求读取函数库的内容。
  • 缺点:从升级难易度来看没有优势,如果函数库更新,需要重新编译。

动态(函数)库 扩展名为(。so 或。dll, .so 是 linux 侧,。dll 是 windows 侧),动态库在编译时,在程序里只有一个“指向”的位置,也就是说,当可执行文件需要使用到 函数库 中的内容时,程序才会去读取 函数库 来使用。

  • 优点:方便产品功能升级,只要替换对应动态库即可,不必重新编译整个可执行文件。
  • 缺点:可执行文件无法单独运行。

在构建稍微规范/复杂点的 C++项目时,通常会用到 CmakeList,下面来看一下。

2.1 代码结构

构建一个简单但典型的 case 来说明一个 C++项目的调用运行逻辑,项目结构如下:

./
│── CMakeLists.txt       # 顶层 CMakeLists.txt
│── src/                 # 源代码目录
│   ├── CMakeLists.txt   # 子目录 CMakeLists.txt
│   ├── main.cpp         # 主程序
│   ├── main.h           # 头文件
│   ├── module/          # 子模块,如果有的话
│   │   ├── CMakeLists.txt
│   │   ├── module.cpp
│   │   ├── module.h
│── build/               # CMake 编译输出目录,在这个目录里进行编译

在 CMake 项目中,通常会有 顶层 CMakeLists.txt,以及 src 子目录中的 嵌套 CMakeLists.txt,它们共同组织代码的编译流程。CMake 使用 层次化调用,即 顶层 CMakeLists.txt 调用子目录 CMakeLists.txt。编译过程如下:

顶层 CMakeLists.txt: 设置编译选项、添加 src 目录、指定最终目标

src/CMakeLists.txt: 添加 main.cpp 和 main.h、包含子模块

module/CMakeLists.txt: 定义 module.cpp、生成库文件

2.2 CmakeList

  • 最外层 CmakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)    # 定义项目名称set(CMAKE_CXX_STANDARD 11)   # 使用 C++11 标准
# 添加子目录 (调用 src/CMakeLists.txt)
# 让 CMake 进入 src 目录,继续解析 src/CMakeLists.txt
add_subdirectory(src)
# 最终的可执行目标由 src 目录下的 CMakeLists.txt 负责
  • src/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 添加子模块 (module 目录), 进入 module 目录,调用 module/CMakeLists.txt
add_subdirectory(module)
# 让编译器找到 module.h
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/module)
# 指定 main.cpp 作为源文件
set(SRC_FILES main.cpp)
# 生成MyExecutable可执行文件
add_executable(MyExecutable ${SRC_FILES})
# 链接 MyModule库, MyModule在module/CMakeLists.txt中定义
target_link_libraries(MyExecutable MyModule)
  • src/module/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 包含当前目录头文件
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# 编译 module.cpp 为 MyModule 静态库
add_library(MyModule STATIC module.cpp)

2.3 Main

  • main.cpp
#include <iostream>
#include "main.h"
#include "module.h"int main() {std::cout << "Hello, main c++ CMake!" << std::endl;module_function();return 0;
}
  • main.h
#ifndef MAIN_H
#define MAIN_H#endif // MAIN_H

2.4 module

  • module.cpp
#include "module.h"
#include <iostream>void module_function() {std::cout << "Module function called!" << std::endl;
}
  • module.h
#ifndef MODULE_H
#define MODULE_Hvoid module_function();#endif // MODULE_H

2.5 编译与执行

# 进入项目目录
cd ./# 删除旧的 build 目录,重新编译
rm -rf build
mkdir build && cd build# 运行 CMake 配置
cmake ..# 编译
make -j8# 运行可执行文件
./src/MyExecutable

输出:

Hello, main c++ CMake!
Module function called!

3. VP 示例中 Cmakelists

3.1 vp/code/07_single_rotate/CMakelists.txt

在 vp/code/07_single_rotate 目录下的 CMakelists.txt,解读如下:

# 设置 CMake 最低版本,确保兼容性
cmake_minimum_required(VERSION 3.0)
# 定义项目名称为 07_single_rotate
project(07_single_rotate)
# 设置编译选项,添加 -std=c++11 选项,使用 C++11 标准进行编译
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ")# include_directories(...) 指定 头文件搜索路径,用于 编译时查找头文件
include_directories(     ${CMAKE_CURRENT_SOURCE_DIR}/        # 当前源码目录${DEPS_SOURCE_DIR}/ucp/include/     # UCP 组件头文件   ${DEPS_SOURCE_DIR}/hlog/include/    # hlog 日志库${DEPS_SOURCE_DIR}/fmt/include/     # fmt 格式化库${DEPS_SOURCE_DIR}/opencv/include/) # OpenCV 视觉库# 指定库文件 (.so 或 .a) 搜索路径,用于 链接时查找库文件
link_directories(${DEPS_SOURCE_DIR}/ucp/lib${DEPS_SOURCE_DIR}/opencv/lib${DEPS_SOURCE_DIR}/hlog/lib${DEPS_SOURCE_DIR}/fmt/lib${DEPS_SOURCE_DIR}/opencv/lib)        
# 递归搜索 *.cpp 源文件,并存储到 TEST_SRC 变量。
# GLOB_RECURSE 会搜索 当前目录及子目录 的 .cpp 文件。
file(GLOB_RECURSE TEST_SRC *.cpp)
# 创建可执行文件 single_rotate,包含 TEST_SRC 变量中的所有 .cpp 文件
add_executable(single_rotate ${TEST_SRC})
# target_link_libraries(...) 链接所需的库
target_link_libraries(single_rotate hbucp hbvp hlog fmt opencv_world)
# 将 single_rotate 安装到 RELEASE_BIN_DIR 目录。
install(TARGETS single_rotate DESTINATION ${RELEASE_BIN_DIR})
  1. DEPS_SOURCE_DIR 在哪设置的?(3.2 节中设置)
  2. RELEASE_BIN_DIR 在哪设置的?(3.2 节中设置)

带着这 2 个疑问,我们往外看一层 CmakeLists.txt。

3.2 vp/code/CMakelists.txt

# 设置 CMake 最低版本,确保兼容性
cmake_minimum_required(VERSION 3.0)
# 项目名称 设置为 vp_samples
project(vp_samples)
# 定义 编译选项 PLATFORM_AARCH64,默认 开启 (ON),用于 区分 aarch64(ARM 架构)和 x86(PC 端)
option(PLATFORM_AARCH64 "Target platform aarch64" ON)
# 强制使用 C++11 标准 进行编译
set(CMAKE_CXX_STANDARD 11)
# 设置编译模式,变量 CMAKE_BUILD_TYPE 由外部传入,通常可选Debug/Release
SET(CMAKE_BUILD_TYPE ${build_type})
# message(...) 打印当前编译模式
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")# 设置编译 & 预处理选项,几个选项解读见下面
set(CMAKE_CXX_FLAGS "-std=c++11 -Wno-unknown-pragmas -fPIC -O3 -Wl,-unresolved-symbols=ignore-in-shared-libs")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ")
set(CMAKE_C_FLAGS "-Wno-unknown-pragmas -fPIC -O3")
# 打印编译参数
message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")# 根据平台 (aarch64 or x86) 设置依赖路径
if(PLATFORM_AARCH64)message(STATUS "build aarch64")# 依赖路径 DEPS_SOURCE_DIR 设为 ...deps_aarch64set(DEPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../deps_aarch64)
else()# 添加编译宏 -DUCP_X86add_definitions(-DUCP_X86)message(STATUS "build x86")# 依赖路径 DEPS_SOURCE_DIR 设为 ...deps_x86set(DEPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../deps_x86)
endif()if(PLATFORM_AARCH64)# 设置输出路径set(OUTPUT_ROOT ${PROJECT_SOURCE_DIR}/../vp_samples/script/)set(RELEASE_LIB_DIR ${OUTPUT_ROOT}/aarch64/lib/)set(RELEASE_BIN_DIR ${OUTPUT_ROOT}/aarch64/bin/)# 复制 文件install(DIRECTORY ${DEPS_SOURCE_DIR}/ucp/bin/image DESTINATION ${RELEASE_BIN_DIR})
else()set(OUTPUT_ROOT ${PROJECT_SOURCE_DIR}/../vp_samples/script_x86/)set(RELEASE_LIB_DIR ${OUTPUT_ROOT}/x86/lib/)set(RELEASE_BIN_DIR ${OUTPUT_ROOT}/x86/bin/)# 复制 文件file(COPY ${DEPS_SOURCE_DIR}/ucp/bin DESTINATION ${OUTPUT_ROOT}/x86/)
endif()# 安装文件(通常是库文件、头文件等)到目标目录
install(FILES ${DEPS_SOURCE_DIR}/opencv/lib/libopencv_world.so.3.4 DESTINATION ${RELEASE_LIB_DIR})
# file(GLOB HLOG_LIBS "...") 匹配 libhlog.so* 并安装
file(GLOB HLOG_LIBS "${DEPS_SOURCE_DIR}/hlog/lib/libhlog.so*")
install(FILES ${HLOG_LIBS} DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhbucp.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhlog_wrapper.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhbvp.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhb_arm_rpc.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libperfetto_sdk.so DESTINATION ${RELEASE_LIB_DIR})
# 额外安装 x86 平台的特殊库
if(NOT PLATFORM_AARCH64)install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libarm_model_gdc.so DESTINATION ${RELEASE_LIB_DIR})install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhbmem.so.1 DESTINATION ${RELEASE_LIB_DIR})install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libalog.so.1 DESTINATION ${RELEASE_LIB_DIR})
endif()
# 添加子项目 07_single_rotate
add_subdirectory(07_single_rotate)
  1. PROJECT_SOURCE_DIR 在哪设置的? 答:PROJECT_SOURCE_DIR 是指向项目源代码根目录的 CMake 预定义变量,常用于构建路径、引用资源文件等,帮助 CMake 找到项目中的文件。
  2. build_type 在哪设置的? 答:在 build.sh 脚本中,详情可见文档:【征程 6】工具链 VP 示例为什么能运行。

4. 总结

本文主要介绍在 VP 单算子示例中用到的 CmakeLists.txt 应该怎么写,主要适用于和我一样 C++基础学习用户~

相关文章:

【征程 6】工具链 VP 示例中 Cmakelists 解读

1. 引言 在文章【征程 6】VP 简介与单算子实操中&#xff0c;介绍了 VP 是什么&#xff0c;并以单算子 rotate 为例&#xff0c;介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一…...

深入解析 Jenkins Agent 的 .jnlp 启动文件

&#x1f9e9; 深入解析 Jenkins Agent 的 .jnlp 启动文件 在 Jenkins 中&#xff0c;通过 JNLP&#xff08;Java Network Launch Protocol&#xff09;方式连接 Agent 是一种常见且灵活的方式。你可能曾见过类似这样的命令&#xff1a; java -jar agent.jar -jnlpUrl file:/…...

谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

0x01、Redis 主从复制的实现原理是什么?

Redis 主从复制概述 Redis 的主从复制是一种机制&#xff0c;允许一个主节点&#xff08;主实例&#xff09;将数据复制到一个或多个从节点&#xff08;从实例&#xff09;。通过这一机制&#xff0c;从节点可以获取主节点的数据并与之保持同步。 复制流程 开始同步&#xf…...

noscript 标签是干什么的

vue public目录下的 index.html 会有 <noscript> 标签不知道是干吗的。 其实 noscript 标签在不支持或是禁用JavaScript 的浏览器中显示替代的内容。这个元素可以包含任何 HTML 元素。这个标签的用法也非常简单&#xff1a; <noscript><strong>Were sorry …...

[创业之路-366]:投资尽职调查 - 尽调核心逻辑与核心影响因素:价值、估值、退出、风险、策略

目录 一、VC投资的本质是冒着不确定性风险进行买卖、生意&#xff0c;为了赚取高额回报 1、VC投资的核心本质 2、VC投资的运作机制 3、VC投资的风险与挑战 4、VC投资的底层逻辑 5、总结&#xff1a;VC投资的本质再定义 二、尽调核心逻辑 1、尽调的含义 2、尽调的逻辑方…...

MOP数据库中的EXPLAIN用法

EXPLAIN 是 SQL 中的一个非常有用的工具&#xff0c;主要用于分析查询语句的执行计划。执行计划能展示数据库在执行查询时的具体操作步骤&#xff0c;像表的读取顺序、使用的索引情况、数据的访问方式等&#xff0c;这有助于我们对查询性能进行优化。 语法 不同的数据库系统&…...

Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 本地优先且可扩展 。

一、软件介绍 文末提供源码下载学习 Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 从您的原始会议记录中生成强大的摘要&#xff0c;本地优先且可扩展 。使用开源模型 &#xff08;Whisper & Llama&#xff09; 离线工作&#xff0c;高度可扩展 &#xff0c;由插…...

MSCKF及可观性总结

可观性 参考链接 真实VIO系统不能观的维度是4&#xff08;位置和yaw角&#xff09;&#xff0c;由于EKF的转移和观测Jacobian矩阵的线性化点不同、不可观方向噪声的存在&#xff0c;实际MSCKF不能观的维度变成了3&#xff0c;绕重力轴的旋转&#xff08;yaw角&#xff09;被错…...

上篇:新能源轻卡城配物流经济/动力模式量化定义(理论篇)——数学暴力破解工程困局

副标题&#xff1a;用微分方程撕开模式切换本质&#xff0c;用传感器数据重构载重真相 引言&#xff1a;为什么轻卡模式定义比乘用车难10倍&#xff1f; 行业现状痛点&#xff1a; 中国新能源轻卡日均载重波动高达300%&#xff08;空载0kg→满载4.5吨&#xff09;某头部车企实…...

Ubuntu22环境下,Docker部署阿里FunASR的gpu版本

番外: 随着deepseek的爆火,人工智能相关的开发变得异常火爆,相关的大模型开发很常见的agent智能体需要ASR语音识别的功能,阿里开源的FunASR几乎是把一个商业的项目放给我们使用了。那么我们项目中的生产环境怎么部署gpu版本的语音识别服务呢?经过跟deepseek的一上午的极限…...

Python 实现最小插件框架

文章目录 Python 实现最小插件框架1. 基础实现项目结构plugin_base.py - 插件基类plugins/hello.py - 示例插件1plugins/goodbye.py - 示例插件2main.py - 主程序 2. 更高级的特性扩展2.1 插件配置支持2.2 插件依赖管理2.3 插件热加载 3. 使用 setuptools 的入口点发现插件3.1 …...

内网邮箱服务器搭建-详解

目录 一、背景 二、搭建邮箱需要具备的基础知识 1、smtp&#xff08;Simple Mail Transfer Protocol&#xff09; SMTP工作原理 SMTP 命令 SMTP 协议端口 2、pop3&#xff08;Post Office Protocol&#xff09; POP3特点 POP3工作原理 3、imap4&#xff08;Internet M…...

21 天 Python 计划:使用SQLAlchemy 中的ORM查询

文章目录 准备工作图书表 books分类表 categoriesORM 对象定义 一、根据主键获取记录二、AND 查询三、 常用方法四、OR 查询五、 5. AND 和 OR 并存的查询六、巧用列表或者字典的解包给查询方法传参七、其它常用运算符八、查询指定列九、内连接、外连接9.1 内连接9.2 外连接9.3…...

使用 LLaMA-Factory 微调 llama3 模型(二)

使用 LLaMA-Factory 微调 llama3 模型 1. LLaMA-Factory模型介绍 https://github.com/hiyouga/LLaMA-FactoryLLaMA-Factory 是一个用于大型语言模型&#xff08;LLM&#xff09;微调的工具&#xff0c;它旨在简化大型语言模型的微调过程&#xff0c; 使得用户可以快速地对模型…...

并发编程--条件量与死锁及其解决方案

并发编程–条件量与死锁及其解决方案 文章目录 并发编程--条件量与死锁及其解决方案1.条件量1.1条件量基本概念1.2条件量的使用 2. 死锁 1.条件量 1.1条件量基本概念 在许多场合中&#xff0c;程序的执行通常需要满足一定的条件&#xff0c;条件不成熟的时候&#xff0c;任务…...

JAVA SE 自我总结

目录 1. 字面常量 2. 数据类型 3. 变量 4. 类型转换 5. 实参和形参的关系 6. 数组 6.1 数组的概念 6.2 动态初始化 6.3 静态初始化 7. 数据区 ​编辑 8. 数组的拷贝 8.1 赋值拷贝 8.2 方法拷贝 9. 代码块 10. 内部类 10.1 实例内部类 10.2 静态内部类 10.3 …...

RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings)

RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings) 代码解释 docsearch = FAISS.from_texts(documents, embeddings) 这行代码主要作用是基于给定的文本集合创建一个向量数据库(这里使用 FAISS 作为向量数据库工具 )。具体说明如下: FAISS :FAISS …...

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?

虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解&#xff1f; code review! 文章目录 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解&#xff1f;理解这句话的关键点1.类&#xff08…...

鸢尾花分类的6种机器学习方法综合分析与实现

鸢尾花分类的6种机器学习方法综合分析与实现 首先我们来看一下对应的实验结果。 数据准备与环境配置 在开始机器学习项目前&#xff0c;首先需要准备编程环境和加载数据。以下代码导入必要的库并加载鸢尾花数据集&#xff1a; import numpy as np import pandas as pd impo…...

vite,Vue3,ts项目关于axios配置

一、安装依赖包 npm install axios -S npm install qs -S npm install js-cookie 文件目录 二、配置线上、本地环境 与src文件同级,分别创建本地环境文件 .env.development 和线上环境文件 .env.production # 本地环境 ENV = development # 本地环境接口地址 VITE_API_URL =…...

mysql:重置表自增字段序号

情况一&#xff1a;清空表数据后重置自增 ID 如果你希望清空表中的所有数据&#xff0c;并将自增 ID 重置为初始值&#xff08;通常为 1&#xff09; 1、truncate truncate table tb_dict; 2、delete 配合 alter 语句 delete from tb_dict; alter table tb_dict AUTO_INCR…...

STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的实践方式

本文是《STM32 模块化开发实战指南》第 4 篇,聚焦于 BLE 模块中的状态管理问题。我们将介绍如何通过有限状态机(Finite State Machine, FSM)架构,实现 BLE 广播、扫描、连接等行为的解耦与可控,并配合事件队列驱动完成主从共存、低功耗友好、状态清晰的 BLE 应用。 一、为…...

HTML — 浮动

浮动 HTML浮动&#xff08;Float&#xff09;是一种CSS布局技术&#xff0c;通过float: left或float: right使元素脱离常规文档流并向左/右对齐&#xff0c;常用于图文混排或横向排列内容。浮动元素会紧贴父容器或相邻浮动元素的边缘&#xff0c;但脱离文档流后可能导致父容器高…...

IP节点详解及国内IP节点获取指南

获取国内IP节点通常涉及网络技术或数据资源的使用&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;对于网络连接和通信至关重要。详细介绍几种修改网络IP地址的常用方法&#xff0c;无论是对于家庭用户还是企业用户&#xff0c;希望能找到适合自己的解决方案。以下是方法…...

AD9253 LVDS 高速ADC驱动开发

1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下&#xff0c;14bit - 2Lane - 1frame 模式。 对应&#xff1a;data clock时钟为500M DDR mode。data line rate&#xff1a;1Gbps。frame clock&#xff1a;1/4 data clock 具体内容&#xff1a;…...

pycharm2024.3.5版本配置conda踩坑

配置解释器是conda时&#xff0c;死活选不到自己的环境 看了很多&#xff0c;都是说要选scripts下的conda.exe 都没用 主要坑在于这是新版的pycharm 是配置condabin 下的 conda.bat 参考&#xff1a;PyCharm配置PyTorch环境(完美解决找不到Conda可执行文件python.exe问题) …...

【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红

如图所示是我的clion项目目录 我自定义的data_structure.h和func_declaration.h在unit_test.c中无法检索到 cmakelists.txt配置文件如下所示&#xff1a; cmake_minimum_required(VERSION 3.30) project(noc C) #设置头文件的目录 include_directories(${CMAKE_SOURCE_DIR}/…...

14 - VDMA彩条显示实验

文章目录 1 实验任务2 系统框图3 硬件设计4 软件设计 1 实验任务 本实验任务是PS端写彩条数据至DDR3内存中&#xff0c;然后通过PL端的VDMA IP核将彩条数据通过HDMI接口输出显示。 2 系统框图 本实验是用HDMI接口固定输出1080P的彩条图&#xff0c;所以&#xff1a; rgb2lc…...

每天学一个 Linux 命令(13):touch

Linux 文件管理命令:touch touch 是 Linux 中一个简单但高频使用的命令,主要用于创建空文件或修改文件的时间戳(访问时间、修改时间)。它是文件管理和脚本操作的实用工具。 1. 命令作用 创建空文件:快速生成一个或多个空白文件。更新时间戳:修改文件的访问时间(Access …...