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

bazel迁移cmake要点及具体迁移工程示例(apollo radar)

文章目录

  • bazel迁移cmake要点及具体迁移工程示例
    • 迁移要点指南
      • 依赖库管理
      • proto编译
      • 目标库及二进制文件生成
      • 项目导出
      • runtime_data
      • 软件打包
    • conti_rardar完整迁移过程
      • common_msg
      • common
      • canbus
      • conti_radar
      • 编译

bazel迁移cmake要点及具体迁移工程示例

迁移要点指南

迁移主要的内容包括以下部分,

依赖库管理

apollo存在的三方依赖,一部分包括网络导入(例gtest、absl等),一部分使用本地环境导入(例boost等)

bazel的依赖管理通过**@repo//:target**

cmake依赖管理则通过fetchcontent/find_package/connan导入。

//bazel
apollo_component(name = "libcomponent.so",srcs = ["component.cc"],hdrs = ["component.h"],deps = ["@com_google_absl//:absl","@eigen","@osqp",],
)
//cmake
include(FetchContent)
FetchContent_Declare(abslGIT_REPOSITORY https://github.com/abseil/abseil-cpp.gitGIT_SHALLOW TRUEGIT_PROGRESS TRUE)FetchContent_Declare(osqpGIT_REPOSITORY https://github.com/osqp/osqp.gitGIT_TAG v0.5.0GIT_SHALLOW TRUEGIT_PROGRESS TRUE)FetchContent_MakeAvailable(absl osqp)
target_link_libraries(examplePRIVATE osqpabsl::baseabsl::synchronizationPUBLIC $<BUILD_INTERFACE:absl::strings>)

proto编译

在bazel中,每一个proto都需要对应一个proto_library,较为繁琐

cmake中3.13版本后提供了proto编译的高层接口。

find_package(Protobuf 3.14.0 REQUIRED)file(GLOB_RECURSE src "*.cc"  "*.proto")add_library(AAA SHARED ${src})protobuf_generate(TARGET AAA 
)
target_link_libraries(AAA PRIVATE protobuf::libprotobuf)
target_include_directories(AAA PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

根据以上语法,PROTO生成的cc文件会自动纳入AAA的待编译文件进行编译,但是默认未将头文件include,因此需要另外target_include_directories(AAA PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

目标库及二进制文件生成

bazel原生有cc_library(库),cc_binary(二进制执行文件),cc_test(测试)

分别对应cmake add_library,add_executable,gtest_discover_tests。

apollo 对原生的cc_library等进行了进一步封装apollo_cc_library,apollo_cc_binary,apollo_componet。

实际使用中,指定编译源码文件,编译选项、依赖库指定等,cmake基本都存在对应可替代命令。

apollo_component(name = "libconti_radar.so",srcs = ["conti_radar_canbus_component.cc"],hdrs = ["conti_radar_canbus_component.h"],copts = ['-DMODULE_NAME=\\"conti_radar\\"'],deps = [":conti_radar_message_manager","//cyber","//modules/common/adapters:adapter_gflags","//modules/common/monitor_log","//modules/drivers/canbus:apollo_drivers_canbus","//modules/drivers/canbus/proto:sensor_canbus_conf_cc_proto","//modules/drivers/radar/conti_radar/protocol:drivers_conti_radar_protocol","//modules/common_msgs/localization_msgs:localization_cc_proto","//modules/common_msgs/localization_msgs:pose_cc_proto","@eigen",],
)
file(GLOB_RECURSE SRCS "*.cc")add_library(conti_radar SHARED ${SRCS})target_link_libraries(conti_radar PRIVATE protobuf::libprotobuf cyber commoncanbus Eigen3::Eigen)target_include_directories(conti_radar PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}${CMAKE_CURRENT_BINARY_DIR})target_compile_definitions(conti_radar PRIVATE MODULE_NAME="conti_radar")

项目导出

部分库需要导出供他人使用的库,需要使用cmake导出cmake包,供使用者调用

生成xxxConfig.cmake供调用者find_package,以及配套的版本控制、依赖、头文件管理。

include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_SOURCE_DIR}/cmake/common-config.cmake.in"${CMAKE_CURRENT_BINARY_DIR}/common-TargetsConfig.cmake"INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/common")write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/common-TargetConfigVersion.cmakeVERSION ${PROJECT_VERSION}COMPATIBILITY AnyNewerVersion)install(FILES"${PROJECT_BINARY_DIR}/cmake/${TARGET_NAME}-config.cmake""${PROJECT_BINARY_DIR}/cmake/${TARGET_NAME}-config-version.cmake"DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${TARGET_NAME}"
)install(TARGETS ${TARGET_NAME}EXPORT ${TARGET_NAME}-targetsARCHIVE DESTINATION libLIBRARY DESTINATION libRUNTIME DESTINATION bin
)install(EXPORT ${TARGET_NAME}-targetsDESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${TARGET_NAME}"
)

