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

VSCode编辑+GCC for ARM交叉编译工具链+CMake构建+OpenOCD调试(基于STM32的标准库/HAL库)

一、CMake安装

  • 进入CMake官网的下载地址Get the Software,根据系统安装对应的Binary distributions。
    在这里插入图片描述
  • 或者在CMake——国内镜像获取二进制镜像安装包。 在这里插入图片描述
  • 或者访问GitHub的xPack项目xPack CMake v3.28.6-1,下载即可。

记得添加用户/系统的环境变量,打开cmd窗口,输入cmake -version,查看CMake是否安装成功,如下图所示。
在这里插入图片描述

二、VSCode各个配置脚本文件

本文以【STM32F103ZET6】单片机作为示例来进行演示,标准库/HAL库的工程是通用的,修改CMakeLists.txt里面的源文件和头文件引用部分即可。
更多细节请参考【VSCode编辑+GCC for ARM交叉编译工具链+Makefile构建+OpenOCD调试(基于STM32的标准库)】
下面列出几个主要的配置文件:

  • settings.json

  • c_cpp_properties.json

  • tasks.json

  • launch.json

  • CMakeLists.txt

  • MCU链接脚本.ld、MCU汇编启动文件.s、MCU寄存器文件.svd请参考【VSCode编辑+GCC for ARM交叉编译工具链+Makefile构建+OpenOCD调试(基于STM32的标准库)】文章获取。

settings.json:

{// 字符集编码选择"files.encoding": "utf8",// 自动保存任意文件"files.autoSave": "afterDelay",// 开启 material icons"workbench.iconTheme": "office-material-icon-theme",// theme主题设置"workbench.colorTheme": "Default Dark Modern",//粘贴时格式化代码"editor.formatOnPaste": true,//保存时格式化代码"editor.formatOnSave": true,//设置字体的大小,最小值能设置为6"editor.fontSize": 15,//设置字体的粗细"editor.fontWeight": "500",//设置字体的样式// "terminal.integrated.fontFamily":"Courier New",//使用Ctrl+滚轮缩放编辑区的字体大小"editor.mouseWheelZoom": true,//使用Ctrl+滚轮缩放终端Terminal的字体大小"terminal.integrated.mouseWheelZoom": true,//设置为false,这样打开新的文件时,不会自动关闭旧的文件"workbench.editor.enablePreview": false,"security.workspace.trust.enabled": false,"VsCodeTaskButtons.showCounter": true,"VsCodeTaskButtons.tasks": [{"label": "$(tools) Build", // 显示标签"task": "CMake build", // 对应tasks.json里的任务label"tooltip": "🛠️ build" // 工具提示框},{"label": "$(notebook-delete-cell) Clean","task": "CMake clean","tooltip": "🧹 clean"},{"label": "$(notebook-delete-cell) $(tools) Re-bulid", //"$(notebook-delete-cell) & $(tools)","task": "CMake cleanRebuild","tooltip": "🛠️ rebuild" // "🧹 & 🛠️ rebuild"},{"label": "$(zap) Download",// "task": "CMake download","tasks": [{"label": "⚓ CMSIS-DAP-Link", //icon copied from https://emojipedia.org/"task": "flash with CMSIS-DAP-Link"},{"label": "⤵️ ST-Link", //icon copied from https://emojipedia.org/"task": "flash with ST-Link"},{"label": "🚀 J-Link", //icon copied from https://emojipedia.org/"task": "flash with J-Link"}],"tooltip": "⚡ download"}],// "terminal.integrated.defaultProfile.windows": "Git Bash","C_Cpp.default.cppStandard": "gnu++17","C_Cpp.default.intelliSenseMode": "gcc-arm","C_Cpp.default.cStandard": "gnu17","C_Cpp.default.compilerPath": "E:/embedded_dev_tools/xpack-arm-none-eabi-gcc-13.3.1-1.1/bin/arm-none-eabi-gcc.exe"
}

c_cpp_properties.json:

