使用VSCode打造APM飞控的编译+烧录+调试一体的终极开发环境

2023-05-16

日期:2019.05.08

前言

APM(Ardupilot)和PX4是当今世界上最为流行和活跃的两大开源飞控软件项目,它们均在Linux下基于gcc编译工具链开发,对于那些习惯与在Windows下使用Keil MDK开发单片机的童鞋,无疑带来了一定的门槛,除了编译环境搭建较为麻烦之外,还有一个最主要的原因便是难以实现类似Keil上的在线硬件调试(Debug)功能。

而本文的主要目的在于引导读者,在Ubuntu系统下为APM飞控搭建一个类似Keil的编译、烧录和调试一体的开发环境,降低开源飞控的入门和开发门槛。

QQ:562983648

前期准备

硬件

  • 飞控板:本教程中必须是基于STM32单片机并支持APM固件的飞控板,如pixhawk,pixhawk2等等,而作者本人则使用的是之前自己制作的一款基于STM32F405的飞控板,因此中间还有一段移植APM固件到第三方飞控板的教程,如果手上已经有官方飞控的童鞋可以直接跳过。
  • J-Link OB调试器:烧录和调试必备工具,淘宝上十几元一个,没有的话先准备一个吧。

系统环境

ubuntu 18.04

软件

这里先列出后续会使用到的软件工具版本:

  • VSCode : 1.33.1
  • OpenOCD : 0.10.0
  • Cortex-Debug : 0.2.3
  • gcc-arm-none-eabi : 6.3.1
  • python : 2.7.15
  • ArduCopter : 3.7.0-dev (fd19b257)

为什么使用VSCode

VSCode是微软在2015年发布的一个现代化跨平台开源编辑器,原生支持Git,并拥有着最强大的插件社区,被称之为史上最好用的编辑器。在越来越多各种强大的插件支持下,你可以将VSCode演变成支持绝大多数语言的IDE,当然包括了我们做嵌入式开发常用的C/C++。

VSCode

随着时代的发展,Keil之类的IDE,虽然上手简单,但是其编辑器功能已经远远落后与时代,还有着收费、不开源、不支持跨平台等各种问题。而VSCode正好弥补了这些缺点,并有着无比强大的编辑器功能与丰富插件支持。结合插件,我们可以将VSCode打造成一个有史以来最强大的飞控开发IDE,有着比拟Keil的硬件Debug功能,还有秒杀Keil几条大街的编辑器,那么我们还有什么理由不投入VSCode的怀抱呢?

邂逅VSCode

1.安装

在ubuntu上安装VSCode的方法有很多种,可自行百度。比较简单的一种方式是访问官网,直接下载deb包到本地,双击安装。
下载VSCode

2.插件

丰富的插件是VSCode的灵魂,也是短短两三年内造就了VSCode霸主地位的主要原因之一,不安装插件的VSCode比咸鱼好不了多少。。。

安装插件的方法是点击左侧的”Extensions“图标,或使用快捷键ctrl+shit+x打开插件搜索栏,输入名称查找插件,并点击install,如下图:

安装插件

必装插件

  • C/C++ :提供C/C++语言的智能推导,函数跳转,调试等功能
  • GitLens :Git辅助插件
  • Chinese (Simplified) Language Pack :中文界面语言包
  • Cortex-Debug :Cortex系列单片机调试工具

推荐安装

  • Git History :可视化的形式查看Git提交历史
  • Bracket Pair Colorizer :为代码中的括号添加颜色识别,强烈推荐,可提高代码阅读效率
  • C++ Intellisense :可作为C/C++插件的一个补充
  • ARM :提供ARM汇编语言的高亮识别
  • One Dark Pro :比较受欢迎的主题
  • vscode-icons :提供各种好看的文件及文件夹图标
  • Settings Sync :同步VSCode配置

3.设置界面为中文

喜欢原生英文界面的可跳过这一步。。。
快捷键ctrl+shift+p打开命令面板,输入language,选择"Configure Display Language",然后点击"zh-cn",软件重启之后便切换至中文界面。

下载并编译APM

1.下载代码

在你的工程目录下打开终端,克隆代码到本地

git clone https://github.com/ArduPilot/ardupilot

进入代码目录

cd ardupilot