runtime_data

主要之一些配置/参数/资源等文档的打包。

bazel不支持相关文件install等操作,apollo另外封装自实现了模块资源的安装。

// apollo 
filegroup(name = "runtime_data",srcs = glob(["conf/*.txt","conf/*.conf","dag/*.dag","launch/*.launch",]),
)//cmake
install(DIRECTORY .DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}FILES_MATCHINGPATTERN "conf/*.txt"PATTERN "conf/*.conf"PATTERN "dag/*.dag"PATTERN "launch/*.launch")

软件打包

cpack或者直接ci/cd做

include(InstallRequiredSystemLibraries)
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY FALSE)
set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
set(CPACK_GENERATOR ZIP)
include(CPack)

cpack是集成在cmake中内建工具,可以获取cmake编译系统中的信息,可以方便的在包名输出平台、版本号、编译时间等等编译时信息

conti_rardar完整迁移过程

目录位于modules/drivers/radar/conti_radar。

根据目录内的BUILD文件

apollo_cc_library(name = "conti_radar_message_manager",srcs = ["conti_radar_message_manager.cc"],hdrs = ["conti_radar_message_manager.h"],deps = ["//modules/common/util:util_tool","//modules/drivers/canbus:apollo_drivers_canbus","//modules/drivers/radar/conti_radar/protocol:drivers_conti_radar_protocol",],
)apollo_component(name = "libconti_radar.so",srcs = ["conti_radar_canbus_component.cc"],hdrs = ["conti_radar_canbus_component.h"],copts = ['-DMODULE_NAME=\\"conti_radar\\"'],deps = [":conti_radar_message_manager","//cyber","//modules/common/adapters:adapter_gflags","//modules/common/monitor_log","//modules/drivers/canbus:apollo_drivers_canbus","//modules/drivers/canbus/proto:sensor_canbus_conf_cc_proto","//modules/drivers/radar/conti_radar/protocol:drivers_conti_radar_protocol","//modules/common_msgs/localization_msgs:localization_cc_proto","//modules/common_msgs/localization_msgs:pose_cc_proto","@eigen",],
)

除了CYBER,另外依赖的canbus、common_msg、common子模块,以及eigen等三方库。

conti_radar_message_manager只对内暴露,不需要定义为一个库。

common_msg

目录:modules/common_msgs

里面存放的都是proto文件,查看网络上的cmake版本cyberrt,将这些proto生成的cc文件编译进libcyber了。

不需要另外编译,不过cmake版本cyberrt编译未导出这些proto文件以及头文件,cyberrt cmake脚本需要做一些调整。

我这里简单处理,直接将modules/common_msgs直接复制进自己的工程内;

common

目录:modules/commom

代码主要是一些工具类模块。每个子目录都对应了一个编译对象。

  • adapters
  • configs/data
  • filters
  • kv_db
  • latency_recorder
  • math
  • monitor_log
  • proto
  • status
  • util
  • vehicle_state

迁移至cmake将以上所有编译对象统一成单一库,并且对外输出头文件、ptoto等。

common目录下的cmakelist如下:

