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

使用VScode开发STM32:基于CMake(包含标准库和HAL库工程)

使用VScode开发STM32:基于CMake(包含标准库和HAL库工程)

本教程使用VScode作为代码编辑工具、Cmake作为构建系统生成器、Make进行构建系统、使用arm-none-eabi-gcc进行交叉编译、使用OpenOCD作为代码下载与调试工具,最终搭建出适用于ARM架构系列芯片的开发环境。此教程以STM32F103ZET6芯片为例。

经验证,可满足基本基本项目需求。但我发现arm-none-eabi-gcc编译器相比于keil的AC5、AC6编译器,所编译的hex文件比较大,Flash占用较高,为了兼顾keil开发项目,也为了能够与其他人的项目兼容,这里的keil与VScode的项目文件互不干扰,满足兼容性需求。

本文涉及的软件安装包、工程模板已放在我的百度网盘中,需要自取(本教程使用的是标准库,HAL库与其基本相同,具体差异请参考分享的文件自行对照)。

链接:https://pan.baidu.com/s/1N4DI9GpaRnCr-4J0uCTTHw?pwd=wqfz 
提取码:wqfz 
--来自百度网盘超级会员V4的分享
一、软件安装

已默认电脑上存在VScode,这里不讲述Vscode的安装。

涉及软件的安装配置:

  • 安装Cmake
  • 安装arm-none-eabi-gcc
  • 安装OpenOCD
  • MinGW
  • 安装VScode插件C/C++、CMake、Cortex-Debug
1.1 安装CMake
1.1.1 安装

下载地址:

https://cmake.org/download/

选择适合自己电脑的最新版本进行下载并安装,我这里选择cmake-3.29.2-windows-x86_64.msi,如下图:

在这里插入图片描述

1.1.2 添加环境变量

我们需要将cmake的可执行文件的文件夹路径添加到环境变量,方便使用命令调用cmake,我的路径为:

D:\RJ\CMake\bin

将以上目录添加到系统环境变量中去。

1.1.3 验证

在终端输入以下命令,验证是否安装成功。

cmake

成功则将显示以下内容:
在这里插入图片描述

1.2 安装arm-none-eabi-gcc
1.2.1 安装

下载地址:

https://developer.arm.com/downloads/-/gnu-rm

选择适合自己电脑的最新版本进行下载并安装,我这里选择gcc-arm-none-eabi-10.3-2021.10-win32.exe,如下图:

在这里插入图片描述

1.2.2 添加环境变量

我们需要将arm-gcc的可执行文件的文件夹路径添加到环境变量,方便使用命令调用arm-gcc,我的路径为:

D:\RJ\ARM-GCC\10 2021.10\bin

将以上目录添加到系统环境变量中去。

1.2.3 验证

在终端输入以下命令,验证是否安装成功。

arm-none-eabi-gcc

成功则将显示以下内容:

在这里插入图片描述

1.3 安装OpenOCD
1.3.1 安装

下载地址:

https://gnutoolchains.com/arm-eabi/openocd/

选择适合自己电脑的最新版本进行下载,直接下载的是压缩包文件,解压后可直接使用,我这里选择openocd-20231002.7z,如下图:

在这里插入图片描述

1.3.2 添加环境变量

我们需要将OpenOCD的可执行文件的文件夹路径添加到环境变量,方便使用命令调用OpenOCD,我的路径为:

D:\RJ\OpenOCD-20231002-0.12.0\bin

将以上目录添加到系统环境变量中去。

1.3.3 验证

在终端输入以下命令,验证是否安装成功。

openOCD

成功则将显示以下内容:

在这里插入图片描述

1.4 安装MinGW
1.4.1 安装

下载地址:

https://sourceforge.net/projects/mingw-w64/files/

选择适合自己电脑的最新版本进行下载,直接下载的是压缩包文件,解压后的mingw64可直接使用,我这里选择MinGW-W64GCC-8.1.0下的x86_64-posix-sjlj,如下图:

在这里插入图片描述

1.4.2 添加环境变量

我们需要将make的可执行文件的文件夹路径添加到环境变量,方便使用命令调用make,我的路径为:

D:\RJ\mingw64\bin

将以上目录添加到系统环境变量中去。

1.3.3 验证