{"configurations": [{"name": "ARM-GCC","includePath": ["${workspaceFolder}/**"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"compilerPath": "E:/embedded_dev_tools/xpack-arm-none-eabi-gcc-13.3.1-1.1/bin/arm-none-eabi-gcc.exe","cStandard": "gnu17","cppStandard": "gnu++17","intelliSenseMode": "gcc-arm","configurationProvider": "ms-vscode.cmake-tools"}],"version": 4
}

tasks.json:

{//快捷键ctrl+shift+B调出各个task命令"tasks": [{"type": "cmake","label": "CMake build","command": "build","targets": ["${workspaceRootFolderName}.elf"],"group": "build","problemMatcher": ["$gcc"]},{"type": "cmake","label": "CMake cleanRebuild","command": "cleanRebuild","targets": ["${workspaceRootFolderName}.elf"],"group": "build","problemMatcher": ["$gcc"]},{"type": "cmake","label": "CMake clean","command": "clean","problemMatcher": ["$gcc"]},{"type": "shell","label": "flash with CMSIS-DAP-Link","command": "openocd","args": ["-f","interface/cmsis-dap.cfg","-f","target/stm32f1x.cfg","-c","program build/${workspaceRootFolderName}.elf verify reset exit"],"problemMatcher": ["$gcc"],"group": "build"},{"type": "shell","label": "flash with ST-Link","command": "openocd","args": ["-f","interface/stlink.cfg","-f","target/stm32f1x.cfg","-c","program build/${workspaceRootFolderName}.elf verify reset exit"],"problemMatcher": ["$gcc"],"group": "build"},{"type": "shell","label": "flash with J-Link","command": "openocd","args": ["-f","interface/jlink-swd.cfg","-f","target/stm32f1x.cfg","-c","program build/${workspaceRootFolderName}.elf verify reset exit"],"problemMatcher": ["$gcc"],"group": "build"}],"version": "2.0.0"
}

launch.json:

{// 使用 IntelliSense 了解相关属性。// 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "Debug with CMSIS-DAP-Link","cwd": "${workspaceRoot}","executable": "./build/${workspaceRootFolderName}.elf","request": "launch","type": "cortex-debug","servertype": "openocd","device": "STM32F103VET6",// "openOCDLaunchCommands": [//     "adapter speed 10000"// ],"configFiles": ["interface/cmsis-dap.cfg", // D:/Software/arm_riscv_develop_tools/openocd/openocd/scripts/interface"target/stm32f1x.cfg" // D:/Software/arm_riscv_develop_tools/openocd/openocd/scripts/target],"svdFile": "./STM32F103.svd", //选择寄存器文件"liveWatch": {"enabled": true,"samplesPerSecond": 4},"searchDir": [],"runToEntryPoint": "main","showDevDebugOutput": "none","preLaunchTask": "flash with CMSIS-DAP-Link"},{"name": "Debug with ST-Link","cwd": "${workspaceRoot}","executable": "./build/${workspaceRootFolderName}.elf","request": "launch","type": "cortex-debug","servertype": "openocd","device": "STM32F103VET6",// "openOCDLaunchCommands": [//     "adapter speed 10000"// ],"configFiles": ["interface/stlink.cfg", // D:/Software/arm_riscv_develop_tools/openocd/openocd/scripts/interface"target/stm32f1x.cfg" // D:/Software/arm_riscv_develop_tools/openocd/openocd/scripts/target],"svdFile": "./STM32F103.svd", //选择寄存器文件"liveWatch": {"enabled": true,"samplesPerSecond": 4},"searchDir": [],"runToEntryPoint": "main","showDevDebugOutput": "none","preLaunchTask": "flash with ST-Link"},{"name": "Debug with J-Link","cwd": "${workspaceRoot}","executable": "./build/${workspaceRootFolderName}.elf","request": "launch","type": "cortex-debug","servertype": "openocd","device": "STM32F103VET6",// "openOCDLaunchCommands": [//     "adapter speed 10000"// ],"configFiles": ["interface/jlink-swd.cfg", // D:/Software/arm_riscv_develop_tools/openocd/openocd/scripts/interface"target/stm32f1x.cfg" // D:/Software/arm_riscv_develop_tools/openocd/openocd/scripts/target],"svdFile": "./STM32F103.svd", //选择寄存器文件"liveWatch": {"enabled": true,"samplesPerSecond": 4},"searchDir": [],"runToEntryPoint": "main","showDevDebugOutput": "none","preLaunchTask": "flash with J-Link"}]
}

三、CMakeLists.txt——构建文件

CMakeLists.txt:

#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE!
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
# cmake最低版本需求
cmake_minimum_required(VERSION 3.20)# specify cross compilers and tools
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)
# 链接的类型设置为STATIC, 以便嵌入式ARM-GNU通过CMake的"编译器检查"
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)# project settings
# .HEX  .bin  .elf的文件名设置
project(Led_Toggle  C CXX ASM)
# C/C++语言标准版本配置
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 17)#Uncomment for hardware floating point
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)#Uncomment for software floating point
#add_compile_options(-mfloat-abi=soft)#编译选项定义
# -mcpu=cortex-m3 告诉编译器为 ARM Cortex-M3 处理器生成代码
# -mthumb 启用 Thumb 指令集,Thumb 指令集是一种 16 位指令集
# -march=armv7-m 指定目标架构,ARMv7-M 是 Cortex-M3 处理器使用的架构
set(MCU_FLAGS -mcpu=cortex-m3 -mthumb -mthumb-interwork)    #   编译选项定义修改处
#使用-Wall可开启所有警告;通过-Werror将所有警告视为error
#-ffunction-sections -fdata-sections将函数和数据放在单独的节中,这在链接阶段非常有用,因为链接器可以删除未使用的函数,从而减小最终可执行文件的大小
#开启-fmessage-length=0会让编译器展示所有的消息而不会限制错误和警告输出的长度
set(OPTIMIZE_COMPILE_FLAGS -ffunction-sections -fdata-sections -fno-common -fmessage-length=0)
# set(MCU_FLAGS "-mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16")
add_compile_options(${MCU_FLAGS})
add_compile_options(${OPTIMIZE_COMPILE_FLAGS})
# add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)# uncomment to mitigate c++17 absolute addresses warnings
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")
# /*
# 编译等级选项:优化等级
# -O0:无任何优化,关闭所有优化选项
# -O、-O1:1级优化,
# -O2: 2级优化,
# -Os: 2.5级优化,-Os启用所有通常不会增加代码大小的-O2优化。 它还执行旨在减少代码大小的进一步优化。
# -O3: 最高级优化。
# -Og:优化调试体验。 -Og启用不会干扰调试的优化。 它是标准编辑 - 编译 - 调试周期可以选择的优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验。
# -Ofast:无视严格的标准合规性。 -Ofast启用所有-O3优化。 它还打开并非对所有符合标准的程序有效的优化。
# */# Release 进行优化,提高速度 -排除调试信息
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")message(VERBOSE "Maximum optimization for speed")add_compile_options(-Ofast)
# RelWithDebInfo 进行优化,提高速度 -包含调试信息
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")message(VERBOSE "Maximum optimization for speed, debug info included")add_compile_options(-Ofast -g)
# MinSizeRel 优化二进制大小 -排除调试信息
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")message(VERBOSE "Maximum optimization for size")add_compile_options(-Os)
# Debug 禁用优化 -包含调试信息
else ()message(VERBOSE "Minimal optimization, debug info included")add_compile_options(-O0 -g)
endif ()#添加C文件编译宏定义
add_definitions(-DUSE_HAL_DRIVER-D__MICROLIB -DSTM32F103xE -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD)
# add_definitions(-DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD)#添加头文件路径,即.h文件
include_directories(./STM32F10x_FWLib/inc./SYSTEM/delay ./SYSTEM/sys ./SYSTEM/usart ./HARDWARE/inc ./USER/inc ./CORE/inc./CMSIS/inc)#添加汇编启动文件路径,startup文件是STM32CubeMX生成的(需要gcc版本,不要使用MDK版本)
ENABLE_LANGUAGE(ASM) #为了让cmake识别启动文件
set(SRC_STARTUP "${CMAKE_SOURCE_DIR}/startup_s/startup_stm32f103xe.s")#添加源文件路径,即.c文件
#file语法,前一个参数是固定的GLOB_RECURSE, 后面一个参数自行定义
file(GLOB_RECURSE SOURCES ./STM32F10x_FWLib/src/*.c ./USER/src/*.c ./CMSIS/src/*.c./CORE/src/*.c ./SYSTEM/delay/*.c ./SYSTEM/sys/*.c ./SYSTEM/usart/*.c ./HARDWARE/src/*.c)#-specs=nosys.specs -specs=nano.specs选择链接精简C库newlib-nano,而非标准C库glibc/glibc++
#-u _printf_float显式启用浮点数打印 -u _scanf_float显式启用出现报错,寻找解决方法中……
set(OPTIMIZE_LD_FLAGS -Wl,--no-warn-rwx-segments -flto -specs=nano.specs -specs=nosys.specs -u _printf_float) # -u _scanf_float#添加.ld链接脚本路径
set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/link_script/STM32F103VETx_FLASH.ld")#-cref则生成交叉引用表方便查找未定义的符号引用(比如编译时出现的undefined reference)
#--print-memory-usage选项提供链接器文件中定义的每个内存区域使用的内存的详细信息
#输出.map文件
set(MAP_FLAGS -Wl,--cref,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)#链接选项配置
add_link_options(${MCU_FLAGS})
# add_link_options(-Wl,--no-warn-rwx-segments,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
# add_link_options(-specs=nano.specs -specs=nosys.specs -u _printf_float)   # -u _scanf_float
add_link_options(${OPTIMIZE_LD_FLAGS})
add_link_options(-T ${LINKER_SCRIPT})  
add_link_options(${MAP_FLAGS})#根据源文件、汇编启动文件、链接脚本 生成 .elf可执行文件
add_executable(${PROJECT_NAME}.elf ${SRC_STARTUP} ${SOURCES} ${LINKER_SCRIPT})set(ELF_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.elf)
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)add_custom_command(TARGET "${PROJECT_NAME}.elf" POST_BUILDCOMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")

📚NOTE:
①CMake配置嵌入式本地的工具链,
在这里插入图片描述

②如果读者将上述的CMakeLists.txt文件移植到自己的标准库 / HAL库工程后,需要重新生成CMake和当前项目相关的配置,否则会报错。参考方法的截图如下,
在这里插入图片描述

相关文章:

VSCode编辑+GCC for ARM交叉编译工具链+CMake构建+OpenOCD调试(基于STM32的标准库/HAL库)

一、CMake安装 进入CMake官网的下载地址Get the Software&#xff0c;根据系统安装对应的Binary distributions。 或者在CMake——国内镜像获取二进制镜像安装包。 或者访问GitHub的xPack项目xPack CMake v3.28.6-1&#xff0c;下载即可。 记得添加用户/系统的环境变量&#…...

概率论得学习和整理26:EXCEL 关于plot 折线图--频度折线图的一些细节

目录 0 折线图有很多 1 频度折线图 1.1 直接用原始数据做的频度折线图 2 将原始数据生成数据透视表 3 这样可以做出了&#xff0c;频度plot 4 做按某字段汇总&#xff0c;成为累计plot分布 5 修改上面显示效果&#xff0c;做成百分比累计plot频度分布 0 折线图有很多 这…...

数据结构之栈和队列算法题

一&#xff1a;有效括号数 学了栈之后这一题就比较简单了。 思路&#xff1a;1、左括号进栈 2、右括号出栈匹配。 完整代码&#xff1a; 因为使用C语言写的&#xff0c;所以里面包含了栈的实现 #include<stdio.h> #include<stdlib.h> #include<assert.h>…...

离散数学---随机漫步

本文根据 MIT 计算机科学离散数学课程整理&#xff08;Lecture 25&#xff09;。 赌徒破产问题&#xff08;Gamblers Ruin&#xff09; 问题描述 初始为 n 元&#xff0c;对于每一次独立的赌注&#xff0c;都有 p 的概率赢得 1 元&#xff0c;(1-p) 的概率输掉 1 元。当输完…...

HCIA-Access V2.5_2_2网络通信基础_TCP/IP协议栈报文封装

TCP/IP协议栈的封装过程 用户从应用层发出数据先会交给传输层&#xff0c;传输层会添加TCP或者UDP头部&#xff0c;然后交给网络层&#xff0c;网络层会添加IP头部&#xff0c;然后交给数据链路层&#xff0c;数据链路层会添加以太网头部和以太网尾部&#xff0c;最后变成01这样…...

java开发入门学习一 -基本概念入门

目录 Java的开发环境搭建 开发环境简单认识 开发环境下载与安装 初始JAVA之helloWorld java基本运行原理 helloWord实例 JAVA文档注释和API 文档 注释 API文档地址 Java的优缺点 优点 缺点 JVM的简单介绍 功能 1. 实现JAVA程序的跨平台性 2. 自动内存管理(管理…...

Coturn 实战指南:WebRTC 中的 NAT 穿透利器

1. 什么是 Coturn&#xff1f; Coturn 是一种开源的 TURN(Traversal Using Relays around NAT)服务器&#xff0c;用于解决 NAT 穿透问题。它帮助客户端在受限网络环境(例如防火墙或 NAT 后面)中实现双向通信&#xff0c;常用于 WebRTC 应用、VoIP、在线游戏等场景。 2. Cotur…...

【每日一练 基础题】[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和 暴力破解会超时,用因式分解的平方差公式 a2 2abb2(a)2 a-2abb2(a-b)2 输出整数((a1a2a3…an)-a1-a2-a3-…-an)/2 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);l…...

华为ensp--BGP路径选择-Preferred Value

学习新思想&#xff0c;争做新青年。今天学习的是BGP路径选择-Preferred Value 实验目的 理解BGP路由信息首选值&#xff08;Preferred Value&#xff09;的作用 掌握修改Preferred Value属性的方法 掌握通过修改Preferred Value属性来实现流量分担的方法 实验拓扑 实验要求…...

Flink是什么?Flink技术介绍

官方参考资料&#xff1a;Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个分布式流处理和批处理计算框架&#xff0c;具有高性能、容错性和灵活性。以下是关于Flink技术的详细介绍&#xff1a; 一、Flink概述 ‌定义‌&#xff1a;Fli…...

Java中的重要集合

目录 List 1.vector 2.ArrayList 3.CopyonWriteArraylist 4.ArrayList变成线程安全的方式 5.LinkList Map 1.HashTable 2.HashMap 3.ConcurrentHashMap Set 1.LinkedHashSe List 1.vector Vector 是线程安全的动态数组&#xff0c;其内部方法基本都经过synchroni…...

实景视频与模型叠加融合?

[视频GIS系列]无人机视频与与实景模型进行实时融合_无人机视频融合-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞28次&#xff0c;收藏14次。将无人机视频与实景模型进行实时融合是一个涉及多个技术领域的复杂过程&#xff0c;主要包括无人机视频采集、实景模型构建、视频与模型…...

【一本通】分数约分

【一本通】分数约分 C语言CJavaPython &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 编写一个给一个分数约分的程序。 输入 输出整数a&#xff0c;b&#xff0c;分别表示分子与分母 输出 约分后的分子与分母&#xff0c;用“/“分隔 …...

ArkTs的容器布局

组件按照布局的要求依次排列&#xff0c;构成应用的页面。在声明式UI中&#xff0c;所有的页面都是由自定义组件构成&#xff0c;开发中可以根据自己的需求&#xff0c;选择合适的布局进行页面开发。 一. 如何选择布局 声明式UI提供了以下10种常见布局&#xff0c;开发者可根…...

jenkins 出现 Jenkins: 403 No valid crumb was included in the request

文章目录 前言解决方式:1.跨站请求为找保护勾选"代理兼容"2.全局变量或者节点上添加环境变量3.&#xff08;可选&#xff09;下载插件 the strict Crumb Issuer plugin4.重启 前言 jenkins运行时间长了&#xff0c;经常出现点了好几次才能构建&#xff0c;然后报了Je…...

SpringDataJpa-字段加解密存储

SpringDataJpa-字段加解密存储 背景场景实现类型转换器实体类修改 Crypto 注解AOP 目前可使用场景注意 背景 遇到一个需求&#xff0c;对数据库中的某些字段进行加密存储&#xff0c;但是在各个服务流转中&#xff0c;需要是解密状态的。框架使用的是JPA。 Spring 提供了 Attri…...

python03-保留字、标识符;变量、常量;数据类型、数据类型之间的转化

一、保留字 VS 标识符 1-1、35个保留字 保留字&#xff0c;严格区分大小写&#xff01; 查询保留字&#xff1a; 1-2、标识符 常量&#xff1a;python中没有明确的定义常量的关键字&#xff0c;常量的值在程序运行过程中不允许修改&#xff01; 二、变量 VS 常量 2-1、变量 变…...

投影互动装置入驻,科普基地学习体验再上新台阶!

数字科技的迅猛进步极大地充盈了人们的日常生活&#xff0c;这一变革在主题乐园与科普教育基地等场所尤为显著。在这些地方&#xff0c;投影互动装置引领我们穿梭于光影构建的奇妙世界。特别是互动投影墙&#xff0c;它赋予观众前所未有的交互体验。那么&#xff0c;这种技术究…...

socket编程UDP-实现滑动窗口机制与累积确认GBN

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现了停等机制。 socket编程UDP-实现停…...

乐观锁与悲观锁的概念

在多线程或多进程并发访问同一资源的情况下&#xff0c;为了防止数据的不一致性和竞态条件&#xff0c;常常需要使用锁机制来控制并发访问。锁机制大致可以分为 乐观锁&#xff08;Optimistic Locking&#xff09;和 悲观锁&#xff08;Pessimistic Locking&#xff09;。这两种…...

考研数学【线性代数基础box(数二)】

本文是对数学二线性代数基础进行总结&#xff0c;一些及极其简单的被省略了&#xff0c;代数的概念稀碎&#xff0c;不如高数关联性高&#xff0c;所以本文仅供参考&#xff0c;做题请从中筛选&#xff01; 本文为初稿&#xff0c;后面会根据刷题和自己的理解继续更新 高数&a…...

游戏引擎学习第45天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们刚刚开始研究运动方程&#xff0c;展示了如何处理当人物遇到障碍物时的情况。有一种版本是角色会从障碍物上反弹&#xff0c;而另一版本是角色会完全停下来。这种方式感觉不太自然&#xff0c;因为在游戏中&#xff0c;…...

基于 mzt-biz-log 实现接口调用日志记录

&#x1f3af;导读&#xff1a;mzt-biz-log 是一个用于记录操作日志的通用组件&#xff0c;旨在追踪系统中“谁”在“何时”对“何事”执行了“何种操作”。该组件通过简单的注解配置&#xff0c;如 LogRecord&#xff0c;即可实现接口调用的日志记录&#xff0c;支持成功与失败…...

无人设备之RTK地面基站篇

一、定义与功能 RTK地面基站是一种通过差分定位技术来实现GPS等全球导航卫星系统信号精确定位的设备。它通过与无人设备上的流动站进行实时数据通信&#xff0c;利用载波相位差分原理&#xff0c;消除卫星定位过程中的大部分公共误差&#xff0c;如卫星轨道误差、电离层延迟、对…...

TMS320C55x DSP芯片结构和CPU外围电路

第2章 DSP芯片结构和CPU外围电路 文章目录 第2章 DSP芯片结构和CPU外围电路TMS320C55x处理器的特点TMS320c55x CPU单元指令缓冲(Instruction Buffer Unit) I单元程序流程(Program Flow Unit) P单元地址数据(Address-data Flow Unit) A单元数据计算(Data Computation Unit) D单元…...

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…...

3D 生成重建035-DiffRF直接生成nerf

3D 生成重建035-DiffRF直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 本文提出了一种基于渲染引导的三维辐射场扩散新方法DiffRF&#xff0c;用于高质量的三维辐射场合成。现有的方法通常难以生成具有细致纹理和几何细节的三维模型&#xff0c;并且容易出…...

安宝特分享 | AR技术助力医院总院与分院间的远程面诊

随着科技的迅猛发展&#xff0c;增强现实&#xff08;AR&#xff09;技术在各行各业的应用愈发广泛&#xff0c;特别是在医疗领域&#xff0c;其潜力和价值正在被不断挖掘。在现代医疗环境中&#xff0c;患者常常面临“看病难、看病远、看病急”等诸多挑战&#xff0c;而安宝特…...

【功能安全】硬件常用安全机制

目录 安全机制分类: ECC内存保护: 看门狗定时器WDT 看门狗的诊断覆盖率 程序流监控 软件自检<...

linux上qt打包(二)

sudo apt install git 新建一个文件夹 名为xiazai&#xff0c; chmod -R 777 xiazai cd xiazai 并进入这个文件夹&#xff0c;然后clone git clone https://github.com/probonopd/linuxdeployqt.git 此处可能要fanQiang才能下 cd linuxdeployqt文件夹 下载平台需要的…...

Vue3 左右2栏的宽度 比例resize

Vue3, 页面左右2栏布局&#xff0c;用vue-resizer.页面效果如下图。 安装 npm i vue-resizer引入 import { DragCol, DragRow, ResizeCol, ResizeRow, Resize } from vue-resizer<DragCol height"100%" width"100%" :leftPercent"15">…...

企业车辆管理系统(源码+数据库+报告)

一、项目介绍 352.基于SpringBoot的企业车辆管理系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 二、项目技术 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&a…...

LeetCode 1847.最近的房间:有序集合

【LetMeFly】1847.最近的房间&#xff1a;有序集合 力扣题目链接&#xff1a;https://leetcode.cn/problems/closest-room/ 一个酒店里有 n 个房间&#xff0c;这些房间用二维整数数组 rooms 表示&#xff0c;其中 rooms[i] [roomIdi, sizei] 表示有一个房间号为 roomIdi 的…...

C05S07-Tomcat服务架设

一、Tomcat 1. Tomcat概述 Tomcat也是一个Web应用程序&#xff0c;具有三大核心功能。 Java Servlet&#xff1a;Tomcat是一个Servlet容器&#xff0c;负责管理和执行Java Servlet、服务端的Java程序&#xff0c;处理客户端的HTTP请求和响应。Java Server&#xff1a;服务端…...

Vscode搭建C语言多文件开发环境

一、文章内容简介 本文介绍了 “Vscode搭建C语言多文件开发环境”需要用到的软件&#xff0c;以及vscode必备插件&#xff0c;最后多文件编译时tasks.json文件和launch.json文件的配置。即目录顺序。由于内容较多&#xff0c;建议大家在阅读时使用电脑阅读&#xff0c;按照目录…...

mac电脑可以使用的模拟器

BlueStacks Air 推荐-》亲测可用 BlueStacks Air https://www.bluestacks.com 支持macOS/Windows&#xff0c;刚新增了对Apple Silicon系列M芯片的支持 GameLoop https://www.gameloop.com/ 支持 macOS/Windows Genymotion https://www.genymotion.com/ 支持Android/macO…...

vertx idea快速使用

目录 1.官网下载项目 2.修改代码 2.1拷贝代码方式 为了能够快速使用&#xff0c;我另外创建一个新的maven项目&#xff0c;将下载项目的src文件和pom文件拷贝到新建的maven项目。 2.2删除.mvn方式 3.更新配置 4.配置application 5.idea启动项目 1.官网下载项目 从vert…...

selenium 在已打开浏览器上继续调试

关闭浏览器&#xff0c;终端执行如下指令&#xff0c;--user-data-dir换成自己的User Data路径 chrome.exe --remote-debugging-port9222 --user-data-dir"C:\Users\xxx\AppData\Local\Google\Chrome\User Data" 会打开浏览器&#xff0c;打开百度&#xff0c;如下状…...

RequestContextHolder 与 HttpServletRequest 的联系

1. 什么是 RequestContextHolder&#xff1f; RequestContextHolder 是 Spring 框架 提供的一个工具类&#xff0c;用于在当前线程中存储和获取与请求相关的上下文信息。它是基于 ThreadLocal 实现的&#xff0c;能够保证每个线程独立存储和访问请求信息。 与 HttpServletReq…...

力扣hot100——普通数组

53. 最大子数组和 class Solution { public:int maxSubArray(vector<int>& nums) {int n nums.size();int ans nums[0];int sum 0;for (int i 0; i < n; i) {sum nums[i];ans max(ans, sum);if (sum < 0) sum 0;}return ans;} }; 最大子数组和&#xf…...

本地部署大模型QPS推理测试

目录 1、测试环境1.1、显卡1.2、模型1.3、部署环境1.3.1、docker1.3.2、执行命令 2、测试问题2.1、20字左右问题2.2、50字左右问题2.3、100字左右问题 3、测试代码3.1、通用测试代码3.2、通用测试代码&#xff08;仅供参考&#xff09; 4、测试结果4.1、通用测试结果4.2、RAG测…...

内存、硬盘、DRAM、FLASH

内存 内存是计算机系统中用于临时存储和快速存取当前正在处理的数据和指令的组件&#xff0c;属于临时存储设备&#xff0c;它在计算机运行时用于存储活跃的程序和数据。内存的性能直接影响计算机的处理速度和响应能力。 内存的类型主要分为&#xff1a; DRAM&#xff08;动态随…...

全景图转6面体图 全景图与6面体图互转

目录 图片转360度全景中心图 依赖项: 库的使用方法: 源代码: 全景图拆成6面体图: 全景图,转6面体,再转全景图: 图片转360度全景中心图 原图: 效果图: 依赖项: pip install py360convert pip install numpy==2.2 库的使用方法: https://g...

【psutil模块02】Python运维模块之系统进程管理方法

系统进程管理方法 获取当前系统的进程信息&#xff0c;包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等。 1.进程信息 psutil.pids()获取所有PID,使用psutil.Process()接收单个进程的PID&#xff0c;获取进程名、路径、状态、系统资源等…...

Java-08

类的抽象是将类的实现和使用分离, 而类的封装是将实现的细节封装起来并且对用户隐藏,用户只需会用就行。 类的合约指的是从类外可以访问的方法和数据域的集合以及与其这些成员如何行为的描述 isAlive()方法的返回值类型为布尔型&#xff08;Boolean&#xff09;。这个方法用于…...

四轴用的无刷电机到底是属于直流电机还是交流电机?

四轴用的无刷电机因其高效、稳定、体积小巧等特点&#xff0c;成为了广泛应用的动力系统之一。尽管其名称中包含“直流”二字&#xff0c;但无刷电机到底是属于直流电机还是交流电机&#xff0c;这一问题常常引发人们的探讨与困惑。 一、无刷电机的工作原理 首先&#xff0c;…...

Redis中的Hot key排查和解决思路

什么是Hot key Hot key其实就是被频繁访问的key&#xff0c;比普通的key访问量要高于十倍或者几十倍不等。例如&#xff1a; QPS集中在特定的Key&#xff1a;实例的总QPS&#xff08;每秒查询率&#xff09;为10,000&#xff0c;而其中一个Key的每秒访问量达到了7,000。带宽使…...

CMake 保姆级教程(上)

整理自 视频 【CMake 保姆级教程【C/C】】 https://www.bilibili.com/video/BV14s4y1g7Zj/?p5&share_sourcecopy_web&vd_source6eb8f46d194c5ef9f89d3331f623a9c3 1、cmake简介 源文件&#xff08;.cpp / .c&#xff09;要经过 工具链 1.1 工具链 1、预处理&#…...

C++类模板的应用

template <class T> class mylist{ public: // 这是一个链表的节点 struct Link{ T val; Link* next; } 增 &#xff1a;insert(T val) 在链表中创建新节点&#xff0c;节点上保存的数据为 val 删&#xff1a;remove(T val) 移除链表中数据为 val 的节点 改: operator[](…...

Ubuntu 18.04无有线图表且无法设置有线网络

问题背景&#xff1a; 今天在登陆自己的虚拟机Ubuntu系统的时候突然出现 有线连接无法连接的问题&#xff0c;有线连接的图标变为没有了&#xff0c;无法点击网络菜单的Setting模块选项。我的虚拟机有线网络连接方式是NAT方式。 没有如下有线连接图标 解决方法&#xff1a; …...