FetchContent_Declare(abslGIT_REPOSITORY https://github.com/abseil/abseil-cpp.gitGIT_SHALLOW TRUEGIT_PROGRESS TRUE)FetchContent_Declare(osqpGIT_REPOSITORY https://github.com/osqp/osqp.gitGIT_TAG v0.5.0GIT_SHALLOW TRUEGIT_PROGRESS TRUE)# FetchContent_Declare( boost GIT_REPOSITORY
# https://github.com/boostorg/boost.git GIT_SHALLOW TRUE GIT_PROGRESS TRUE )FetchContent_MakeAvailable(absl osqp)find_package(Boost REQUIRED)file(GLOB_RECURSE src "*.cc" "*.proto")list(FILTER src EXCLUDE REGEX ".+test\.cc")add_library(common SHARED ${src})protobuf_generate(TARGET common IMPORT_DIRS ${CMAKE_SOURCE_DIR}# APPEND_PATH
)target_include_directories(commonPRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}INTERFACE $<INSTALL_INTERFACE:include>)target_link_libraries(commonPRIVATE cyberprotobuf::libprotobufcan_cardEigen3::EigenosqpBoost::boostSQLite::SQLite3absl::baseabsl::synchronizationPUBLIC $<BUILD_INTERFACE:absl::strings>)include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_SOURCE_DIR}/cmake/common-config.cmake.in"${CMAKE_CURRENT_BINARY_DIR}/common-TargetsConfig.cmake"INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/common")write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/common-TargetConfigVersion.cmakeVERSION ${PROJECT_VERSION}COMPATIBILITY AnyNewerVersion)install(FILES "${CMAKE_CURRENT_BINARY_DIR}/common-TargetsConfig.cmake""${CMAKE_CURRENT_BINARY_DIR}/common-TargetConfigVersion.cmake"DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/common")install(TARGETS commonEXPORT common-TargetsLIBRARY DESTINATION libARCHIVE DESTINATION libRUNTIME DESTINATION bin)install(EXPORT common-TargetsDESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/common")file(RELATIVE_PATH rel_path "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")install(DIRECTORY .DESTINATION include/${rel_path}FILES_MATCHINGPATTERN "*.h"PATTERN "*.proto")list(FILTER src INCLUDE REGEX ".+\.proto")
foreach(proto_file IN LISTS src)get_filename_component(filename_we "${proto_file}" NAME_WE)get_filename_component(dir "${proto_file}" DIRECTORY)file(RELATIVE_PATH subdir "${CMAKE_CURRENT_SOURCE_DIR}" "${dir}")install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${subdir}/${filename_we}.pb.h"DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${rel_path}/${subdir})
endforeach()

canbus

目录: modules/drivers/canbus

bazel脚本

apollo_cc_library(name = "apollo_drivers_canbus",srcs = ["sensor_gflags.cc","can_client/can_client_factory.cc","can_client/fake/fake_can_client.cc","can_client/hermes_can/hermes_can_client.cc","can_client/socket/socket_can_client_raw.cc","common/byte.cc",],hdrs = ["sensor_gflags.h","can_client/can_client.h","can_client/can_client_factory.h","can_client/fake/fake_can_client.h","can_client/hermes_can/bcan.h","can_client/hermes_can/bcan_defs.h","can_client/hermes_can/hermes_can_client.h","can_client/socket/socket_can_client_raw.h","can_comm/can_receiver.h","can_comm/can_sender.h","can_comm/message_manager.h","can_comm/protocol_data.h","common/byte.cc","common/byte.h","common/canbus_consts.h",],deps = ["//cyber","//modules/common/util:common_util","//modules/common/monitor_log","//modules/common_msgs/basic_msgs:error_code_cc_proto","//modules/common_msgs/drivers_msgs:can_card_parameter_cc_proto","//third_party/can_card_library/hermes_can","@com_github_gflags_gflags//:gflags","@com_google_googletest//:gtest",],
)

对应cmakelist:

project(canbus VERSION 1.0.0)# find_package(PkgConfig REQUIRED) pkg_check_modules(Gflags REQUIRED
# IMPORTED_TARGET gflags)find_package(gflags REQUIRED)file(GLOB_RECURSE SRCS "*.proto")add_library(canbus SHAREDsensor_gflags.cccan_client/can_client_factory.cccan_client/fake/fake_can_client.cccan_client/hermes_can/hermes_can_client.cccan_client/socket/socket_can_client_raw.cccommon/byte.cc${SRCS})protobuf_generate(TARGET canbus IMPORT_DIRS ${CMAKE_SOURCE_DIR}# APPEND_PATH
)target_link_libraries(canbusPRIVATE cybercommoncan_cardgflags_sharedabsl::baseabsl::synchronizationabsl::strings)target_include_directories(canbus PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_BINARY_DIR})install(TARGETS canbusLIBRARY DESTINATION libARCHIVE DESTINATION libRUNTIME DESTINATION bin)