在终端输入以下命令,验证是否安装成功(由于Window下make执行程序为mingw32-make.exe,我这里将其复制保存同目录下为副本,并改名为make.exe)。

make

成功则将显示以下内容:

在这里插入图片描述

1.5 在Vscode中安装插件

要安装的插件如下:

在这里插入图片描述

二、工程搭建

以下是我的工程框架

在这里插入图片描述

与ARM-MDK工程不同,我们配置工程还需要格外的文件,分别是CMakeLists.txt、startup_stm32f10x_hd.s、STM32F103ZETx_FLASH.ld。

2.1 配置CMakeLists.txt文件

CMake根据CMakeLists.txt进行构建,从而创建出Makefile,再由make根据 Makefile 定义的规则调用 GCC 执行编译工作,最终生成可执行的.elf或者.hex文件。以下是CMakeLists.txt的模板,需要更改的部分我已经标明。

#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE!
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_VERSION 1)
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)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)# project settings
project(Project  C CXX ASM)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)#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)add_compile_options(-mcpu=cortex-m3 -mthumb -mthumb-interwork)
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")
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")message(VERBOSE "Maximum optimization for speed")add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")message(VERBOSE "Maximum optimization for speed, debug info included")add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")message(VERBOSE "Maximum optimization for size")add_compile_options(-Os)
else ()message(VERBOSE "Minimal optimization, debug info included")add_compile_options(-Og -g)
endif ()#添加宏定义
add_definitions(-DUSE_HAL_DRIVER -DSTM32F103xB -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD)#添加头文件路径,即.h文件
include_directories(./STM32F10x_FWLib/inc ./User ./Project/Code-Cmake)
#添加源文件路径,即.c或者.s文件
file(GLOB_RECURSE SOURCES ./STM32F10x_FWLib/src/*.c ./User/*.c ./Project/Code-Cmake/*.*)#添加你的STM32F103ZETx_FLASH.ld的连接脚本路径
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Project/Code-Cmake/STM32F103ZETx_FLASH.ld)add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
#选择cortex-m3内核
add_link_options(-mcpu=cortex-m3 -mthumb -mthumb-interwork)
add_link_options(-T ${LINKER_SCRIPT})add_link_options(-specs=nano.specs -specs=nosys.specs -u _printf_float)add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})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}")
2.2 选择startup_stm32f10x_hd.s

在我们创建ARM-MDK工程时,我们从官方的固件包中选择的是arm版本的启动文件,在这里我们要选择gcc版本的启动文件,即下图中的gcc_ride7。同时为了与ARM-MDK有所区分,我将该文件放在了/Project/Code-Cmake文件夹下。

在这里插入图片描述

2.3 STM32F103ZETx_FLASH.ld

STM32F103ZETx_FLASH.ld是一个链接脚本文件,它告诉编译器相关的编译后的可执行代码,内存变量,中断向量,链接在哪个存储区。获取方式主要有三种(请根据自己单片机型号选择):

  • 使用CudeMax编译过程可以生成该链接脚本
  • 搜索已有的工程,你可以直接在浏览器搜索STM32F103ZETx_FLASH.ld,一般都有。
  • 如果你对该型号芯片足够了解,可以自行编写。

以下是我的STM32F103ZETx_FLASH.ld:

/*
******************************************************************************
**
** @file        : LinkerScript.ld
**
** @author      : Auto-generated by STM32CubeIDE
**
** @brief       : Linker script for STM32F103ZETx Device from STM32F1 series
**                      512Kbytes FLASH
**                      64Kbytes RAM
**
**                Set heap size, stack size and stack location according
**                to application requirements.
**
**                Set memory bank area and size if external memory is used
**
**  Target      : STMicroelectronics STM32
**
**  Distribution: The file is distributed as is, without any warranty
**                of any kind.
**
******************************************************************************
** @attention
**
** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
** All rights reserved.</center></h2>
**
** This software component is licensed by ST under BSD 3-Clause license,
** the "License"; You may not use this file except in compliance with the
** License. You may obtain a copy of the License at:
**                        opensource.org/licenses/BSD-3-Clause
**
******************************************************************************
*//* Entry Point */
ENTRY(Reset_Handler)/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */_Min_Heap_Size = 0x200 ; /* required amount of heap */
_Min_Stack_Size = 0x400 ; /* required amount of stack *//* Memories definition */
MEMORY
{RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 64KFLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
}/* Sections */
SECTIONS
{/* The startup code into "FLASH" Rom type memory */.isr_vector :{. = ALIGN(4);KEEP(*(.isr_vector)) /* Startup code */. = ALIGN(4);} >FLASH/* The program code and other data into "FLASH" Rom type memory */.text :{. = ALIGN(4);*(.text)           /* .text sections (code) */*(.text*)          /* .text* sections (code) */*(.glue_7)         /* glue arm to thumb code */*(.glue_7t)        /* glue thumb to arm code */*(.eh_frame)KEEP (*(.init))KEEP (*(.fini)). = ALIGN(4);_etext = .;        /* define a global symbols at end of code */} >FLASH/* Constant data into "FLASH" Rom type memory */.rodata :{. = ALIGN(4);*(.rodata)         /* .rodata sections (constants, strings, etc.) */*(.rodata*)        /* .rodata* sections (constants, strings, etc.) */. = ALIGN(4);} >FLASH.ARM.extab   : {. = ALIGN(4);*(.ARM.extab* .gnu.linkonce.armextab.*). = ALIGN(4);} >FLASH.ARM : {. = ALIGN(4);__exidx_start = .;*(.ARM.exidx*)__exidx_end = .;. = ALIGN(4);} >FLASH.preinit_array     :{. = ALIGN(4);PROVIDE_HIDDEN (__preinit_array_start = .);KEEP (*(.preinit_array*))PROVIDE_HIDDEN (__preinit_array_end = .);. = ALIGN(4);} >FLASH.init_array :{. = ALIGN(4);PROVIDE_HIDDEN (__init_array_start = .);KEEP (*(SORT(.init_array.*)))KEEP (*(.init_array*))PROVIDE_HIDDEN (__init_array_end = .);. = ALIGN(4);} >FLASH.fini_array :{. = ALIGN(4);PROVIDE_HIDDEN (__fini_array_start = .);KEEP (*(SORT(.fini_array.*)))KEEP (*(.fini_array*))PROVIDE_HIDDEN (__fini_array_end = .);. = ALIGN(4);} >FLASH/* Used by the startup to initialize data */_sidata = LOADADDR(.data);/* Initialized data sections into "RAM" Ram type memory */.data :{. = ALIGN(4);_sdata = .;        /* create a global symbol at data start */*(.data)           /* .data sections */*(.data*)          /* .data* sections */*(.RamFunc)        /* .RamFunc sections */*(.RamFunc*)       /* .RamFunc* sections */. = ALIGN(4);_edata = .;        /* define a global symbol at data end */} >RAM AT> FLASH/* Uninitialized data section into "RAM" Ram type memory */. = ALIGN(4);.bss :{/* This is used by the startup in order to initialize the .bss section */_sbss = .;         /* define a global symbol at bss start */__bss_start__ = _sbss;*(.bss)*(.bss*)*(COMMON). = ALIGN(4);_ebss = .;         /* define a global symbol at bss end */__bss_end__ = _ebss;} >RAM/* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);} >RAM/* Remove information from the compiler libraries *//DISCARD/ :{libc.a ( * )libm.a ( * )libgcc.a ( * )}.ARM.attributes 0 : { *(.ARM.attributes) }
}
2.4 关于core_cm3.c文件

由于gcc编译的问题,如果不更改core_cm3.c,可能出现以下报错:

在这里插入图片描述

我对此做出以下两处更改,并放在了/Project/Code-Cmake文件夹下,与MDK-ARM分开:

在这里插入图片描述
在这里插入图片描述

2.5 配置.vscode文件夹

这是VScode配置文件的位置

2.4.1 添加并配置c_cpp_properties.json

将其C/C++模式更改为gcc-arm,注意将gcc路径替换为自己的路径

{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"compilerPath": "D:\\RJ\\mingw64\\bin\\gcc.exe","cStandard": "gnu17","cppStandard": "gnu++14","intelliSenseMode": "gcc-arm","configurationProvider": "ms-vscode.cmake-tools"}],"version": 4
}

