Linux环境搭建MCU开发环境

article/2025/6/25 17:53:41

操作系统版本: ubuntu 22.04

文本编辑器:    vscode

开发板:           stm32f103c8t6

调试器:           st-link

前言

步骤一: 安装交叉编译工具链

步骤二: 创建工程目录结构

步骤三: 调试器驱动安装

步骤四: 烧录工具安装

步骤五: 调试环境搭建

一  交叉编译工具链

交叉编译工具链是用于在一种计算机平台(x86架构)上编译生成另一种平台(ARM架构)可执行代码的开发工具集合,包含交叉编译器(arm-none-eabi-gcc)、交叉链接器(arm-none-eabi-ld)、交叉调试器(arm-none-eabi-gdb)、标准库(newlib 标准库)等组件;

交叉编译工具链命名规则

arch [-vendor] [-os] [-eabi/gnueabi/gnueabihf] [-gcc/g++]

arch: 目标架构,常见架构: ARM架构(arm/aarch64) RISC-V架构

vendor: 工具链提供商,当工具链不依赖特定芯片厂商,采用 none 代替

OS: 用于明确目标设备的操作环境,当os字段值为 none 时,表示目标设备无操作系统(裸机),当os字段值为 linux 时,表示目标设备运行Linux操作系统;

注意:

  • 实时操作系统的运行环境仍被视为 裸机 ,因为其内核不提供传统 OS 的系统调用和复杂功能;
  • 同时没有 vendor 与 os,采用一个none代替;

eabi/gnueabi/gnueabihf(Embedded Application Binary Interface):

EABI规定

  • 函数调用约定(如寄存器使用、参数传递顺序)
  • 栈帧布局和内存管理规则
  • 数据类型对齐方式(如结构体成员的内存布局)
  • 浮点运算处理方式(硬件 FPU 或软件模拟)