更新子模块

git submodule update --init --recursive

2.安装工具链及python包

项目提供了环境部署脚本,可以直接安装所有所需工具和包

Tools/environment_install/install-prereqs-ubuntu.sh -y

理论上这样就可以了,但实际上由于gcc-arm-none-eabi工具链体积比较大,通过wget方式下载速度过慢,实在没有耐心等待,于是我选择手动安装工具链。
注意的是工具链版本很重要,过低和过高的版本都可能导致编译失败,一般部署脚本里提供的版本不会存在问题,所以我选择这个版本来下载。
打开链接https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads ,选择gcc-arm-none-eabi-6-2017-q2-update,Linux 64-bit进行下载,使用一些多线程下载工具速度会快很多。
下载工具链
下载完毕后,移动压缩包至opt目录下

sudo mv gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2 /opt/

进入opt目录,并解压

cd /opt
sudo tar -jxvf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2

配置工具链路径为环境变量

exportline="export PATH=/opt/gcc-arm-none-eabi-6-2017-q2-update/bin:\$PATH"

if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi

. ~/.profile

检测gcc-arm-none-eabi是否已正确安装

arm-none-eabi-gcc --version

应该输出以下内容
检测gcc-arm-none-eabi
重启使该环境变量应用到所有终端

reboot

3.编译