conti_radar

目录:modules/drivers/radar/conti_radar

bazel

filegroup(name = "runtime_data",srcs = glob(["conf/*.txt","conf/*.conf","dag/*.dag","launch/*.launch",]),
)apollo_cc_library(name = "conti_radar_message_manager",srcs = ["conti_radar_message_manager.cc"],hdrs = ["conti_radar_message_manager.h"],deps = ["//modules/common/util:util_tool","//modules/drivers/canbus:apollo_drivers_canbus","//modules/drivers/radar/conti_radar/protocol:drivers_conti_radar_protocol",],
)apollo_component(name = "libconti_radar.so",srcs = ["conti_radar_canbus_component.cc"],hdrs = ["conti_radar_canbus_component.h"],copts = ['-DMODULE_NAME=\\"conti_radar\\"'],deps = [":conti_radar_message_manager","//cyber","//modules/common/adapters:adapter_gflags","//modules/common/monitor_log","//modules/drivers/canbus:apollo_drivers_canbus","//modules/drivers/canbus/proto:sensor_canbus_conf_cc_proto","//modules/drivers/radar/conti_radar/protocol:drivers_conti_radar_protocol","//modules/common_msgs/localization_msgs:localization_cc_proto","//modules/common_msgs/localization_msgs:pose_cc_proto","@eigen",],
)

cmake