注意:

  • 如果芯片支持硬件浮点,需选择带hf(硬浮点)后缀的工具链,如 arm-none-linux-gnueabihf-gcc,无硬件浮点则使用软浮点(-gnueabi
  • eabi 通常与 none 结合使用(如 arm-none-eabi),表示裸机程序的二进制接口规范
  • gnueabi 或 gnueabihf:通常与与linux 结合(如 arm-none-linux-gnueabihf),表示Linux应用的二进制接口(支持硬浮点)

二 安装交叉编译工具链

STM32F103C8T6为ARM cortex-m3内核(基于ARMV7-M架构),32位架构,目标开发板需要运行裸机程序,因此选择交叉编译工具链为 arm-none-eabi-gcc

uname -a # 用于获取系统的内核相关信息包括内核名称,主机名,硬件架构
lsb_release -a #用于查询发行版的用户层面信息包括系统名称、版本号等

官网地址: Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer

 步骤一:将arm-none-eabi-gcc指定版本下载到本地

步骤二:将本地交叉编译工具包上传到ubuntu中自定义文件夹并解压

语法格式:     scp [选项] <源路径> <目标路径>
使用前提:     linux开启SSH服务,Windows使用PowerShell
示例:         scp C:\文件路径\文件.txt 用户名@ip地址:/home/用户名/目标路径

 本文采用scp指令上传压缩包,等待上传完成

 scp C:\Users\Admin\Downloads\gcc-arm-none-eabi-10.3.tar.bz2 shuju@123.249.39.44:/home/shuju/ToolChain

xshell环境中进入到ToolChain目录下,创建arm-none-eabi-gcc目录,将压缩包剪切到该目录下,进入该目录解压压缩包

tar -xjvf gcc-arm-none-eabi-10.3.tar.bz2

步骤三:安装arm-none-eabi-gcc

 安装环境依赖包,依赖包指软件运行所必需的其他软件组件,它们提供基础功能(如系统调用接口、库函数、编译工具等),确保主程序能正常编译和执行;

使用 arm-none-eabi-gcc 编译代码时:

1. 编译阶段:依赖包提供基础库(如 libclibm)和头文件(如 stdio.h);

2. 链接阶段:依赖包中的 binutils(如 ldobjcopy)负责生成可执行文件;

3. 调试阶段gdb-multiarch(依赖包的一部分)用于调试 ARM 程序;

sudo apt-get update
sudo apt-get install build-essential libncurses-dev flex bison gperf python3 python3-pip python3-setuptools python3-serial python3-click python3-cryptography python3-future python3-pyparsing python3-pyelftools cmake ninja-build ccache libffi-dev libssl-dev dfu-util

首先查找到交叉编译工具链的可执行路径,然后进行系统级配置

创建全局配置文件

# 创建系统级配置文件(需要管理员权限)
sudo vim /etc/profile.d/arm_toolchain.sh# 在文件中添加以下内容(替换 /home/shuju/toolchain/gcc-arm-none-eabi/gcc-arm-none-eabi-10.3-2021.07/bin 为你的实际路径)export PATH="/home/shuju/toolchain/gcc-arm-none-eabi/gcc-arm-none-eabi-10.3-2021.07/bin
:$PATH"

修改文件权限

sudo chmod +x /etc/profile.d/arm_toolchain.sh
创建符号链接到系统目录
# 创建工具链目录的符号链接(注意替换为bin文件的上层路径)
sudo ln -s /home/shuju/toolchain/gcc-arm-none-eabi/gcc-arm-none-eabi-10.3-2021.07 /usr/local/arm-toolchain# 将工具链 bin 目录链接到系统路径
sudo ln -s /usr/local/arm-toolchain/bin/* /usr/local/bin/

最后检查交叉编译器是否安装成功

arm-none-eabi-gcc -v  #判断安装是否成功

三 创建工程目录结构

  • ST官网获取标准外设库

官网地址:https://www.st.com.cn/zh/embedded-software/stsw-stm32054.html

标准库目录结构介绍

进入到Libraries文件夹中,只有CMSIS文件夹与STM32F10x_StdPeriph_Driver,CMSIS(Cortex-M系列微控制器的软件接口标准)目录组织结构如下:

core_cm3.h文件:Cortex-M3处理器核心寄存器定义,提供NVIC、SysTick等内核功能;

stm32f10x.h文件:提供STM32外设寄存器基础定义,封装寄存器结构体,方便底层操作;system_stm32f10x.h文件:配置系统时钟和PLL,设置系统时钟频率;

arm目录:存放keil专用的启动文件;

gcc_ride7目录:存放 GCC 专用的启动文件;

STM32F10x_StdPeriph_Driver(外设驱动标准库文件)目录组织结构如下:

misc.c stm32f10x_xxx.c/misc.h stm32f10x_xxx.h文件:提供常用外设的接口,封装了GPIO、USART、RCC、TIM、SPI、I2C、DMA等常用外设的函数库;

开发STM32项目,必须包含以下文件:

  • 启动文件,启动文件的作用为MCU复位后执行的汇编启动代码,负责初始化堆栈指针,程序计数器,异常向量表等等,由于采用gcc编译程序,开发板为stm32f103c8t6,因此选择启动文件为startup_stm32f10x_md.s;
  • 内核文件 (core_cm3.h/core_cm3.c)
  • 芯片头文件 (stm32f10x.h)
  • 系统初始化文件(system_stm32f10x.c/system_stm32f10x.h)
  • 外设驱动标准库文件 (STM32F10x_StdPeriph_Driver目录下所有文件)
  • 外设配置头文件用户自定义创建)选择启用哪些外设驱动模块并配置库的参数选项,标准库的stm32f10x.h文件默认会包含stm32f10x_conf.h,如果此文件不存在会导致编译错误;
  • 链接脚本,链接脚本用于设置程序的入口点并且决定了编译器生成的可执行文件(ELF/HEX/BIN)在芯片中的内存布局,但STM32F1 标准库中,官方并未直接提供预配置的 GCC 链接脚本
  • Makefile 自动化编译整个工程

外设配置文件(stm32f10x_conf.h)

#ifndef __STM32F10x_CONF_H
#define __STM32F10x_CONF_H//启用需要的外设库头文件,未启用的库就注释掉
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"//启用断言
#define assert_param(expr) ((void)0)#endif

mcu工程结构配置如下:

链接脚本STM32F103C8T6_FLASH.ld文件

/* 定义芯片内存区域 */
MEMORY
{FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 64K   /* Flash 起始地址与大小 */RAM  (xrw)  : ORIGIN = 0x20000000, LENGTH = 20K   /* RAM 起始地址与大小 */
}/* 定义堆栈空间 */
_Min_Heap_Size = 0x200;   /* 最小堆大小(根据需要调整) */
_Min_Stack_Size = 0x400;  /* 最小栈大小(根据需要调整) *//* 定义关键符号地址 */
_estack = ORIGIN(RAM) + LENGTH(RAM);  /* 栈顶地址(RAM末尾) *//* 段分配 */
SECTIONS
{/* 中断向量表必须放在 Flash 起始地址 */.isr_vector :{. = ALIGN(4);KEEP(*(.isr_vector))  /* 保留中断向量表 */. = ALIGN(4);} >FLASH/* 代码段(.text)和只读数据(.rodata) */.text :{. = ALIGN(4);*(.text)           /* 代码 */*(.text*)          /* 其他代码(如内联函数) */*(.glue_7)         /* ARM/Thumb 胶水代码 */*(.glue_7t)        /* Thumb-2 胶水代码 */*(.eh_frame)/* 只读数据(常量、字符串等) */*(.rodata)*(.rodata*). = ALIGN(4);} >FLASH/* 初始化数据(.data):在 Flash 中存储初始值,运行时复制到 RAM */_sidata = .;  /* .data 初始值的 Flash 地址 */.data : AT ( _sidata ){. = ALIGN(4);_sdata = .;  /* .data 的 RAM 起始地址 */*(.data)*(.data*). = ALIGN(4);_edata = .;  /* .data 的 RAM 结束地址 */} >RAM/* 未初始化数据(.bss):运行时清零 */.bss :{. = ALIGN(4);_sbss = .;  /* .bss 的起始地址 */*(.bss)*(.bss*)*(COMMON)    /* 公共符号 */. = ALIGN(4);_ebss = .;  /* .bss 的结束地址 */} >RAM/* 用户堆栈空间 */._user_heap_stack :{. = ALIGN(8);PROVIDE ( end = . );PROVIDE ( _end = . );. = . + _Min_Heap_Size;. = . + _Min_Stack_Size;. = ALIGN(8);} >RAM/* 移除调试信息(可选) *//DISCARD/ :{libc.a ( * )libm.a ( * )libgcc.a ( * )*(.init)*(.fini)}
}

Makefile文件编写如下:

# 工具链配置
CC = arm-none-eabi-gcc
AS = arm-none-eabi-gcc -x assembler-with-cpp
OBJCOPY = arm-none-eabi-objcopy
SIZE = arm-none-eabi-size# 目标名称和构建目录
TARGET = main
BUILD_DIR = build# MCU配置
MCU = -mcpu=cortex-m3 -mthumb
DEFS = -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER# 头文件路径(已包含 User/ 目录)
INC_DIRS = -I. \-IUser \-ICMSIS/CM3/CoreSupport \-ICMSIS/CM3/DeviceSupport \-ILibrary/inc# 编译选项
CFLAGS = $(MCU) $(DEFS) -O0 -g3 -Wall -fdata-sections -ffunction-sections $(INC_DIRS)
ASFLAGS = $(MCU) $(DEFS) $(INC_DIRS)
LDFLAGS = $(MCU) -TStart/STM32F103C8T6_FLASH.ld \-Wl,--gc-sections -specs=nosys.specs -Wl,-Map=$(BUILD_DIR)/$(TARGET).map# 源文件列表
SRCS = \User/main.c \Start/startup_stm32f10x_md.s \CMSIS/CM3/DeviceSupport/system_stm32f10x.c \$(wildcard Library/src/*.c)# 生成目标文件列表
OBJS = $(addprefix $(BUILD_DIR)/,$(notdir $(SRCS:.c=.o)))
OBJS := $(OBJS:.s=.o)# 默认目标(添加 .o 文件清理步骤)
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin@echo "Cleaning intermediate .o files..."rm -f $(OBJS) # 生成ELF文件
$(BUILD_DIR)/$(TARGET).elf: $(OBJS)$(CC) $^ $(LDFLAGS) -o $@$(SIZE) $@# 生成HEX和BIN文件
$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(OBJCOPY) -O ihex $< $@$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)$(OBJCOPY) -O binary -S $< $@# 编译规则(保持不变)
$(BUILD_DIR)/%.o: User/%.c | $(BUILD_DIR)$(CC) -c $(CFLAGS) $< -o $@$(BUILD_DIR)/%.o: CMSIS/CM3/DeviceSupport/%.c | $(BUILD_DIR)$(CC) -c $(CFLAGS) $< -o $@$(BUILD_DIR)/%.o: Library/src/%.c | $(BUILD_DIR)$(CC) -c $(CFLAGS) $< -o $@$(BUILD_DIR)/%.o: Start/%.s | $(BUILD_DIR)$(AS) -c $(ASFLAGS) $< -o $@# 创建构建目录
$(BUILD_DIR):mkdir -p $@# 清理(删除整个 build 目录)
clean:rm -rf $(BUILD_DIR).PHONY: all clean flash

测试用例

#include "stm32f10x.h"
#include "stm32f10x_conf.h"//定义板载LED引脚
#define LED_PIN     GPIO_Pin_13
#define LED_PORT    GPIOC// 简单延时函数
void delay(uint32_t count) 
{for (volatile uint32_t i = 0; i < count; i++);
}int main()
{// 1. 初始化系统时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);// 2. 配置GPIO为推挽输出GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = LED_PIN;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; // 速度50MHzGPIO_Init(LED_PORT, &GPIO_InitStruct);// 3. 主循环:LED闪烁while (1) {GPIO_WriteBit(LED_PORT, LED_PIN, Bit_SET);  // LED灭delay(500000);GPIO_WriteBit(LED_PORT, LED_PIN, Bit_RESET); // LED亮delay(500000);}
}

运行结果:

三 安装调试器驱动程序

安装ST-Link驱动程序

Linux内核默认支持ST-Link/V2,因此无需单独安装驱动;

纯Linux环境 - udev规则配置(可选)

udevLinux系统中的一个 用户空间设备管理器,负责动态管理 /dev 目录下的设备节点usb、 键盘、 鼠标等等 ),操作系统作为软硬件资源的管理者,不允许用户跨过操作系统直接访问硬件资源;

Linux系统默认将  usb 设备ST-LinkJ-Link)的权限设置为 root 所有,普通用户无法直接访问;
udev 规则是用户编写的配置文件(位置: /etc/udev/rules.d/ ),用于定义当设备插入或移除时系统应执行的操作,可以为设备设置权限(允许普通用户访问);

root身份进入/etc/udev/rules.d/目录,创建49-stlinkv2.rules文件(数字49决定了规则加载的顺序,数字越小的文件越先被处理,后面的文件中的规则可能会覆盖前面的),添加如下内容

# ST-Link/V2
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666", GROUP="plugdev"
# ST-Link/V2.1
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="374b", MODE="0666", GROUP="plugdev"
# ST-Link/V3
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="374d", MODE="0666", GROUP="plugdev"

生效规则并重启服务

Linux环境

普通用户执行如下指令:

sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG plugdev $USER  # 将当前用户加入plugdev组
sudo reboot  # 重启生效

 wsl环境

 wsl系统中默认不运行 systemd-udevd 守护进程,因此即使配置了 udev 规则,规则也不会自动生效,但是需要手动配置权限,方便以普通用户的身份烧录程序;

# 安装 USBIP 工具和依赖
sudo apt update
sudo apt install linux-tools-virtual hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20# 将用户加入dialout组
sudo usermod -aG dialout $USER

 创建权限修复脚本

# 创建自动修复脚本
sudo vim /usr/local/bin/fix_stlink_perms.sh

 将下述内容拷贝到新创建的脚本fix_stlink_perms.sh 文件中

#!/bin/bash
# 修复 ST-Link 设备权限
for dev in /dev/bus/usb/*/*; doif [ -e "$dev" ]; thensudo chmod 666 "$dev"fi
done

 设置脚本权限并添加到 .bashrc 自动执行

#设置脚本权限
sudo chmod +x /usr/local/bin/fix_stlink_perms.sh#自动执行修复脚本
echo '/usr/local/bin/fix_stlink_perms.sh' >> ~/.bashrc
source ~/.bashrc

安装J-Link驱动程序(可选)

由于开发主机为 x86_64 架构,因此选择Linux (x86/x64) 版本的 J-Link 驱动;

J-Link驱动只负责与调试器硬件通信,JLink驱动版本的选择与目标单片机型号无关,只要开发主机架构相同,驱动选择就相同;

官网地址:SEGGER - The Embedded Experts - Downloads - J-Link / J-Trace

本文选择:SEGGER - The Embedded Experts - Downloads

DEB(Debian Package)是基于 Debian 系统(Ubuntu)的软件包格式,将deb安装包上传到ubuntu中自定义的JLink_Deb目录,执行如下指令进行安装

# 直接安装DEB包
sudo dpkg -i JLink_Linux_V792_x86_64.deb# 若出现依赖错误,修复缺失依赖
sudo apt --fix-broken install

输入JLink,Tab键按两次判断JLink是否安装成功

udev规则配置

打开/etc/udev/rules.d/99-jlink.rules文件,添加如下内容

# SEGGER J-Link devices
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0101", MODE="0666", GROUP="plugdev"  # J-Link Edu
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0102", MODE="0666", GROUP="plugdev"  # J-Link Plus
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0103", MODE="0666", GROUP="plugdev"  # J-Link Ultra
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", ATTR{idProduct}=="0121", MODE="0666", GROUP="plugdev"  # J-Link OB

生效规则并重启服务

切换到普通用户,执行如下操作

sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG plugdev $USER  # 将当前用户加入plugdev组
sudo reboot  # 重启生效

四 安装烧录工具

 官网地址:Client Challenge

本文选择pyOCD进行安装,pyOCD 要求 Python 版本至少为 3.6,输入如下指令查看python版本

pyocd --version

pyOCD 可以通过 pip 直接安装,pip 是 Python Package Index (PyPI) 的官方包管理工具,用于安装、升级、卸载和管理 Python 的第三方库(Packages),

# 安装PyOCD
pip3 install --user pyocd# 验证安装
pyocd list --targets | grep stm32f103  # 应显示stm32f103RC

纯Linux环境 - udev规则配置

创建规则文件99-pyocd.rules 并添加如下内容

sudo vim /etc/udev/rules.d/99-pyocd.rules
# ST-Link/V2
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="3748", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="374b", MODE="0666"# J-Link
SUBSYSTEM=="usb", ATTR{idVendor}=="1366", MODE="0666"

sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG plugdev $USER  # 将当前用户加入plugdev组
sudo reboot  # 重启生效

 WSL环境

 创建权限修复脚本

# 创建自动修复脚本
sudo vim /usr/local/bin/fix_usb_perms.sh

 将下述内容拷贝到新创建的脚本fix_usb_perms.sh 文件中

#!/bin/bash
# 修复所有 USB 设备权限
for dev in /dev/bus/usb/*/*; do[ -e "$dev" ] && sudo chmod 666 "$dev"
done

# 每次打开终端自动修复权限
echo "fix_usb_perms" >> ~/.bashrc

pyOCD 烧录固件

存储器地址映射

  Flash主存储区 (Main Flash Memory) : 0x0800 0000 - 0x0800 FFFF (64KB),存储用户程序(代码、常量数据),上电后默认从 0x0800 0000 开始执行;

pyOCD核心烧录指令

擦除指令 pyocd erase:清除芯片Flash存储区,支持三种模式

--chip: 全片擦除   --sector:按扇区擦除    --mass: 深度擦除

pyocd erase --target stm32f103rc --chip  # 长选项版本
pyocd erase -t stm32f103rc -c            # 短选项版本

烧录指令 pyocd load/pyocd flash: 将程序文件(Hex/Bin)写入 Flash

  • 烧录Hex文件
pyocd load 16进制文件名 --target stm32f103rc --erase sector #长选项版本
pyocd load 16进制文件名 -t stm32f103rc -e sector            #短选项版本
  • 烧录Bin文件
pyocd flash -a 0x08000000 -e sector -t stm32f103c8t6 二进制文件

复位指令 pyocd erase:重启目标芯片,使新程序生效

复位类型存在软件复位,硬件复位,系统复位,核心复位四种方式,--type sw 指定复位方式为软件复位,--type hw 指定复位方式为硬件复位;

pyocd reset --type sw --target stm32f103c8t6

辅助指令:

# 列出已连接的调试器
pyocd list --probes# 列出支持的芯片型号
pyocd list --targets

烧录测试

硬件连接

安装usbipd-win

wsl2 未提供 USB 设备的直接映射功能,无法直接访问本地Windows 的 USB 设备,Ubuntu 系统相当于远程服务器,若ST-Link 设备连接在本地 Windows 电脑上,而远程服务器 物理上不直接连接该设备,因此必然无法识别,所以需要将本地 Windows 的 USB 设备 跨网络共享给远程服务器,usbip 是一个 Linux 工具,允许通过网络共享 USB 设备,而 usbipd-win 是 Windows 版本的实现,usbipd-win 允许将 USB 设备从 Windows 主机共享到其他设备或虚拟机;

官网地址:https://github.com/dorssel/usbipd-win/releases

解决方案

Windows 端:      安装usbipd-win,将 ST-Link 设备共享为 IP 设备

远程 Ubuntu 端: 安装usbip工具,通过 IP 地址连接共享的 USB 设备

windows端安装usbipd-win

管理员身份运行Windows PowerShell,输入如下指令,若出现下载失败,启动 fq 软件即可;

winget install dorssel.usbipd-win

 下载结束之后以管理员身份重启Windows PowerShell, 按照如下步骤进行配置usbipd-win

# 功能: 列出当前系统上所有可用的USB设备
usbipd list

# 功能: 用于将本地 USB 设备注册到 USB/IP 守护进程(usbipd),使其能够通过网络被远程客户端访问
# --busid:指定待绑定的USB设备的总线ID,可通过usbipd list获得设备的总线IDusbipd bind --busid=<busid># usbipd bind --busid 2-2

# 查看usbipd的服务状态,判断况是否需要手动启动usbipd server
usbipd state

# 查看windows端的IP地址供后续使用
ipconfig

# 允许TCP 3240端口通过防火墙
New-NetFirewallRule -DisplayName "USBIPD" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 3240

 注意:保持当前PowerShell窗口运行,不要关闭此窗口

云服务器端安装

ubuntu系统中安装 usbip 客户端工具,无论是哪个版本的ubuntu系统,皆可按照此方案安装usbip,执行如下指令:

步骤一: ubuntu系统安装必要的编译工具和依赖库:

sudo apt update
sudo apt install -y build-essential libudev-dev libwrap0-dev libtool automake autoconf pkg-config hwdata

步骤二:克隆并编译linux-tools源码

# 获取内核源码, 进入到用户家目录, 解压源码
sudo apt install linux-source
cd ~
tar -xf /usr/src/linux-source-*.tar.bz2
cd linux-source-*/tools/usb/usbip

步骤三:进入源码目录(已进入 linux-source-*/tools/usb/usbip)后,执行以下命令生成编译配置文件

# 生成configure脚本
./autogen.sh

步骤四:采用configure 命令指定编译参数

# --with-tcp-wrappers=no 关闭TCP包装器
# --with-usbids-dir      指定 USB 设备数据库路径./configure --with-tcp-wrappers=no --with-usbids-dir=/usr/share/hwdata

步骤五:编译并安装

# 编译 -j$(nproc) 利用多核加速编译
make -j$(nproc) 
# 安装
sudo make install

步骤六:验证安装是否成功

usbip version

步骤七:扫描 Windows 主机的 USB 设备

查看ubuntu客户端ip地址

ifconfig

由于Ubuntu 客户端(ip: 192.168.0.24)与 Windows 服务器(ip: 192.168.3.30)之间存在网络层隔离,会导致无法通信,因此需要将 Windows 服务器 IP 修改为 192.168.0.XX(与 Ubuntu 同网段),子网掩码 255.255.255.0,网关 192.168.0.1

  • 打开控制面板,点击网络和Internet

  • 首先点击网络和共享中心,然后窗口左侧点击 “更改适配器设置”。

  • 在 "网络连接" 窗口中,找到当前使用的网络连接(如以太网或 Wi - Fi),右键点击该连接并选择 “属性;

  • 弹出的属性窗口中,找到 " Internet 协议版本 4(TCP/IPv4)",选中它并点击 "属性" 按钮;

  • 在 "IP 地址"字段中输入 "192.168.0.XX"(将 "XX" 替换为你指定的数字),IP 应设置为 192.168.0.2 ~ 192.168.0.254 之间的未被占用的地址在 "子网掩码" 字段中输入 "255.255.255.0",在 "默认网关" 字段中输入 "192.168.0.1",最后保存退出即可;
     


http://www.hkcw.cn/article/wlnDZRaLsb.shtml

相关文章

VR/AR 视网膜级显示破局:10000PPI 如何终结颗粒感时代?

一、传统液晶 “纱窗效应”&#xff1a;VR 沉浸体验的最大绊脚石 当用户首次戴上 VR 头显时&#xff0c;眼前密密麻麻的像素网格往往打破沉浸感 —— 这正是传统液晶显示在近眼场景下的致命缺陷。受限于 500-600PPI 的像素密度&#xff0c;即使达到 4K 分辨率&#xff0c;等效到…

【教学类-36-10】20250531蝴蝶图案描边,最适合大小(一页1图1图、2图图案不同、2图图案相同对称)

背景说明: 之前做了动物头像扇子(描边20),并制作成一页一套图案对称两张 【教学类-36-09】20250526动物头像扇子的描边(通义万相)对称图40张,根据图片长宽,自动旋转图片,最大化图片-CSDN博客文章浏览阅读1k次,点赞37次,收藏6次。【教学类-36-09】20250526动物头像…

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

印军高官为何指责83架光辉订单0交付 国产战机交付延迟

印度空军参谋长辛格在印度工业联合会举办的年度商业峰会上严厉批评本国的航空制造业,指出印度大型国防项目的落实没有如期进行,包括国产“光辉”战机在内的战斗机向空军交付均出现延迟。根据2021年与印度斯坦航空有限公司签订的价值4800亿卢比(约合404亿元人民币)的合同,印…

年轻人开始主动挂艾草了 老习俗焕发新活力

今年端午节当天,“年轻人开始主动挂艾草了”登上小红书APP热点榜首,截至晚上9点30分浏览量达到918万次。菜市场几块钱一把的野生艾草,在年轻人手中经过巧手改造,搭配菖蒲叶、玉簪叶、香樟果和铃铛,变成了身价百元的“祈福门挂”。如今,挂艾草不再只是简单的节庆习俗,而是…

Roguelike地牢:混沌系统与涌现式玩法设计

目录 Roguelike地牢:混沌系统与涌现式玩法设计引言第一章 地牢生成算法1.1 多级生成策略1.2 柏林噪声应用第二章 道具生态系统2.1 属性耦合模型2.2 道具稀有度系统第三章 敌人行为树3.1 自适应难度3.2 状态机设计第四章 永久死亡机制4.1 元进度系统4.2 遗产继承设计第五章 光照…

【数据集】基于累计分布函数匹配CDF Matching与多分辨率卡尔曼滤波MKF相结合的地表温度(2002-2020)

目录 数据概述一、输入数据二、生产流程与处理方法步骤一:生成被动微波LST数据(PMW LST)步骤二:CDF匹配提高高分辨率LST质量步骤三:多分辨率卡尔曼滤波(MKF)融合生成全时空覆盖LST三、模拟效果与实验结果四、生成空间完整全天候LST五、验证与精度评估数据下载下载方式1:…

探索Python中的Dask:高效处理大规模数据的利器

在当今数据驱动的时代&#xff0c;处理大规模数据集已成为许多领域的重要挑战。Python作为数据科学和机器学习领域的主流编程语言&#xff0c;虽然拥有NumPy和Pandas等强大的库&#xff0c;但在面对超出内存限制的大数据集时&#xff0c;这些工具往往显得力不从心。Dask作为一款…

DeepSeek 部署中的常见问题及解决方案

部署环境配置问题 硬件资源不足或兼容性问题可能导致部署失败。在部署前需要对计算资源进行全面评估&#xff1a; 硬件要求检查 CPU&#xff1a;至少4核处理器&#xff08;推荐8核以上&#xff09;&#xff0c;如Intel Xeon或AMD EPYC系列GPU&#xff08;如需&#xff09;&…

SpringBoot简单体验

1 Helloworld 打开&#xff1a;https://start.spring.io/ 选择maven配置。增加SpringWeb的依赖。 Generate之后解压&#xff0c;代码大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

[yolov11改进系列]基于yolov11引入大型分离卷积注意力模块LSKA减少计算复杂性和内存的python源码+训练源码

【LSKA介绍】 本文给大家带来一种超大核注意力机制的改进方法&#xff0c;尝试了多种改进方法。不仅速度快&#xff0c;而且还有不同程度的提升了精度&#xff01; 论文&#xff1a;《LSKA&#xff08;大可分离核注意力&#xff09;&#xff1a;重新思考CNN大核注意力设计》 h…

AI编程在BOSS项目的实践经验分享

前言 在人工智能技术革新浪潮的推动下&#xff0c;智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能&#xff0c;显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员&#xff0c;…

菜鸟之路Day36一一Web开发综合案例(部门管理)

菜鸟之路Day36一一Web开发综合案例&#xff08;部门管理&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.5.28 文章目录 菜鸟之路Day36一一Web开发综合案例&#xff08;部门管理&#xff09;一.环境搭建二.开发规范三.部门管理3.1查询3.2删除3.3新增3.3修改根据id来…

一周学会Pandas2之Python数据处理与分析-Pandas2数据合并与对比-df.compare():差异高亮

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili df.compare()&#xff1a;差异高亮 df.compare() 是 pandas 中用于 高效比较两个 DataFrame 差异 的方法&#xff0…

uniapp安卓App自定义相机(身份证相机)

效果图&#xff1a; 实现思路&#xff1a; 本人也是第一次做app的自定义相机功能&#xff0c;找了相关文章后&#xff0c;发现uniapp自带的相机组件是不能实现在app中自定义相机的功能&#xff0c;因为不支持。按照前辈们的思路&#xff0c;是使用uniapp中的live-pusher直播组…

【软件安装】非华为手机安装华为电脑管家(14.0.5.8 C233)(附带安装包下载地址)

前言 华为电脑管家是一款专为华为电脑用户设计的综合管理软件&#xff0c;提供了多种实用功能&#xff0c;旨在优化电脑性能并提升用户体验。其拥有以下特色功能&#xff1a; 互传功能&#xff1a; 快速传输&#xff1a;华为电脑管家支持与华为手机之间的快速文件传输。用户可…

明基RD280U编程显示器深度测评:码农的「第二块键盘」竟然会发光?

文章目录 前言一、开箱篇&#xff1a;当理工男遇到「俄罗斯套娃式包装」二、外观篇&#xff1a;深空灰的「代码容器」1. 桌面变形记2. 保护肩颈的人体工学设计 三、显示篇&#xff1a;给代码做「光子嫩肤」1. 28寸超大大屏 3:2屏比 4K超清2.专业编程模式&#xff0c;让代码一…

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒&#xff0c;周末玩电脑的时候突然电脑很卡&#xff0c;然后自动重启&#xff0c;奇怪&#xff0c;之前没出现这个情况。 重启后电脑开机等了几十秒&#xff0c;打开任务管理器查看开机进程&#xff0c;果然发现有个Synaptics Po…

给出一个基于 ESP32(Espressif ESP-IDF)来连接并向蓝牙耳机发送音频的方案示例。该方案的核心思路是让 ESP32 充当「A2DP Source」(与手机类似)

下面给出一个基于 ESP32&#xff08;Espressif ESP-IDF&#xff09;来连接并向蓝牙耳机发送音频的方案示例。该方案的核心思路是让 ESP32 充当「A2DP Source」&#xff08;与手机类似&#xff09;&#xff0c;而蓝牙耳机则是「A2DP Sink」。这样&#xff0c;ESP32 能够像手机一…