启动VSCode,并打开ardupilot文件夹,快捷键Ctrl+Shift+`打开终端。

为保险起见,让读者能够按照此教程顺利实现,请使用本文中编译的分支

git checkout fd19b257

编译适配fmuv5硬件的所有飞机类型的固件

make fmuv5

编译成功后如下图所示。
编译APM
通常我们只想编译多旋翼的固件,以节省时间,可以使用waf命令。

./waf configure --board fmuv5

./waf copter

编译arducopter

适配第三方飞控板

由于手上并没有pixhawk系列的飞控硬件,只能为已有的F405飞控板实现APM的适配。

我将自己手上的飞控板命名为bluesky(天穹飞控),后续编译飞控代码都将会使用这个名称,而读者们则需要根据自己的硬件来更改为相对应的型号进行编译,如fmuv2,fmuv3之类的。

1.增加编译配置文件

进入ardupilot/libraries/AP_HAL_ChibiOS/hwdef目录下,新建文件夹,命名为blueksy,在bluesky目录下新建两个名为hwdef.dathwdef-bl.dat的文件,它们分别为飞控主程序和Bootloader的编译配置文件,这两个文件的内容如下:

hwdef.dat

# hw definition file for bluesky hardware

# MCU class and specific type
MCU STM32F4xx STM32F405xx

# board ID for firmware load
APJ_BOARD_ID 888

# crystal frequency
OSCILLATOR_HZ 8000000
STM32_PLLM_VALUE 8

define STM32_ST_USE_TIMER 4
define CH_CFG_ST_RESOLUTION 16

FLASH_SIZE_KB 1024

# board voltage
STM32_VDD 330U

# only one I2C bus
I2C_ORDER I2C1

# order of UARTs (and USB)
UART_ORDER OTG1 USART1 USART3 UART4 USART6

# LEDs
PA6 LED_BLUE OUTPUT LOW GPIO(0)
PC4 LED_GREEN OUTPUT LOW GPIO(1)
PC5 LED_RED OUTPUT LOW GPIO(2)

define HAL_GPIO_A_LED_PIN 0
define HAL_GPIO_B_LED_PIN 1
define HAL_GPIO_C_LED_PIN 2

# buzzer
#PC13 BUZZER OUTPUT GPIO(80) LOW
#define HAL_BUZZER_PIN 80
#define HAL_BUZZER_ON 1
#define HAL_BUZZER_OFF 0

# spi1 bus for IMU
PB13 SPI2_SCK SPI2
PC2 SPI2_MISO SPI2
PC3 SPI2_MOSI SPI2

PA5 ICM20689_CS CS
PA4 MS5611_CS CS

# only one I2C bus in normal config
PB6 I2C1_SCL I2C1
PB7 I2C1_SDA I2C1

# analog pins
PC0 BATT_VOLTAGE_SENS ADC1 SCALE(1)
PC1 BATT_CURRENT_SENS ADC2 SCALE(1)

# define default battery setup
# PC5 - ADC12_CH15
define HAL_BATT_VOLT_PIN 15
# PC4 - ADC12_CH14
define HAL_BATT_CURR_PIN 14
define HAL_BATT_VOLT_SCALE 10.1
define HAL_BATT_CURR_SCALE 17.0

# USART1
PA9 USART1_TX USART1
PA10 USART1_RX USART1

# rcinput 
PA8 TIM1_CH1 TIM1 RCININT FLOAT LOW

# USART3
PB10 USART3_TX USART3
PB11 USART3_RX USART3

# UART4
PA0 UART4_TX UART4
PA1 UART4_RX UART4

# UART6
PC7 USART6_RX USART6
PC6 USART6_TX USART6

# PA10 IO-debug-console
PA11 OTG_FS_DM OTG1
PA12 OTG_FS_DP OTG1

# USB detection
#PB12 VBUS INPUT OPENDRAIN

# debug 
PA13 JTMS-SWDIO SWD
PA14 JTCK-SWCLK SWD

# PWM out pins. Note that channel order follows the ArduPilot motor
# order conventions
PA2  TIM2_CH3 TIM2 PWM(1) GPIO(50)
PA3  TIM2_CH4 TIM2 PWM(2) GPIO(51)
PB0  TIM3_CH3 TIM3 PWM(3) GPIO(52)
PB1  TIM3_CH4 TIM3 PWM(4) GPIO(53)
PA15 TIM2_CH1 TIM2 PWM(5) GPIO(54)
PB3  TIM2_CH2 TIM2 PWM(6) GPIO(55)

define HAL_STORAGE_SIZE 15360
define STORAGE_FLASH_PAGE 2

# reserve 32k for bootloader and 32k for flash storage
FLASH_RESERVE_START_KB 64

define HAL_INS_DEFAULT HAL_INS_ICM20689_SPI
define HAL_INS_DEFAULT_ROTATION ROTATION_ROLL_180_YAW_270

# no built-in compass, but probe the i2c bus for all possible
# external compass types
define ALLOW_ARM_NO_COMPASS
define HAL_COMPASS_DEFAULT HAL_COMPASS_NONE
define HAL_PROBE_EXTERNAL_I2C_COMPASSES
define HAL_I2C_INTERNAL_MASK 0
define HAL_COMPASS_AUTO_ROT_DEFAULT 2

define HAL_BARO_DEFAULT HAL_BARO_MS5611_SPI

# SPI devices
SPIDEV icm20689       SPI2 DEVID1  ICM20689_CS  MODE3  2*MHZ  8*MHZ
SPIDEV ms5611         SPI2 DEVID2  MS5611_CS    MODE3 20*MHZ 20*MHZ

# filesystem setup on sdcard
#define HAL_OS_FATFS_IO 1
#define HAL_BOARD_LOG_DIRECTORY "/APM/LOGS"
#define HAL_BOARD_TERRAIN_DIRECTORY "/APM/TERRAIN"

# 8 PWM available by default
define BOARD_PWM_COUNT_DEFAULT 8

# uncomment the lines below to enable strict API
# checking in ChibiOS
define CH_DBG_ENABLE_ASSERTS TRUE
define CH_DBG_ENABLE_CHECKS TRUE
define CH_DBG_SYSTEM_STATE_CHECK TRUE
define CH_DBG_ENABLE_STACK_CHECK TRUE

hwdef-bl.dat

# hw definition file for processing by chibios_pins.py
# for minimal F405 bootloader

# MCU class and specific type
MCU STM32F4xx STM32F405xx

# board ID for firmware load
APJ_BOARD_ID 888

# crystal frequency
OSCILLATOR_HZ 8000000
STM32_PLLM_VALUE 8

FLASH_SIZE_KB 1024

# bootloader is installed at zero offset
FLASH_RESERVE_START_KB 0

# LEDs
PA6 LED_BOOTLOADER OUTPUT LOW
PC5 LED_ACTIVITY  OUTPUT LOW
define HAL_LED_ON 0

# the location where the bootloader will put the firmware
FLASH_BOOTLOADER_LOAD_KB 64

# board voltage
STM32_VDD 330U

# order of UARTs
UART_ORDER OTG1

PA11 OTG_FS_DM OTG1
PA12 OTG_FS_DP OTG1

define HAL_USE_EMPTY_STORAGE 1
define HAL_STORAGE_SIZE 15360

# debug 
PA13 JTMS-SWDIO SWD
PA14 JTCK-SWCLK SWD

hwdef.dat中HAL_INS_ICM20689_SPI这个宏定义在飞控代码中是不存在的,因为飞控的IMU安装方向已经被固化在代码中,因此我需要针对我的飞控板对代码进行一定修改:
打开ardupilot/libraries/AP_InertialSensor目录下的AP_InertialSensor.cpp,在大约845行下面增加如下代码

#elif HAL_INS_DEFAULT == HAL_INS_ICM20689_SPI && defined(HAL_INS_DEFAULT_ROTATION)
    ADD_BACKEND(AP_InertialSensor_Invensense::probe(*this, hal.spi->get_device("icm20689"), ROTATION_ROLL_180));

定义了我的IMU安装方向为ROTATION_ROLL_180
修改IMU安装方向
注意这里的hwdef.dat只是我临时修改的一个配置文件,还不够完善,后续再补充。针对不同的飞控板,可以参考文件夹下其他相近的配置文件来编写你自己的。

2.编译Bootloader

./waf configure --board bluesky --bootloader
./waf clean
./waf bootloader

3.编译飞控代码

./waf configure --board bluesky 
./waf copter

编译飞控代码

OpenOCD

OpenOCD是被VSCode的Cortex-Debug插件调用于烧录和调试STM32的软件。

1.安装

sudo apt install openocd

查看版本

openocd -v

openocd
注意版本必须是0.10.0(对于本教程而言)。

2.修改配置文件

我使用的是J-Link OB调试器,需要修改OpenOCD的jlink配置为swd接口

sudo gedit /usr/share/openocd/scripts/interface/jlink.cfg

打开jlink.cfg文件进行修改,在其中加入一行并保存

transport select swd

jlink.cfg

3.测试

将jlink调试器连接飞控并接入PC,输入以下命令测试是否能正确识别jlink及单片机

openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

如果提示“Warn : Failed to open device: LIBUSB_ERROR_ACCESS.”之类的错误,说明当前用户没有usb端口权限,需要使用

sudo usermod -a -G dialout user_name

重启后会将当前用户加入dialout组,注意user_name为你的用户名称。

输出下图信息,说明OpenOCD能够识别到单片机了。
OpenOCD

Tips

  • OpenOCD无法识别单片机:如果你的飞控中已经烧录过某些程序,则存在禁用SWD接口的可能性,导致调试器无法连接单片机,这时候需要将BOOT0引脚拉高后再上电。

  • OpenOCD端口被占用:如果提示"Error: couldn’t bing xxx to socket: Address aleady in use"这个错误,可能是因为OpenOCD需要监听的端口已经被占用,其中xxx可能是telnet_port、gdb_port、tcl_port三者之一,这三个默认端口分别为4444、3333、6666。比如如果tcl_port被占用(这个是我在windows下经常碰到的情况),可以在.cfg文件中加入一行:tcl_port 19998,修改端口为19998,以解决这个问题。

4.烧录Bootloader

Bootloader只需要烧录一次,如果是pixhawk之类的已经烧写过程序的板子,那便可跳过此步骤。

连接单片机

 openocd -f interface/jlink.cfg -f target/stm32f4x.cfg

打开另一个终端,通过telnet连接openocd

telnet localhost 4444

烧录Bootloader,注意这里要把Bootloader文件路径修改成你自己的

program /home/bluesky/Project/ardupilot/build/bluesky/bootloader/AP_Bootloader

复位单片机

reset

烧录Bootloader

使用VSCode调试APM

重头戏来了,但是要实现这一步必须要保证以下几点:

  • 编译正常通过,并生成了飞控固件
  • openocd正常工作,能够连接并识别到单片机
  • VSCode上已经安装了Cortex-Debug插件

1.增加Debug配置文件

在VSCode中打开ardupilot项目后,点击左侧图标或者使用快捷键Ctrl+Shift+D打开Debug界面,如下图
Debug
点击小齿轮图标,并选择“Cortex-Debug",将会添加一个launch.json的配置文件,将下面的代码复制(覆盖)到launch.json并保存:

{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "Cortex Debug",
        "cwd": "${workspaceRoot}",
        "executable": "./build/bluesky/bin/arducopter", //固件路径,需要根据实际情况修改
        "request": "launch",
        "type": "cortex-debug",
        "servertype": "openocd",
        "configFiles": [
          "interface/jlink.cfg", //Jlink配置文件
          "target/stm32f4x.cfg" //目标芯片配置文件,需要根据自己飞控的实际芯片修改,可以到/usr/share/openocd/scripts/target目录下查看存在的配置文件
        ]
      }
    ]
  }

Debug配置文件
其中"executable"和"configFiles"要根据自己的实际情况修改,比如飞控是基于STM32F7单片机的,那么
“target/stm32f4x.cfg"要修改为"target/stm32f7x.cfg”。

2.重新编译飞控固件

前面编译飞控固件时不带有Debug信息,这样会导致调试时无法识别到源代码文件,编译时加入--debug参数来增加debug信息。

./waf configure --debug --board bluesky 
./waf copter

增加debug参数后编译出现了一个错误:
编译错误
从错误提示上来看是因为AP_ROMFS.cpp中有一个compressed_size变量在使用前未初始化,于是打开libraries/AP_ROMFS目录下的AP_ROMFS.cpp文件,将第50行中的

    uint32_t compressed_size;

修改为

    uint32_t compressed_size = 0;

修改代码
重新进行编译
重新编译
可以看到重新编译的固件要比之前的大上少许。

3.调试

注意如果前面在其它终端中使用openocd连接了单片机,此时需要将其关闭。

一切都准备就绪。

在VSCode的菜单栏->调试中点击“启动调试”,或者直接按下F5,将会进入到Debug状态,中间出现一个Debug菜单栏。
调试状态
首先VSCode会给飞控板烧录固件,需要等待数秒钟(APM固件体积较大因此烧录时间较长),调试控制台中出现下图信息时说明固件已经加载完毕,再次按下F5,程序开始运行。
在这里插入图片描述
现在可以开始愉快地调试飞控程序了,可以在代码中放断点,查看变量等等。
调试
主要调试快捷键说明

  • F5 :全速运行
  • F6 :暂停
  • F10 :单步跳过
  • F11 :单步调试
  • Shift + F11 :单步跳出
  • Ctrl + Shift + F5 :重启

断点
可以在代码左侧单击放置断点,右键编辑断点属性,还可以设置条件断点:
条件断点
查看变量
将鼠标悬停在变量上面,可以显示变量的数值,也可以在左侧监视窗口中手动输入变量名以同时观察多个变量数据。有个缺陷是似乎在运行的时候无法查看变量数据,而在Keil的调试窗口中是能够支持全局变量和静态变量实时刷新的。

一键编译调试

使用过Keil的童鞋都知道,调试程序前会先自动编译当前程序,在VSCode中我们也可以利用Task功能来实现一键自动编译+调试。

创建tasks.json

快捷键Ctrl+Shift+p打开命令面板,输入task,选择Tasks:Configure Task(配置任务),在弹出来的选项中随便选择一个,将会自动生成一个tasks.json文件,然后将下面代码复制(覆盖)进去并保存:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "build",
            "command": "./waf copter",
        }
    ]
}

其中 "command"就是我们定义的要运行的命令,这里你可以根据自己的需求来改动。

绑定task

然后再打开先前的launch.json文件,在其中加入一行,表示在Debug之前先运行定义好的编译任务:

 "preLaunchTask": "build",

launch.json

当再次按下F5开始烧录和调试的时候,会先进行固件编译。

总结

理论上所有基于STM32并使用gcc编译的项目,均可以使用这种方式进行开发、烧录和调试,比如我的上一篇博文就说明了如何用这种方式来调试Betaflight飞控:Ubuntu下使用VSCode编译调试Betaflight飞控。

随着插件的进一步丰富与完善,未来VSCode会有着更强大的功能和更便捷的使用性,所以,现在可能会是你入手VSCode的最佳时间。

如果想在Win10下开发,也可以利用WSL子系统实现编译,Windows上运行VSCode配合win版的gcc-arm-none-eabi和openocd来实现同样的烧录及调试功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用VSCode打造APM飞控的编译+烧录+调试一体的终极开发环境 的相关文章

  • 解决vscode git push不成功,总是弹出“...reset”或“...Timeout”错误问题?

    问题 解决vscode git push不成功 总是弹出 reset 或 Timeout 错误问题 解决方法 cmd刷新一下ip缓存 ipconfig flushdns 第二种 git push报错 OpenSSL SSL read Con
  • 猿如意

    目录 一 什么是猿如意 二 借助猿如意安装Visual Studio Code 1 安装猿如意 2 安装Visual Studio Code 三 总结 一 什么是猿如意 猿如意是CSDN推出来的一款面向开发者的工具 他能够帮助开发者 找到自
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • 解决VSCode中查看ESP32日志乱码

    问题现象 在VSCode的Monitor中查看ESP32输出的日志乱码 如下图 原因 在VSCode中IDF默认的Monitor串口波特率为460800 然而ESP32输出Log的串口波特率默认为115200 因串口波特率不匹配导致Moni
  • 8种常见的 代码 编译 软件 !!

    VS Code Source Insight Vim UltraEdit eclipse Understand Atom Sublime Text 接下来详细为大家讲解一下它们各自的用途 目录 1 VS Code 2 Source Insi
  • react脚手架配置别名并自动提示[VSCode]

    1 安装三方库 craco craco yarn add craco dev npm install craco craco save dev 2 配置craco config js const path require path modu
  • Win10环境下配置VScode远程开发ssh-remote(免密登录)

    问题背景 在开发或者做实验的过程中 我们经常会用到远程服务器或者Github的项目 而我服务器上的项目只能在Jupyter Notebook上编写 或许可以在其他IDE上写 但我不知道 而我们喜欢用的IDE比如Pycharm 轻量级的VSc
  • Visual Studio Code 1.35更新:远程开发终于来啦

    前段时间大家可能看过一个新闻 微软为VSC开发一款名为Remote Development的扩展程序 可以让我们使用本地VSC开发和调试远程机器上的代码 这个功能对于我这个不会使用vim等linux工具的人来说 简直是一个重大消息 可惜的是
  • vscode cmake 编译32位程序

    vscode cmake 编译32位程序 为什么要用cmake vscode中的C C 插件直接支持的只是最简单的单文件编译 运行和调试 要管理大的项目 或者生成库 C C 插件不能直接支持 需要开发者利用vscode的task功能 结合脚
  • cpplint在VS Code中的安装及使用

    目录 前言 Python环境的配置 在VS Code中安装相应插件 补充 如何将VS Code默认的格式化风格改为Google风格 相关链接 前言 cpplint是一款Google的代码检查工具 确定一种编码风格对于我们有非常大的帮助 也可
  • 【css】overflow溢出隐藏

    overflow scroll 溢出部分显示滚动条 不溢出也显示滚动条 overflow auto 溢出的时候才显示滚动条 不溢出不显示滚动条
  • 使用vscode编辑和提交github仓库代码

    写在前面 在github上想删除仓库中的某个文件或文件夹 亦或是重命名操作都很麻烦 这里提供一种vscode的解决方案 在vscode中克隆远程github仓库 然后对代码或文件进行编辑 最后提交即可 就和管理本地文件一样方便 准备工作 下
  • Visual Studio Code 的安装教程和配置C语言环境(详解版)

    最近想装一个VS Code 来写C C 程序 但是看了网上的很多教程发现并不是那么的好 大部分都尝试失败了 摸索了很久找到了一个比较可靠的方法 目录 一 Visual Studio Code 的安装教程 二 接下来就是C语言的环境配置 三
  • vscode使用手册

    VS Code Visual Studio Code 是一款轻量级 跨平台的源代码编辑器 支持语法高亮 自动补全 调试 Git 版本控制等功能 下面是一些使用 VS Code 的基本操作 安装和启动 在官网上下载并安装 VS Code 打开
  • python利用bs4获取网络小说

    所选定的小说网址 https www shicimingju com book xiyouji html 如果想更换其他小说资源 在上一级网址就行 https www shicimingju com book 代码如下 from bs4 i
  • VSCode中配置命令行参数

    VSCode中配置命令行参数 在跑程序调试的时候 可以直接使用脚本运行程序 这个时候调试代码只能用pdb 我觉得不太习惯 而且感觉不是很好 所以想这能不能将运行程序的脚本中的命令直接配置到vscode上 就有了这篇记录 正常vscode D
  • VScode配置mingw C语言环境变量

    C语言IDE VScode VScode是个人比较喜欢的一款IDE软件 鄙人曾同时在VScode软件中运行三个终端 开发Python Golang和C语言 下载地址如下 code visualstudio com VScode配置mingw
  • VSCode 代码高亮 变量类型、函数名、类名没有颜色 - 设置主题即可

    https zhuanlan zhihu com p 630401039 之前应该设置主题了 但不知道为啥C 里面只有 int 有高亮 其他像 cv Mat 函数名 类名都没有颜色 解决方案是重新设置一下主题 File preference
  • VSCode 代码高亮 变量类型、函数名、类名没有颜色 - 设置主题即可

    https zhuanlan zhihu com p 630401039 之前应该设置主题了 但不知道为啥C 里面只有 int 有高亮 其他像 cv Mat 函数名 类名都没有颜色 解决方案是重新设置一下主题 File preference
  • NVIDIA Jetson环境VSCode安装记录,前期失败问题在于英伟达使用的是arm64架构

    1 安装失败及原因探索 1 1 报错 Unable to install code The following packages have unmet dependencies 搜索一个链接就开始上手 Ubuntu 22 04安装Visua

随机推荐

  • ll -bash: ls: command not found

    问题简单描述 xff1a centos6安装软件的时候 不知道执行了啥操作 ll ls 命令都不好用了 问题所在 在centos6系统上安装jdk 配置 etc profile 只配置了jdk的环境变量 忘记加入系统的变量 1 网上查了查是
  • (3)mysql index

    生活中的索引 最常见的书籍是有目录的 xff0c 也可以叫做为索引 为啥用索引 xff1f 为快不破 xff0c 为了快速的查找到我们想要的东西 xff0c 书中的索引可以快速查询到我们想看的章节内容 DB中的索引亦是如此 索引本质 本质就
  • 博客乔迁

    开通了个人博客网站 欢迎访问 http www codingfuns com 博客地址http www codingfuns com 刚开通多有不足之处 请留言哈 非常感谢 最近更新的一些文章 xff1a 文章题目文章链接地址更新日期com
  • 好书好人生--读书的步骤

    写在开始 xff1a 作为一名IT人士 xff0c 我们要经常接触新的技术 xff0c 也要多读一些技术的书和生活的书 xff0c 怎样读书最重要 xff0c 读书并不是读得多就好 xff0c 读书就像吃牛肉一样 xff0c 我们要吃了吸收
  • 目标跟踪 | 目标跟踪算法总结

    简介 本文为目标跟踪算法调研总结 注意 xff1a 可做分享 xff0c 切勿在投稿论文中大段摘用 xff08 重复率会很高 xff09 1 定义 目标跟踪是通过分析视频图片序列 xff0c 对检测出的各个候选目标区域实施匹配 xff0c
  • Python | python调用D435i报错:Failed to resolve the request 及其解决办法

    文章目录 简介报错解决办法 简介 英特尔实感深度摄像机D435i可以同时输出深度图像和RGB图像 官网上下载了一个D435i的测试文件 xff0c 编程语言为 xff1a python3 7 输出结果应该为同时显示深度图和RGB图的窗口 但
  • Java——死锁产生的条件及死锁判断排查

    文章目录 死锁产生的必要条件死锁排查 死锁产生的必要条件 要达到死锁 xff0c 必须具备以下4个条件 xff1a 互斥 至少有一个被持有的资源处于非共享模式 xff0c 如果有其他进程 线程请求这个资源 xff0c 那这个进程 线程必须等
  • 年终工作总结:给新手程序员的几个建议

    转自 xff1a 伯乐在线 马上到年末了 xff0c 自己也对今年做了一下总结 xff0c 自己有哪些优点 xff0c 有哪些还需要加强 每当我想到今年比较满意的地方 xff0c 对比之前 xff0c 就会有这样一个思考 xff1a 如果以
  • Linux下实现飞控开发:使用CMake构建STM32工程

    前言 QQ xff1a 562983648 由于工作原因 xff0c 已经许久没有接触飞控了 18年的时候曾经写过一个半成品开源飞控 xff0c 是基于Keil MDK这款商业IDE开发的 xff0c 只能在Windows下运行 由于笔者现
  • 嘘!偷偷看下阿里技术大牛的私人书单

    也许我们无法走遍地球的每一个角落 xff0c 却可以用阅读丈量整个世界 停止阅读就等于停止给大脑供给养分 信息爆炸时代 xff0c 养分 的质量决定了个人的成长速度 4 23世界读书日 阿里技 书 成长月 第二期 xff0c 我们 偷出 了
  • 工程师的精神家园

    文学家和艺术大师们总是在追求着自己的一片精神家园 xff0c 与工程师相比 xff0c 他们的姿态高傲而脱俗 真正朴实无华的 xff0c 大概是王小波描述的 xff0c 童年时代那个被锁着的书柜 xff0c 那个藏着奥维德的变形记 xff0
  • Github访问加速方法记录

    由于各种各样的原因 xff0c 在国内访问Github的速度非常慢 一般clone的速度只有几十k s的速度 xff0c 稍微大一点的工程基本无法clone xff0c 于是需要使用各种方式来加速访问Github的速度 使用代理 使用代理的
  • 姿态篇:四.非线性最小二乘与飞控传感器校准

    深入浅出多旋翼飞控开发 姿态篇 四 非线性最小二乘与飞控传感器校准 Github 作者 xff1a Sky 前言 搞好了传感器 xff0c 那意味着飞控已经完成了一半 不用猜了 xff0c 这句话正是鄙人说的 飞控的软硬件相关工作 xff0
  • 概述篇:二.多旋翼飞控技术综述

    深入浅出多旋翼飞控开发 概述篇 二 多旋翼飞控技术综述 Github 作者 xff1a Sky 要学习多旋翼飞控 xff0c 第一步得先弄清楚飞控的整体框架和大致工作流程 xff0c 对飞控有了一个整体的认识之后 xff0c 我们再逐步去学
  • 【深入浅出多旋翼飞控开发】系列教程

    针对飞控初学者编写的一系列教程 xff0c 可配合开源飞控项目 xff1a 天穹飞控一起学习 xff0c 效率更高 目录 概述篇 一 多旋翼飞控发展史 二 多旋翼飞控技术综述 预备篇 一 元器件选型及飞控电路设计 二 飞控代码下载与编译 三
  • Cortex-M4和Cortex-M7中的SIMD指令

    SIMD指令简介 单指令多数据流 xff0c 即SIMD xff08 Single Instruction xff0c Multiple Data xff09 指一类能够在单个指令周期内同时处理多个数据元素的指令集 xff0c 利用的是数据
  • 天穹地面站——专为飞控研发而生

    一 简介 天穹地面站是本人为开源飞控项目 天穹飞控专门开发的一个上位机软件 xff0c 针对飞控的研发与调试而设计 一直以来 xff0c 我都为没有一个适合飞控开发的上位机软件而发愁 xff0c 国内大部分爱好者们所使用的相关软件 xff0
  • 预备篇:二.飞控代码下载与编译

    深入浅出多旋翼飞控开发 预备篇 二 飞控代码下载与编译 开源飞控交流 xff1a 562983648 Github 因论坛关闭 xff0c 迁移该文章至博客 系统环境 xff1a WIN7 WIN8 WIN10 编译工具 xff1a Kei
  • 预备篇:一.元器件选型及飞控电路设计

    深入浅出多旋翼飞控开发 预备篇 一 元器件选型及飞控电路设计 Github 要让飞控程序跑起来 xff0c 首先我们得要有一个硬件实体 xff0c 也就是我们的飞控板 说实话 xff0c 飞控电路可以很简单 xff0c 单纯由几个简单的元器
  • 使用VSCode打造APM飞控的编译+烧录+调试一体的终极开发环境

    日期 xff1a 2019 05 08 前言 APM xff08 Ardupilot xff09 和PX4是当今世界上最为流行和活跃的两大开源飞控软件项目 xff0c 它们均在Linux下基于gcc编译工具链开发 xff0c 对于那些习惯与