project(conti_radar VERSION 1.0.0)file(GLOB_RECURSE SRCS "*.cc" "*.proto")add_library(conti_radar SHARED ${SRCS})
protobuf_generate(TARGET conti_radar# PROTOC_OUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}IMPORT_DIRS ${CMAKE_SOURCE_DIR})target_link_libraries(conti_radar PRIVATE protobuf::libprotobuf cyber commoncanbus Eigen3::Eigen)target_include_directories(conti_radar PRIVATE ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR}${CMAKE_CURRENT_BINARY_DIR})target_compile_definitions(conti_radar PRIVATE MODULE_NAME="conti_radar")install(TARGETS conti_radarLIBRARY DESTINATION libARCHIVE DESTINATION libRUNTIME DESTINATION bin)install(DIRECTORY .DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}FILES_MATCHINGPATTERN "conf/*.txt"PATTERN "conf/*.conf"PATTERN "dag/*.dag"PATTERN "launch/*.launch")

编译

cd project

cmake -B build

cmake --build build --target install

打包

cd build

cpack

相关文章:

bazel迁移cmake要点及具体迁移工程示例(apollo radar)

文章目录 bazel迁移cmake要点及具体迁移工程示例迁移要点指南依赖库管理proto编译目标库及二进制文件生成项目导出runtime_data软件打包 conti_rardar完整迁移过程common_msgcommoncanbusconti_radar编译 bazel迁移cmake要点及具体迁移工程示例 迁移要点指南 迁移主要的内容包…...

跨时钟域(CDC,clock domain crossing)信号处理

参考视频&#xff1a; 数字IC&#xff0c;FPGA秋招【单bit信号的CDC跨时钟域处理手撕代码合集】_哔哩哔哩_bilibili 一、亚稳态 原因是&#xff1a;建立时间和保持时间没有保持住。然后在下图的红框里面&#xff0c;产生亚稳态。因为电路反馈机制&#xff0c;最后大概率会恢复…...

Java高频面试之并发编程-16

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;volatile 实现原理是什么&#xff1f; volatile 关键字的实现原理 volatile 是 Java 中用于解决多线程环境下变量可见性…...

MyBatis 一对多关联映射在Spring Boot中的XML配置

在Spring Boot中使用MyBatis实现一对多关系时&#xff0c;可以通过XML映射文件来配置。下面我将详细介绍几种实现方式。 基本概念 一对多关系指的是一个实体对象包含多个子对象集合的情况&#xff0c;例如&#xff1a; 一个部门有多个员工一个订单有多个订单项一个博客有多个…...

Spring Boot异步任务失效的8大原因及解决方案

Spring Boot异步任务失效的8大原因及解决方案 摘要:在使用Spring Boot的@Async实现异步任务时,你是否遇到过异步不生效的问题?本文总结了8种常见的异步失效场景,并提供对应的解决方案,帮助你彻底解决异步任务失效的难题。 一、异步失效的常见场景 1. 未启用异步支持 ❌ …...

嵌入式Linux I2C驱动开发详解

文章目录 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 2. I2C的地址寻址机制 二、Linux I2C驱动框架的分层设计 1. I2C核心 2. I2C适配器 3. I2C设备驱动 三、I2C驱动开发测试 一、I2C协议的核心原理 1. I2C协议的“双线制”通信 SDA&#xff08;数据线&#xff09; 和…...

基于 Spring Boot 瑞吉外卖系统开发(十二)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十二&#xff09; 菜品删除 单击“批量删除”和“删除”时&#xff0c;会携带需要删除的菜品的id以delete请求方式向“/dish”发送请求。 URLhttp://127.0.0.1:8080/dish调用方法DELETE参数ids DishController添加删除方法 …...

基于 51 单片机的 PWM 电机调速系统实现

51 单片机通过定时器来实现 PWM(脉冲宽度调制)控制,这是一种通过调整方波信号的占空比来控制输出功率的技术。下面详细介绍如何使用 51 单片机实现 PWM 控制并应用于电机调速。 1. PWM 控制原理 PWM 信号是一个周期性的方波,通过调整高电平时间(Ton)与周期(T)的比例(…...

wordpress主题分享

发布于&#xff1a;Eucalyptus-Blog 一、引言 大家对WordPress免费主题都非常感兴趣&#xff0c;但是一般收费的WordPress主题功能才多&#xff0c;其实有很多开源的免费WordPress主题都很不错&#xff0c;对于很多新建站的小伙伴&#xff0c;这些主题完全足够用了。这里就分享…...

【合新通信】无人机天线拉远RFOF(射频光纤传输)解决方案

无人机天线拉远RFOF方案通过光纤替代传统射频电缆&#xff0c;实现无人机与地面控制站之间的高保真、低损耗信号传输&#xff0c;尤其适用于高频段&#xff08;如毫米波&#xff09;、远距离或复杂电磁环境下的无人机作业场景。 核心应用场景 军事侦察与电子战 隐蔽部署&…...

视觉-语言-动作模型:概念、进展、应用与挑战(下)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…...

git如何将本地 dev 分支与远程 dev 分支同步

要让本地 dev 分支与远程 dev 分支完全同步&#xff08;丢弃本地多余的提交记录&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 1. ​​获取远程最新状态​ git fetch origin dev # 拉取远程 dev 分支的最新提交&#xff0c;但不会修改本地代码 IDEA中点击fetc…...

自动化测试与功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无…...

python3数据类型

常见python3数据类型 Number&#xff08;数字&#xff09;String&#xff08;字符串&#xff09;bool&#xff08;布尔类型&#xff09;List&#xff08;列表&#xff09;Tuple&#xff08;元组&#xff09;Set&#xff08;集合&#xff09;Dictionary&#xff08;字典&#x…...

《Python星球日记》 第66天:序列建模与语言模型

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、传统语言模型1. n-gram 模型基础2. n-gram 模型的局限性 二、RNN 在语言建模…...

CRM和SCRM有什么区别

CRM&#xff08;客户关系管理&#xff09;与SCRM&#xff08;社会化客户关系管理&#xff09;的主要区别在于沟通方式、客户互动、数据来源和客户参与度。CRM更侧重企业对客户信息的管理与内部流程优化&#xff0c;而SCRM强调客户主动参与&#xff0c;通过社交媒体等平台加强互…...

破解 Qt QProcess 在 Release 模式下的“卡死”之谜

在使用 Qt 的 QProcess 以调用外部 ffmpeg/ffprobe 进行音视频处理时&#xff0c;常见的工作流程是&#xff1a; gatherParams&#xff1a;通过 ffprobe 同步获取媒体文件的参数&#xff08;分辨率、采样率、声道数、码率等&#xff09;。 reencode&#xff1a;逐个文件调用 f…...

重学安卓14/15自由窗口freeform企业实战bug-学员作业

背景&#xff1a; 在aosp14版本及以后版本上&#xff0c;安卓的自由窗口部分的工具栏部分都有了较大的更新 工具栏这部分已经移到了SystemUI进程的WMShell进行统一的管理。 但是近来有学员朋友在对自由窗口进行相关的拖拽操作时候&#xff0c;有遇到这个工具栏相关的一个bug&…...

【layout组件 与 路由镶嵌】vue3 后台管理系统

前言 很多同学在第一次搭建后台管理系统时&#xff0c;会遇到一个问题&#xff0c;layout组件该放哪里&#xff1f;如何使用&#xff1f;路由又该如何设计&#xff1f; 这边会讲一下我的思考过程和最后的结果&#xff0c;大家可以参考一下&#xff0c;希望大家看完能有所收获。…...

【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、1路光纤数据收发处理平台

板卡概述 PXIE301-211是一款基于PXIE总线架构的16路并行LVDS数据采集、1路光纤收发处理平台&#xff0c;该板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器&#xff0c;实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡具有1个FMC&#xf…...

linux-进程信号的产生

Linux中的进程信号&#xff08;signal&#xff09;是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断&#xff0c;用于通知进程某个事件的发生&#xff0c;如错误、终止请求、计时器到期等。 1. 信号的基本概念 - 信号&#xff08;Signal&#xff09;&am…...

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考

在 Nexus 配置代理仓库的方法&#xff0c;可参考 pypi 的配置博客&#xff1a;https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式&#xff0c;参考官方文档&#xff0c;如 pypi&#xff1a;https://help.sonatype.com/en/pypi-repositories.html 配置 yum…...

精品可编辑PPT | 全面风险管理信息系统项目建设风控一体化标准方案

这份文档是一份全面风险管理信息系统项目建设风控一体化标准方案&#xff0c;涵盖了业务架构、功能方案、系统技术架构设计、项目实施及服务等多个方面的详细内容。方案旨在通过信息化手段提升企业全面风险管理工作水平&#xff0c;促进风险管理落地和内部控制规范化&#xff0…...

Redis集群安装

Redis集群安装 1.集群介绍 首先要了解&#xff0c;Redis的高可用机制。 2个master节点&#xff0c;挂掉1个&#xff0c;1不过半&#xff0c;则集群宕机&#xff0c;不可用&#xff0c;容错率为0&#xff1b;3个master节点&#xff0c;挂掉1个&#xff0c;2>1&#xff0c;…...

下载知网外文文献全文的方法

知网和一些外文数据库机构是合作关系&#xff0c;因知网没有订购外文文献全文&#xff0c;所以可以搜到外文文献但不能下载全文&#xff0c;基本提供的都是外文文献摘要。本文就实例演示一下获取知网外文文献全文的方法步骤。 例如下面这篇知网外文文献&#xff0c;该文献被收…...

解决IDEA无法运行git的问题

之前git一直没有问题&#xff0c;今天打开就提示我安装git&#xff0c;自然用git去提交新项目也会遇到问题。 我出现问题的原因是&#xff1a;git路径缺失 文件->设置->git 发现git的路径为空&#xff0c;按照实际位置填写即可...

基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档

项目地址&#xff1a;总项目Charliechen114514/CCIMXDesktop: This is a Qt Written Desktop with base GUI Utilities 本子项目地址&#xff1a;CCIMXDesktop/extern_app/pdfReader at main Charliechen114514/CCIMXDesktop 前言 这个部分说的是Mupdf_adaper下的文档的工…...

Ubuntu20.04 搭建Kubernetes 1.28版本集群

环境依赖 以下操作,无特殊说明,所有节点都需要执行 安装 ssh 服务安装 openssh-server复制代码 sudo apt-get install openssh-server修改配置文件复制代码 vim /etc/ssh/sshd_config找到配置项 复制代码 LoginGraceTime 120 PermitRootLogin prohibit-password StrictModes…...

操作系统和数据库账号密码的安全管理、使用,安当SMS凭据管理系统

引言&#xff1a;密码管理困局下的破局之道 在数字化转型的深水区&#xff0c;企业正面临前所未有的密码管理挑战。某跨国制造企业因数据库密码泄露导致核心工艺参数外泄&#xff0c;某三甲医院因运维账号滥用引发百万级医疗数据泄露事件&#xff0c;这些真实案例揭示着传统密…...

Java设计模式之代理模式:从入门到精通(保姆级教程)

1. 代理模式概述 代理模式(Proxy Pattern)是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用,可以在不改变目标对象代码的情况下增加额外的功能。 1.1 专业概念解释 代理模式:为其他对象提供一种代理…...

单片机-STM32部分:13-1、蜂鸣器

飞书文档https://x509p6c8to.feishu.cn/wiki/V8rpwIlYIiEuXLkUljTcXWiKnSc 一、应用场景 大部分的电子产品、家电&#xff08;风扇、空调、电水壶&#xff09;都会有蜂鸣器&#xff0c;用于提示设备的工作状态 二、原理 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0…...

JVM——方法内联

引入 在现代软件开发中&#xff0c;性能优化始终是一个关键课题。随着硬件架构的不断演进&#xff0c;CPU的主频提升逐渐放缓&#xff0c;而软件复杂度却持续增加&#xff0c;这使得编译器优化技术的重要性日益凸显。方法内联&#xff08;Method Inlining&#xff09;作为编译…...

C++类成员

一、内联函数&#xff08;Inline Functions&#xff09; 作用 解决频繁调用小函数时的栈内存消耗问题&#xff0c;通过将函数代码直接插入调用点&#xff0c;避免压栈/出栈开销。 定义形式 inline 返回类型 函数名(参数列表) { ... }• 隐式声明&#xff1a;类内直接定义的成员…...

SpringBoot校园失物招领信息平台

SpringBoot校园失物招领信息平台 文章目录 SpringBoot校园失物招领信息平台1、技术栈2、项目说明2.1、登录注册2.2、管理员端截图2.3、用户端截图 3、核心代码实现3.1、前端首页3.2、前端招领广场3.3、后端业务处理 1、技术栈 本项目采用前后端分离的架构&#xff0c;前端和后…...

代码随想录算法训练营第三十八天

LeetCode题目: 1143. 最长公共子序列1035. 不相交的线53. 最大子数组和392. 判断子序列2094. 找出 3 位偶数(每日一题) 其他: 今日总结 往期打卡 1143. 最长公共子序列 跳转: 1143. 最长公共子序列 学习: 代码随想录公开讲解 问题: 给定两个字符串 text1 和 text2&#xff0…...

Nginx stream模块是连接级别的负载均衡

在Nginx的stream模块中&#xff0c;upstream的权重配置实现的是连接级别的负载均衡&#xff0c;这和http模块不同。 当客户端发起一个新的TCP连接时&#xff0c;Nginx根据各upstream的权重值选择其中一个upstream建立连接&#xff0c;之后该连接上的所有数据传输都由这个upstre…...

贝叶斯算法

贝叶斯算法是一类基于贝叶斯定理的机器学习算法&#xff0c;它们在分类任务中表现出色&#xff0c;尤其在处理具有不确定性和 probabilistic 关系的数据时具有独特优势。本文将深入探讨贝叶斯算法的核心原理、主要类型以及实际应用案例&#xff0c;带你领略贝叶斯算法在概率推理…...

计算机网络:CPU与时钟的关系

在计算机中,CPU(中央处理器)与时钟的关系是核心且密不可分的。时钟信号是驱动CPU运行的“心跳”,决定了计算机执行指令的节奏和协调性。以下是两者的关键关系及作用: 1. 时钟信号:CPU的“节拍器” 时钟频率(Clock Speed) CPU的时钟频率(如3.5 GHz)表示每秒的时钟周期…...

java中强引用、软应用、弱应用、虚引用

在Java中&#xff0c;引用类型决定了对象的生命周期和垃圾回收的时机。Java提供了四种不同的引用类型&#xff1a;强引用、软引用、弱引用和虚引用。每种引用类型的行为和用途不同&#xff0c;了解这些差异对优化内存管理和垃圾回收非常重要。 1. 强引用&#xff08;Strong Re…...

分析红黑树工程实用的特点

&#x1f9ed; 本节目标 理解红黑树在工程中的优劣势对比红黑树与其他数据结构&#xff08;AVL 树、跳表、哈希表等&#xff09;分析红黑树为何成为内核级应用&#xff08;如 Linux CFS、内存管理&#xff09;首选总结红黑树工程上的典型使用建议 一、红黑树工程级使用的主要特…...

C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )

一、引言&#xff1a;理解内存管理的核心价值 在系统级编程领域&#xff0c;内存管理是决定程序性能、稳定性和安全性的关键因素。C/C 作为底层开发的主流语言&#xff0c;赋予开发者直接操作内存的能力&#xff0c;却也要求开发者深入理解内存布局与生命周期管理。本文将从内…...

如何使用主机名在 CMD 中查找 IP 地址?

在网络中,每个系统都有一个由几位数字组成的唯一标识,称为 IP 地址。然而,记住它们可能是一项艰巨的任务,尤其是当系统数量众多时。例如,互联网上运行的每个网站都有一个 IP 地址,以便其他系统在需要时可以调用它们,但你认为记住我们访问的每个网站的长串数字是可行的吗…...

解读RTOS:第二篇 · 线程/任务管理与调度策略

1. 引言 在 RTOS 中,线程(Task)是最基本的执行单元,它封装了应用功能、资源使用和优先级属性。任务管理与调度策略决定了系统在多任务场景下的响应速度、资源分配效率与实时性保证。理解并掌握任务创建、状态转换、优先级设计和调度算法,是 RTOS 应用开发的核心内容。 2…...

linux下minio的进程管理脚本

准备工作&#xff1a; 参考链接&#xff1a; Deploy MinIO: Single-Node Single-Drive — MinIO Object Storage for Linux 下载&#xff1a; wget https://dl.min.io/server/minio/release/linux-amd64/minio kill-app.sh #!/bin/bash # 文件名&#xff1a; kill-app.sh…...

论文学习_A Survey of Binary Code Similarity

摘要&#xff1a;二进制代码相似性方法的主要目的是比较两个或多个二进制代码片段&#xff0c;以识别它们之间的相似性与差异&#xff08;研究背景&#xff09;。由于在许多实际场景中源代码往往不可获取&#xff0c;因此具备比较二进制代码的能力显得尤为重要&#xff0c;例如…...

python标准库--sys - 系统相关功能在算法比赛的应用

目录 1. 快速输入输出 2. 调整递归深度限制 1. 快速输入输出 算法比赛中&#xff0c;大量数据的读写可能成为瓶颈。sys.stdin和sys.stdout比内置的input()和print()效率更高。 import sys# 读取多行输入&#xff08;每行一个整数&#xff09; n int(sys.stdin.readline()) …...

运算放大器相关的电路

1运算放大器介绍 解释&#xff1a;运算放大器本质就是一个放大倍数很大的元件&#xff0c;就如上图公式所示 Vp和Vn相差很小但是放大后输出还是会很大。 运算放大器不止上面的三个引脚&#xff0c;他需要独立供电&#xff1b; 如图比较器&#xff1a; 解释&#xff1a;Vp&…...

进程和线程

目录 1. 基本定义 2. 核心区别 3. 优缺点对比 进程和线程是操作系统中用于实现并发执行的两个核心概念&#xff0c;它们既有相似之处&#xff0c;又有明显的区别。下面从多个维度对它们进行对比分析&#xff1a; 1. 基本定义 进程&#xff08;Process&#xff09; 进程是程…...

生成对抗网络(GAN)深度解析:理论、技术与应用全景

生成对抗网络&#xff08;Generative Adversarial Networks,GAN&#xff09;作为深度学习领域的重要突破&#xff0c;通过对抗训练框架实现了强大的生成能力。本文从理论起源、数学建模、网络架构、工程实现到行业应用&#xff0c;系统拆解GAN的核心机制&#xff0c;涵盖基础理…...

Java面试全记录:Spring Cloud+Kafka+Redis实战解析

Java面试全记录&#xff1a;Spring CloudKafkaRedis实战解析 人物设定 姓名&#xff1a;张伟&#xff08;随机生成唯一姓名&#xff09; 年龄&#xff1a;28岁 学历&#xff1a;硕士 工作年限&#xff1a;5年 工作内容&#xff1a; 基于Spring Cloud搭建微服务架构使用Kafka…...