Vscode搭建开发调试STM32环境IDE

news2024/11/20 14:15:39

单片机开发IDE环境如KeilMDK,虽然操作简单,方便调试。但就是代码编辑风格很老套,中文符号乱码还是常有的事。而如今流行的vscode编辑器很不错,免费且相当轻量级,用来代码开发体验很不错,看着都舒服。Clion IDE体验更好,但就是它不免费且体积较大。Stm32cubeIDE生成工程模板和配置方便,但自动补全还是太烂了,总之各有优劣。

前言

这里介绍下Vscode搭建开发调试STM32的IDE,分享给有需要的朋友。用Vscode开发STM32简直不要太爽,希望大家都能优雅的嵌入式开发。图引用自稚晖君的《配置CLion用于STM32开发【优雅の嵌入式开发】》

【注】

对于当前较火的RISC-V单片机来说,只有有交叉编译工具链,一样可以适用 vscode来配置和开发。RISC-V官方支持的调试器上位机是openocd。openocd是地表最强大(没有之一)的开源调试上位机,支持各种target(ARM(M、A系列)、FPGA、RISC-V等),支持各种调试器(Jlink、CMSIS-DAP、FTDI等),支持JTAG和SWD接口。

环境准备

软件环境

  • STM32CubeMX (非必须,有好处是可以帮你快速配置,若有工程模板可忽略)
  • VScode(安装相关插件cmakeTools,cortexDebug)
  • MinGW64(windows环境下的gcc工具链)
  • OpenOCD( 或者jlinkGdbServer也可以)
  • gcc-arm-none-eabi (arm的gcc交叉编辑工具链,安装后需添加进环境变量)

用到的资源链接

直接从ST官网下载可执行文件

  • MinGW 【https://sourceforge.net/projects/mingw-w64/files/】
  • Cmake  【Download | CMake】
  • STM32CubeMX【STM32CubeMX - STM32Cube初始化代码生成器 - 意法半导体STMicroelectronics】
  • arm-none-eabi-gcc 【https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads】
  • OpenOCD 【https://gnutoolchains.com/arm-eabi/openocd/】

以上CMake,MinGW64 ,arm-none-eabi-gcc和OpenOCD是必要软件。安装路径最好是没有中文和空格 。配置好环境变量,保证在cmd下这几行命令都能正常运行。

国外网站可能下载速度慢, 在这里提供我使用的工具链百度网盘地址

链接:https://pan.baidu.com/s/1NCQykQ57Xh6PFe28TU_GGw?pwd=goyj 
提取码:goyj 
--来自百度网盘超级会员V5的分享

环境变量配置好后,重启使得环境变量生效之后可以在命令行里用以下语句测试:

gcc -v
arm-none-eabi-gcc  -v 

cmake  --version
如果有信息输出,那就是装好了。

不想麻烦建工程想尽快体验的,可以直接使用我的模板。

附工程项目源码下载链接,可直接用vscode打开:

https://download.csdn.net/download/qq8864/8785579

Vscode插件安装

vscode需要下载安装以下插件,第一个截图中仅划红线的需要:

 

 

cmake脚本内容

cmake组织编译规则都是基于CMakeLists.txt文件的,如果熟悉CMake应该会觉得很方便很强大。不熟悉的也没事,基本不需要额外修改什么,只需要知道怎么在这个文件里面添加源码目录和include文件夹的路径就行了,这个文件几乎很少改动。

#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(vscodeSTM32Demo  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(STATUS "Maximum optimization for speed")
    add_compile_options(-Ofast)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
    message(STATUS "Maximum optimization for speed, debug info included")
    add_compile_options(-Ofast -g)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
    message(STATUS "Maximum optimization for size")
    add_compile_options(-Os)
else ()
    message(STATUS "Minimal optimization, debug info included")
    add_compile_options(-Og -g)
endif ()

add_definitions(-DUSE_HAL_DRIVER -DSTM32F103xB -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD)