2.4.1 添加并配置launch.json

这个文件是关于烧录与调试相关的,在此目录下你可以选择你的下载器型号、芯片型号。其中的stm32f103.svd可以在调试时查看看寄存器的值,请将以下路径改为自己工程的路径。

{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"cwd": "${workspaceRoot}","executable": "D:/GC/STM32F1/build/Project.elf",   "name": "Debug with OpenOCD","request": "launch","type": "cortex-debug","servertype": "openocd","configFiles": ["D:/RJ/OpenOCD-20231002-0.12.0/share/openocd/scripts/interface/stlink-v2.cfg",  //在OpenOCD选择下载器"D:/RJ/OpenOCD-20231002-0.12.0/share/openocd/scripts/target/stm32f1x.cfg"    //在OpenOCD选择芯片],"svdFile": "D:/GC/STM32F1/stm32f103.svd",   //选择寄存器文件}]
}
三、编译、下载与调试

如果我们配置完成后,用VScode打开CMakeLists.txt所在文件夹工程过后,Cmake tool会自动提示配置Cmake,点击配置后,会生成build文件夹,产生的Makefile及其他中间文件会存放在该目录。

在这里插入图片描述

3.1 选择编译器

点击VScode下方的配置按钮,选择gcc-arm

在这里插入图片描述

3.2 编译

点击VScode下方的进行编译,生成目标文件

在这里插入图片描述

编译过程

在这里插入图片描述

在build文件夹下会生成目标文件

在这里插入图片描述

3.3 烧录

进入build文件夹下执行以下命令,其中将Project.hex替换为自己的目标文件,stlink-v2.cfg是选择下载器类型,stm32f1x.cfg是芯片型号

openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program Project.hex verify reset exit"

烧录成功

在这里插入图片描述

3.3 调试

打开左侧的运行和调试,选择Debug with OpenOCD

在这里插入图片描述

点击运行,可进行断点调试,变量监测,寄存器查看等操作。

在这里插入图片描述

3.4 关于变量定义

使用gcc编译时,我们一般需要告诉编译器这个变量是可变的,不然会造成内存覆盖,程序无法运行的情况,即voatile关键词

在这里插入图片描述

四、参考链接

此文章参考以下文章,若描述不清,可查看下方文章

Vscode搭建开发调试STM32/RISC-V环境IDE(最全面)

VSCode 和 CMake 搭建嵌入式开发环境

相关文章:

使用VScode开发STM32:基于CMake(包含标准库和HAL库工程)

使用VScode开发STM32&#xff1a;基于CMake&#xff08;包含标准库和HAL库工程&#xff09; 本教程使用VScode作为代码编辑工具、Cmake作为构建系统生成器、Make进行构建系统、使用arm-none-eabi-gcc进行交叉编译、使用OpenOCD作为代码下载与调试工具&#xff0c;最终搭建出适…...

Linux操作与权限2

查看权限控制信息 序号1&#xff0c;表示文件&#xff0c;文件夹权限控制信息 序号2&#xff0c;表示文件&#xff0c;文件夹所属用户 序号3&#xff0c;表示文件&#xff0c;文件夹所属用户组 12345678910d/l/-r/-w/-x/-r/-w/-x/-r/-w/-x/- 权限细节总共分为10个槽位 表格1&…...

解析第十一页

多选707、如图所示组网,SWA、SWB、SWC、SWD运行RSTP,则以下说法正确的是? A、可以在SWB的GE0/0/2端口开启边缘端口,让连接终端的接口快速进入转发状态 B、边缘端口收到BPDU之后会重新参与生成树的计算 C、可以在SWC的GEO/0/2端口开启边缘端口,让连接终端的接口快速进入转…...

SQL之order by盲注

目录 一.order by盲注的原理 二.注入方式 a.布尔盲注 b.时间盲注 三.防御 一.order by盲注的原理 order by子句是用于按指定列排序查询结果&#xff0c;列名或列序号皆可。 order by 后面接的字段或者数字不一样&#xff0c;那么这个数据表的排序就会不同。 order by 盲…...

阻止浏览器的默认缩放机制

在移动端浏览器中&#xff0c;当用户点击输入框&#xff08;如密码输入框&#xff09;时&#xff0c;页面可能会自动放大以提高可读性。这种行为通常是由于浏览器的默认缩放机制引起的。要阻止这种自动放大行为&#xff0c;可以采取以下几种方法&#xff1a; 使用 viewport 元…...

python 引用父目录:层级的模块

from pathlib import Path import sys 获取 project 目录 project_dir Path(file).resolve().parent.parent 将 project 目录添加到 sys.path 中 sys.path.append(str(project_dir)) 导入 support 模块 import support support.print_func(“Runoob”)...

实用:查找Linux进程调度统计信息的三个方法

实用&#xff1a;查找Linux进程调度统计信息的三个方法 在现代操作系统中&#xff0c;理解进程调度行为对于优化性能和解决瓶颈问题至关重要。本文将详细介绍如何在Linux系统中获取进程从调度队列中调入&#xff08;enqueue&#xff09;和调出&#xff08;dequeue&#xff09;…...

以下是自定义针对 Vite + TypeScript 项目的完整路径别名配置流程:

以下是针对 Vite TypeScript 项目的完整路径别名配置流程&#xff1a; 1. 安装必要依赖 bash npm install -D types/node 2. 配置 vite.config.ts typescript // vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from pat…...

基于Matlab实现汽车远近光灯识别的详细步骤及代码示例

以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例&#xff0c;主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理&#xff1a;包括读取图像、灰度化、去噪等操作&#xff0c;以提高后续处理的准确性。边缘检测&#xff1a;找出图像中的边缘信息…...

Solidity 开发环境

Solidity 开发环境 Solidity编辑器&#xff1a;Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境&#xff1a;以太坊开发环境&#xff08;Ethereum Development Environment&a…...

Ollama+Cherrystudio+beg-m3+Deepseek R1 32b部署本地私人知识库(2025年2月win11版)

之前综合网络各方面信息得到的配置表&#xff1a; 在信息爆炸的时代&#xff0c;数据安全和个性化需求愈发凸显。搭建本地私人知识库&#xff0c;不仅能确保数据的安全性&#xff0c;还能根据个人需求进行个性化定制&#xff0c;实现知识的高效管理和利用。随着技术的不断发展…...

vue3.0将后端返回的word文件流转换为pdf并导出+html2pdf.js将页面导出为pdf

实现思路 1.将Word文档转换为HTML&#xff1a;mammoth.js&#xff0c;它可以将.docx文件转换为HTML 2.将HTML转换为PDF&#xff1a;使用html2pdf.js将HTML转换为PDF 如果想要相同的效果&#xff0c;也可以把前端页面直接导出转换为pdf: 运用的插件&#xff1a;html2pdf.js 后端…...

【心得】缓存穿透与缓存击穿总是记混,一文从英语单词含义角度分析带你区分清楚!

一句话省流版&#xff1a;缓存穿透的英语为cache penetration,可以翻译为缓存渗透&#xff0c;“渗透”联想到网安的攻击渗透&#xff0c;故缓存穿透是绕过防护进行攻击&#xff1b; 缓存击穿的英语为"cache breakdown"&#xff0c;可以翻译为缓存故障&#xff0c;“…...

day02

作业2 为 Activity 设置2种不同的启动模式并通过 adb 命令进行查看任务栈信息&#xff0c;并且打印生命周期方法执行日志 step1&#xff1a;生成第二个Activity和相应配置、 一个是singleTask模式&#xff0c;还一个是mainActivity的默认格式 step2&#xff1a;打印生命周期…...

JavaScript 简单类型与复杂类型-堆和栈

深入理解JavaScript中的简单类型&#xff08;基本数据类型&#xff09;与复杂类型&#xff08;引用数据类型&#xff09;如何在内存中存储对于编写高效、无误的代码至关重要。本文将探讨这两种类型的差异&#xff0c;以及它们在内存中的存储机制——栈&#xff08;Stack&#x…...

五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战

1、LLaMA-Factory 基本介绍 1.1 定义 LLaMA-Factory 是一个开源的大型语言模型&#xff08;LLM&#xff09;微调框架&#xff0c;旨在帮助开发者和研究人员轻松地对预训练语言模型进行定制化训练和优化 1.2 功能特点 支持多种预训练模型 LLaMA Factory 支持超过 100 种主流的…...

数字IC后端设计实现OCC(On-chip Clock Controller)电路介绍及时钟树综合案例

数字IC后端时钟树综合专题&#xff08;OCC电路案例分享&#xff09; 复杂时钟设计时钟树综合(clock tree synthesis)常见20个典型案例 1、什么是OCC&#xff1f; 片上时钟控制器(On-chip Clock Controllers &#xff0c;OCC)&#xff0c;也称为扫描时钟控制器(Scan Clock Con…...

LeetCodehot 力扣热题100 全排列

这段代码的目的是计算给定整数数组的所有全排列&#xff08;permutations&#xff09;&#xff0c;并返回一个包含所有排列的二维数组。 思路解析 在这段代码中&#xff0c;采用了 深度优先搜索&#xff08;DFS&#xff09; 和 回溯 的方法来生成所有的排列。 关键步骤&#xf…...

深度学习c++资源库:vector容器,蓝桥杯常用算法sort,unique(排序+去重)

vector容器 1.基本概念 <vector> 是 STL 中的一个容器类&#xff0c;不同于普通数组的静态空间&#xff0c;vector可以动态扩展。 动态扩展&#xff1a;并不是在原空间连接新空间&#xff0c;而是找到更大的内存空间&#xff0c;将原数据拷贝到新空间&#xff0c;释放…...

Postgresql-重置统计信息(reset statistics)

文章目录 理解 PostgreSQL 中的 pg_stat_resetpg_stat_reset 的作用与使用时机pg_stat_reset 所需权限PostgreSQL 重置统计信息的方法重置整个database重置特定表的统计重置特定function的统计重置Statistics Collector:重置 WAL&#xff08;Write-Ahead Logging&#xff09;统…...

【Uniapp-Vue3】导入uni-id用户体系

在uniapp官网的uniCloud中下载uni-id用户体系 或者直接进入加载&#xff0c;下载地址&#xff1a;uni-id-pages - DCloud 插件市场 进入以后下载插件&#xff0c;打开HbuilderX 选中项目&#xff0c;点击确定 点击跳过 点击合并 右键uniCloud文件夹下的database文件夹&#x…...

【前沿探索篇七】【DeepSeek自动驾驶:端到端决策网络】

第一章 自动驾驶的"感官革命":多模态神经交响乐团 1.1 传感器矩阵的量子纠缠 我们把8路摄像头+4D毫米波雷达+128线激光雷达的融合称为"传感器交响乐",其数据融合公式可以简化为: def sensor_fusion(cam, radar, lidar):# 像素级特征提取 (ResNet-152…...

Staruml软件的介绍安装uml类图的绘制流程

文章目录 1.uml和staruml之间的关系2.软件的安装3.配置脚本语言4.Staruml创建类图4.反向工程 1.uml和staruml之间的关系 这篇文章主要是介绍这个staruml软件的安装和相关的背景介绍&#xff1a; 我和uml初识于IDEA软件&#xff0c;学习java的你一定用过这个软件&#xff0c;当…...

神经网络发展简史:从感知机到通用智能的进化之路

引言 神经网络作为人工智能的核心技术&#xff0c;其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角&#xff0c;梳理神经网络发展的五大关键阶段&#xff0c;结合具象化比喻和经典案例&#xff0c;为读者呈现一幅清晰的AI算法发展图谱。 一…...

快节奏生活

在当今快节奏的商务环境中&#xff0c;效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台&#xff0c;以其独特的功能和优势&#xff0c;为职场人士带来了前所未有的便捷与高效&#xff0c;成为了众多用户心中的“宝藏”工具。 1、亿可达&#xff1a;自动化流程的搭…...

Windows 11【1001问】通过Rufus制作Win 11系统安装U盘

随着科技的发展&#xff0c;Windows 11 已经成为许多用户的首选操作系统。在之前的几篇文章中&#xff0c;我们详细探讨了 Windows 11 的概念、安装配置要求以及如何下载 Windows 11 镜像文件&#xff0c;并介绍了六种不同的安装方法。本篇博客将聚焦于使用 ISO 文件安装 Windo…...

spring中手写注解开发(创建对象篇)

说明&#xff1a; 在spring底层中并不是我写的如此&#xff0c;这篇只是我用我自己的方式实现了使用注解组件扫描并且 创建对象&#xff0c;方法并不是很难&#xff0c;可以看一看&#xff0c;欢迎大佬评论 第一步&#xff1a; 我们需要自己写一个注解&#xff0c;我用的是idea…...

DeepSeek进入开源周,分享几点关于开源的思考

最近DeepSeek进入开源周&#xff0c;又把差点被大众遗忘在角落的开源话题拉了出来。 作为一个开源作者&#xff0c;也分享几点关于开源的思考。 AI对开源的影响 开源项目遇到的最大困难 开源项目不应该商业化 你的开源项目是垃圾...

大模型训练中的数据不平衡问题及其解决策略

目录 大模型训练中的数据不平衡问题及其解决策略 一、数据不平衡问题的影响 二、处理数据不平衡问题的方法 1. 过采样&#xff08;Oversampling&#xff09; 2. 欠采样&#xff08;Undersampling&#xff09; 3. 代价敏感学习&#xff08;Cost-Sensitive Learning&#xf…...

本地部署DeepSeek R1满血版大模型

一、前言 老周上一篇分享了《本地部署DeepSeek R1大模型》&#xff0c;本地受硬件条件限制&#xff0c;只跑了80亿参数量的模型。 1.5b模型基本可以在大部分个人电脑甚至手机中运行&#xff0c;如果你有 6G 显存以上&#xff0c;那么可以部署7b模型&#xff0c;如果有16G显存&…...

外发抄板SCH与PCB检查系列

外发抄板SCH与PCB检查系列 一、检查到手的文件二、PCB与原理图的对应检查1.为什么要查SCH与Pcbdoc的对应&#xff1f;2.查询方法 三、PCB与实物的信号对应检查 一、检查到手的文件 外发出去两块板子&#xff1a;控制板与功率板。 抄板机构返回的文件&#xff1a; 1.互相独立的…...

EX_25/2/25

编写一个如下场景&#xff1a; 有一个英雄Hero类&#xff0c;私有成员&#xff0c;攻击&#xff0c;防御&#xff0c;速度&#xff0c;生命值&#xff0c;以及所有的set get 方法 编写一个 武器 Weapon 类&#xff0c;拥有私有成员攻击力&#xff0c;以及set get 方法 编写一个…...

C# 打印Word文档 – 4种打印方法

Word文档是日常办公和学习中不可或缺的一部分。比如在商务往来中&#xff0c;经常需要打印 Word 文档用于撰写和传递正式的商务信函、合作协议、项目提案等。打印出来的文档便于双方签字盖章&#xff0c;具有法律效力和正式性。本文将提供以下4种通过C# 打印Word文档的方法&…...

ROS的action通信——实现阶乘运算(一)

在ROS中除了常见的话题(topic&#xff09;通信、服务(server)通信等方式&#xff0c;还有action通信这一方式&#xff0c;由于可以实时反馈任务完成情况&#xff0c;该通信方式被广泛运用于机器人导航等任务中。本文将通过三个小节的分享&#xff0c;实现基于action通信的阶乘运…...

Mac 上安装多版本的 JDK 且实现 自由切换

1.可以通过查看以下目录中的内容&#xff0c;确认当前已经安装的 jdk 版本。 cd /Library/Java/JavaVirtualMachines2.命令行查看 jdk 的安装路径 /usr/libexec/java_home -V3.下载要安装的jdk版本&#xff0c;修改环境变量( cat ~/.bash_profile) # 定义JDK 8和JDK 17的安装路…...

网络编程套接字

目录 一、认识端口号 二、端口号和进程ID 三、TCP/UDP协议 四、网络字节序 五、socket编程接口 5.1socket的常见API 5.2socketaddr结构 六、简单的UDP程序 七、地址转换函数 八、简单的TCP网络程序 九、Tcp协议通讯流程 9.1基于TCP协议的客户端/服务器程序的一般流…...

45.matlab产生正弦叠加信号

&#xff0c;...

Java23种设计模式案例

目录 一、概述 二、创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂方法模式 (Factory Method Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 三、结构型模式 (Structu…...

计算机毕业设计程序,定制开发服务

我们擅长的开发语言包括Python、C、Golang、Java&#xff0c;以及前端技术如HTML、CSS、JS和Vue。我们的服务内容丰富&#xff0c;能够满足您各种需求&#xff0c;无论是简单的功能开发还是复杂的定制项目&#xff0c;我们都能为您提供专业支持。若有具体需求可联系作者。 链接…...

AI提示词的种类与适合的任务

以下是提示词的主要种类及其适用任务&#xff0c;基于大模型特性与最佳实践总结&#xff1a; 一、基础提示词 零样本提示&#xff08;Zero-shot Prompting&#xff09; 形式&#xff1a;直接输入任务指令&#xff0c;不提供示例&#xff08;如“翻译以下句子&#xff1a;Hello …...

【Kimi】自动生成PPT-并支持下载和在线编辑--全部免费

【Kimi】免费生成PPT并免费下载 用了好几个大模型&#xff0c;有些能生成PPT内容&#xff1b; 有些能生成PPT&#xff0c;但下载需要付费&#xff1b; 目前只有Kimi生成的PPT&#xff0c;能选择模板、能在线编辑、能下载&#xff0c;关键全部免费&#xff01; 一、用kimi生成PP…...

Maven环境搭建

Maven 1. 概述 ApacheMaven是一个软件项目管理和构建工具。基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;Maven可以从中心信息中管理项目的构建、报告和文档 理解: maven构建项目&#xff08;100%&#xff09;而且帮你完成jar的统一管理。 思考: 原来的jar—…...

Vue面试题

Vue面试题 Vue2.0的生命周期&#xff0c;每个生命周期分别做了哪些事情 create阶段&#xff1a;vue实例被创建。 beforeCreate: 创建前&#xff0c;此时data和methods中的数据都还没有初始化&#xff1b; created&#xff1a;创建完毕&#xff0c;data中有值&#xff0c;未…...

Linux时间日期类指令

1、data指令 基本语法&#xff1a; date &#xff1a; 显示当前时间date %Y : 显示当前年份date %m &#xff1a; 显示当前月份date %d &#xff1a; 显示当前哪一天date “%Y-%m-%d %H:%M:%S" &#xff1a; 显示年月日时分秒date -s 字符串时间 &#xff1a; 设置系统时…...

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是国内视频行业最重要的国家标准&#xff0c;目前有三个版本&#xff1a; 2011 年&#xff1a;推出 GB/T 28181-2011 版本&#xff0c;为安防行业的前端设备、平…...

pyautogui库的screenshot()函数

# 方法一 screenshot pyautogui.screenshot() screenshot.save("screenshot.png")# 方法二 # 获取屏幕分辨率 screen_width, screen_height pyautogui.size()# 截取桌面屏幕 screenshot pyautogui.screenshot(region(0, 0, screen_width, screen_height)) screens…...

python与C系列语言的差异总结(3)

与其他大部分编程语言不一样&#xff0c;Python使用空白符&#xff08;whitespace&#xff09;和缩进来标识代码块。也就是说&#xff0c;循环体、else条件从句之类的构成&#xff0c;都是由空白符加上冒号(:)来确定的。大部分编程语言都是使用某种大括号来标识代码块的。下面的…...

《Linux系统编程篇》System V信号量实现生产者与消费者问题(Linux 进程间通信(IPC))——基础篇(拓展思维)

文章目录 &#x1f4da; **生产者-消费者问题**&#x1f511; **问题分析**&#x1f6e0;️ **详细实现&#xff1a;生产者-消费者****步骤 1&#xff1a;定义信号量和缓冲区****步骤 2&#xff1a;创建信号量****步骤 3&#xff1a;生产者进程****步骤 4&#xff1a;消费者进程…...

Jmeter接口并发测试

Apache JMeter 是一款开源的性能测试工具&#xff0c;广泛用于接口并发测试、负载测试和压力测试。以下是使用 JMeter 进行接口并发测试的详细步骤&#xff1a; 一、准备工作 安装 JMeter 下载地址&#xff1a;Apache JMeter 官网 确保已安装 Java 环境&#xff08;JMeter 依…...

Python--内置函数与推导式(上)

1. 匿名函数 Lambda表达式基础 语法&#xff1a;lambda 参数: 表达式​ 特点&#xff1a; 没有函数名&#xff0c;适合简单逻辑函数体只能是单行表达式自动返回表达式结果 # 示例1&#xff1a;加法 add lambda a, b: a b print(add(3, 5)) # 输出 8# 示例2&#xff1a;字…...