include_directories(./STM32F10x_FWLib/inc ./include)
file(GLOB_RECURSE SOURCES "startup/*.*" STM32F10x_FWLib/src/*.c "./source/*.c")

set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F103C8Tx_FLASH.ld)

add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
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_BUILD
        COMMAND ${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}")

工程配置

STM32CubeMX其实并不必要,我们只需要配一份CMake脚本和startup的*.s文件即可,可以通过STM32CubeMX生成,同一块板子也可以直接copy过来用就好。其中的STM32F103C8Tx_FLASH.ld文件为链接脚本文件,很重要,不同型号的片子不一样,它告诉编译器相关的编译后的可执行代码,内存变量,中断向量,链接在哪个存储区(.text,.rodata ,.data, .bss等段在RAM和ROM中的位置和布局 )。

如何使用

初始项目工程代码,可以使用STM32Cubmx配置生成,也可以从其他地方拷贝过来,或者自己手工创建目录也可以。startup_stm32f103xb.s汇编文件和链接脚本文件是必要的。CMakeLists.txt文件也是必须的,可以自己编写或者使用写好的模板也可以,文中有提供现成的模板文件。有了这些后,至于是使用HAL库还是标准库都无所谓,跟使用什么库没关系。

在上述软件环境和插件都安装就绪的前提下,直接用Vscode打开工程源码文件夹(CMakeLists.txt所在的那个文件夹)即可。会自动识别cmake的工程配置,并在最下方展示的有相关项。如下图红色划线所示:

选择最下方状态栏的配置图标按钮,可以用来切换工具链,如下图所示: 

编译过程日志

[main] Configuring project: vscodeSTM32Demo 
[proc] Executing command: "D:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo -DCMAKE_C_COMPILER:FILEPATH=C:\tools\arm-gcc\bin\arm-none-eabi-gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=C:\tools\arm-gcc\bin\arm-none-eabi-g++.exe -SD:/Users/Administrator/Desktop/test3/vscodeSTM32Demo -Bd:/Users/Administrator/Desktop/test3/vscodeSTM32Demo/build -G Ninja
[cmake] Not searching for unused variables given on the command line.
[cmake] -- Maximum optimization for speed, debug info included
[cmake] -- Configuring done
[cmake] -- Generating done
[cmake] -- Build files have been written to: D:/Users/Administrator/Desktop/test3/vscodeSTM32Demo/build


[main] Building folder: vscodeSTM32Demo 
[build] Starting build
[proc] Executing command: "D:\Program Files\CMake\bin\cmake.EXE" --build d:/Users/Administrator/Desktop/test3/vscodeSTM32Demo/build --config RelWithDebInfo --target all --
[build] [14/29   3% :: 0.202] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/source/main.c.obj
[build] [15/29   6% :: 0.222] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/STM32F10x_FWLib/src/core_cm3.c.obj
[build] [16/29  10% :: 0.265] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/source/printf_uart.c.obj
[build] [17/29  13% :: 0.297] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/STM32F10x_FWLib/src/stm32f10x_bkp.c.obj
[build] [18/29  17% :: 0.310] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/STM32F10x_FWLib/src/misc.c.obj
[build] [19/29  20% :: 0.325] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/STM32F10x_FWLib/src/stm32f10x_cec.c.obj
[build] [20/29  24% :: 0.339] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/STM32F10x_FWLib/src/stm32f10x_dbgmcu.c.obj
[build] [21/29  27% :: 0.355] Building C object CMakeFiles/vscodeSTM32Demo.elf.dir/STM32F10x_FWLib/src/stm32f10x_dac.c.obj

编译截图: 

烧录程序 & 在线调试

在烧录之前,必须添加仿真器配置文件,下面是DAP-link的烧录文件,大家根据自己手头上的下载器的参数进行修改,并保存为xxxlink.cfg的格式,放在工程目录下config的文件夹中

# choose st-link/j-link/dap-link etc.
source [find interface/cmsis-dap.cfg]
transport select swd
# 0x10000 = 64K Flash Size
# 0x80000 = 512K Flash Size
set FLASH_SIZE 0x80000
source [find target/stm32f1x.cfg]
# download speed = 10MHz
adapter speed 10000
reset_config srst_only
#reset_config none

在工程根目录下新建一个文件夹config,在里面新建一个配置文件daplink.cfg(因为我这里使用的是DapLink作为仿真器),文件的内容如下:

# choose st-link/j-link/dap-link etc.
adapter driver cmsis-dap
transport select swd
​
# 0x10000 = 64K Flash Size
set FLASH_SIZE 0x20000
​
source [find target/stm32f1x.cfg]
​
# download speed = 10MHz
adapter speed 10000

如果是用ST-Link的话:

# choose st-link/j-link/dap-link etc.
#adapter driver cmsis-dap
#transport select swd
source [find interface/stlink.cfg]
transport select hla_swd
source [find target/stm32f1x.cfg]
# download speed = 10MHz
adapter speed 10000

前两行设置了仿真器的类型和接口,下面几行指定了Flash大小芯片类型下载速度等。

如果对自己的芯片不知道怎么设置,可以参考OpenOCD自带的一系列配置文件,路径在OpenOCD安装目录的share\openocd\scripts

在配置文件中不要加reset_config srst_only这一句,会导致下载失败,这一句是指示系统重启的,删除不影响下载。

ISP串口烧录程序

如果不需要在线仿真调试的话, 到这里就结束了。生成的hex文件可以直接使用串口工具下载程序。FlyMcu 工具软件是一款用于 STM32 芯片 ISP 串口烧录程序的专用工具,免费,且较为非常容易下手,好用便捷。使用串口一键下载有个前提条件,既你的电路板需要有一个RS串口转接电路,其中DTR和RTS是必须的,目的为了实现一键下载准备,做为BOOT0电平置高电平,才能将STM芯片引导到串口烧录程序,原理是通过DTR和RTS控制了boot管脚的变化使得芯片进入boot升级模式。

工具下载地址: 单片机在线编程网:www.mcuisp.com单片机在线编程网

仿真器下载程序

在终端输入命令openocd -f interface/stlink-v2.cfg -f target/stm32f4x.cfg -c "program build/VSCodeF4.hex verify reset exit"即可下载程序。

若在VSCode中实现像Keil那样的调试,需要配置调试文件,点击左侧调试按钮。选择创建launch.json文件。选择C++(GDB/LLDB),再选择默认配置。

选择Cortex Debug: OpenOcd 

项目根目录下的.vscode文件夹里的 launch.json编辑并增加以下内容(configFiles和svdFile配置),executable路径需要修改为实际生成elf文件的路径:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceRoot}",
            "executable": "./bin/executable.elf",
            "name": "Debug with OpenOCD",
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",
            "configFiles": [
                "stlink-v2.cfg",
                "stm32f4x.cfg"
            ],
            "searchDir": [],
            "runToEntryPoint": "main",
            "showDevDebugOutput": "none",
            "svdFile": "./STM32F40x.svd"

        }

    ]
}

关于OpenOCD 

从上面IDE的步骤中可以看出,OpenOCD 就是一个连通gdb和硬件调试器的工具,linux,macos,windows都可用。OpenOCD 支持大量的硬件调试器,常见的比如stm32常用的stlink,jlink调试器等。OpenOCD是一个运行于PC上的开源调试软件,最初是由Dominic Rath同学还在大学期间发起的(2005年)项目。OpenOCD旨在提供针对嵌入式设备的调试、系统编程和边界扫描功能。

SVD文件为单片机寄存器文件,加入这个文件才可以再调试时看寄存器的值,寄存器值变化可见需要在程序中打断点,才能看到寄存器值的变化。关于stm32单片机的svd文件,可在keil的芯片包安装路径下找到。(安装了keil以及芯片包才能找到)

运行调试界面:

 到此结束,有问题欢迎交流!最后可以愉快的使用vscode开发啦,助你开发愉快!

其他资源

嵌入式开发:配置CLion用于STM32开发_clion stm32_华丶仔的博客-CSDN博客

嵌入式IDE原理 OpenOCD介绍 以及stlink如何连接stm32板子_我是标同学的博客-CSDN博客

从零开始教你使用Clion优雅开发STM32(三)Clion嵌入式开发必备插件_clion插件推荐_王拉图的博客-CSDN博客

https://github.com/

配置CLion用于STM32开发【标准库】 - 简书

配置VS Code 开发STM32【宇宙&最强编辑器】-电子工程世界

STM32CubeMX - STM32Cube初始化代码生成器 - 意法半导体STMicroelectronics

从零开始教你使用Clion优雅开发STM32(一)软件安装与环境配置_clion开发stm32_王拉图的博客-CSDN博客

vscode-armgcc-openocd搭建STM32开发调试环境_vscode调试stm32_Nick全栈之路的博客-CSDN博客

MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net

配置CLion用于STM32开发【优雅の嵌入式开发】 - 知乎

vscode openOCD 配置Jlink 下载和调试STM32 教程 - 灰信网(软件开发博客聚合)

RISC-V MCU ld链接脚本说明_at > flash_借过风景的博客-CSDN博客

RISCV SOC开发环境 4——代码调试(openocd + gdb) - 知乎

OpenOCD刷写FLASH代码结构浅析(基于RISCV)_openocd源码解析_ys1115的博客-CSDN博客

RISC-V 调试软件 openOCD 安装及配置 - RISC-V技术论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!

深入浅出RISC-V调试_51CTO博客_深入浅出dpdk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

swagger在spring项目中的使用

一、Swagger2介绍 前后端分离开发模式中&#xff0c;api文档是最好的沟通方式。 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 及时性 (接口变更后&#xff0c;能够及时准确地通知相关前后端开发人员)规范性 (并且保…

电子科技大学计算机系统结构复习笔记(一):概述

目录 前言 重点一览 计算机分类 弗林分类法 市场分类 计算机系统结构定义 实现技术\功耗\成本的趋势\可靠性(了解) 计算机性能 性能评价指标 性能评价方法 计算机设计的量化原则 基本方法 Amdahl‘s 定律 CPU 性能公式 / 时间计算 本章小结 前言 本复习笔记基于…

windows环境使用clion搭建redis5.0 redis6.0的源码阅读环境

1、下载cygwin https://cygwin.com/install.html 第一步选择从互联网安装 别放在C盘 选择直接连接 我这边选择的是163的节点 接下来&#xff0c;就是让我们选择要安装的东西&#xff0c;网上一般给的就是如下几个&#xff1a; gcc-core、gcc-g、make、gdb、binutils 一个个…

计算机视觉 | 人体关键点检测与MMPose

前言 人体姿态估计&#xff08;Human Pose Estimation&#xff09;是计算机视觉领域中的一个重要研究方向&#xff0c;也是计算机理解人类动作、行为必不可少的一步&#xff0c;人体姿态估计是指通过计算机算法在图像或视频中定位人体关键点&#xff0c;目前被广泛应用于动作检…

0x34RequestDownload请求下载

0x34RequestDownload 客户端请求协商从客户端到服务器的数据传输。 客户端使用requestDownload服务来启动从客户端到服务器的数据传输&#xff08;下载&#xff09; 。 服务器收到requestDownload请求消息后&#xff0c;服务器应在发送肯定响应消息之前采取所有必要的操作来接…

【手撕Spring源码】深度理解SpringMVC【上】

文章目录 DispatcherServletRequestMappingHandlerMappingRequestMappingHandlerAdapter自定义参数处理器自定义返回值处理器 参数解析器获取参数名对象绑定与类型转换底层第一套转换接口与实现底层第二套转换接口与实现高层转换接口与实现自定义转换器 ControllerAdvice 之 In…

NeRF与三维重建专栏(二)NeRF原文解读与体渲染物理模型

前言 上一章中我们大致介绍了三维重建的背景、NeRF应用于三维重建的难点以及相关数据集和评估指标&#xff0c;本章节将会详细介绍NeRF原文以及部分源码&#xff0c;以及体渲染的物理模型&#xff0c;来帮助读者更好理解NeRF&#xff1b;下一章我们将会结合colmap&#xff0c;讲…

PrivateGPT(如何部署及使用感受)

前言 最近在GitHub上出现了一个名为PrivateGPT的开源项目。该项目旨在为面临敏感数据、涉密信息或个人隐私问题的用户提供一种新的聊天工具。PrivateGPT具备完整的数据控制能力&#xff0c;使用户能够在本地环境中与强大的语言模型进行交互&#xff0c;无需上传数据到互联网或…

kotlin的for循环遍历

kotlin的for循环遍历 1、List val list listOf("A", "B", "C")for (item in list) {println(item)} A B C 2、List的in val list listOf("A", "B", "C")for (item: String in list) {println(item)} A B C 3、l…

【C/C++】基础知识之命名空间与作用域

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【学习日记2023.6.2】之 管理端报表统计

文章目录 11. 管理端报表统计11.1 Apache ECharts11.1.1 介绍11.1.2 入门案例 11.2 营业额统计11.2.1 需求分析和设计11.2.2 代码开发Controller层Service层接口Service层实现类Mapper层 11.2.3 功能测试11.2.4 提交代码 11.3 用户统计11.3.1 需求分析和设计11.3.2 代码开发Con…

【QCA6174】QCA6174认证DFS跳转信道距离干扰信道太近,导致边带可以检测到信号问题分析及解决方案

WIFI DFS测试要求 Master设备需要测试的项目 4.6.2.1 Channel Availability Check ---信道可用性检查 定义其作为雷达脉冲检测机制,当雷达脉冲出现时所占用的信道需要能被设备检测到已经被占用。当相关信道未被占用时,这些信道被称为Avaliable Channel可用信道 4.6.2.2 In…

23Java面试专题 八股文面试全套真题(含大厂高频面试真题)多线程

文档说明 在文档中对所有的面试题都进行了 难易程度和 出现频率的等级说明 星数越多代表权重越大&#xff0c;最多五颗星&#xff08;☆☆☆☆☆&#xff09; 最少一颗星&#xff08;☆&#xff09; Java多线程相关面试题 1.线程的基础知识 1.1 线程和进程的区别&#xff1f; 难…

敷尔佳三闯IPO:去年狂赚8亿,广告宣传费近4亿

618大促已经开启&#xff0c;敷尔佳能否借“618”撑起“医美面膜第一股”&#xff1f; 近日&#xff0c;哈尔滨敷尔佳科技发展有限公司&#xff08;下称“敷尔佳”&#xff09;更新招股书&#xff0c;继续冲刺“医美面膜第一股”。 敷尔佳是一家主要从事专业皮肤护理产品的研…

MySQL中的业务数据该如何正确导入到Hive中 - Sqoop

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 目录 1. 使用Sqoop脚本将MySQL中的数据迁移到HDFS 2. 在Hive中建立与之对应的表 3. 将HDFS中的数据load到 Hive 数仓的ODS层的表中 1 . 使用Sqoop 将 MySQL中的数据导入到HDFS上 #! /bin/bashsqoo…

二进制安装Kubernetes(K8s)集群(基于containerd)---从零安装教程(带证书)

一、实验环境 1、安装说明 selinux iptables off 官方网站&#xff1a;https://kubernetes.io/zh-cn/docs/home 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster0210.10.10.22rhel7.5nginx、…

Ubuntu安装ssh并开启服务

Ubuntu开启SSH服务 1、更新源列表 $ sudo apt-get update 2、安装 说明:安装时需要提供互联网或者提前下载安装包 $ sudo apt-get install openssh-server 3、启动 $ sudo service ssh start 查询服务启动状态: $ sudo ps -e | grep ssh 或者 $ sudo service ssh status …

【C++】模板(1)

文章目录 前言一、泛型编程二、模板2.1 函数模板2.2 函数模板实例化&#xff1a;2. 3 函数模板的原理&#xff1a;2.4 模板参数的匹配原则 三、类模板 前言 C中的模板(template)是一种强大的语言特性&#xff0c;它可以让程序员编写可以适用于不同数据类型的通用代码。通过使用…

Js中的堆(heap)和栈(stack)内存

目录 1、堆和栈的概念2、数据类型3、腾讯面试题4、阿里面试题 1、堆和栈的概念 在JS钟变量都存放在内存中&#xff0c;而内存给变量开辟了两块区域&#xff0c;分别为栈区域和堆区域栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#…

长尾词挖掘,挖掘有效长尾关键词的3个方法

长尾关键词的特征是比较长&#xff0c;往往是2-3个词组成&#xff0c;甚至是短语&#xff0c;存在于内容页面&#xff0c;除了内容页的标题&#xff0c;还存在于内容中。 长尾关键词带来的客户&#xff0c;转化为网站产品客户的概率比目标关键词高很多&#xff0c;因此长尾…