在VMware中ubuntu22.04中安装libusb, 在vscode中使用Remote-SSH远程打开ubuntu22.04中的文件进行开发。
sudo apt install openssh-server
"tasks": [
"type": "cppbuild",
"label": "vscode_build",
"command": "/usr/bin/gcc",
"args": [
"${workspaceFolder}/*.c",
"-lusb-1.0",
"-g",
"-o",
"${workspaceFolder}/${workspaceFolderBasename}"
"options": {
"cwd": "${workspaceFolder}"
"problemMatcher": [
"$gcc"
"group": {
"kind": "build",
"isDefault": true
"detail": "调试器生成的任务。"
"label": "make_build",
"type": "shell",
"command": "make",
"isBackground": false,
"version": "2.0.0"
"version": "0.2.0",
"configurations": [
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/os.elf",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "make_build",
"setupCommands": [
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
# 指定头文件的路径
INCS_DIR := .
# 指定源文件的路径
SRC_DIR := .
# 指定目标名
TARGET := os
# 指定编译器前缀
CROSS_COMPILE :=
LINK_SCRIPT :=
# 指定编译选项
# CFLAGS := -march=rv32i -mabi=ilp32 -save-temps=obj -g -O0 -Wall -nostdlib -nostdinc -mcmodel=medany -fno-PIE -fomit-frame-pointer
CFLAGS := -g
.PHONY : all clean rebuild
include config.mk
# 指定源文件后缀
SRCS_SUFFIX := .c .S
#指定头文件的后缀
INCS_SUFFIX := .h
# 指定依赖文件后缀
DEPS_SUFFIX := .dep
# 指定编译后的目标文件的后缀
OBJS_SUFFIX := .o
# 指定编译生成文件的的根目录名
BUILD_ROOT := build
# 编译要生成的文件夹
BUILD_DIR := $(addprefix $(BUILD_ROOT)/,$(SRC_DIR))
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
SIZE := $(CROSS_COMPILE)size
CFLAGS += -I $(INCS_DIR)
MKDIR := mkdir
RM := rm -rf
# 路径搜索仅在变量规则解析阶段(比较文件的时间戳,是否存在。。。)起作用,定义变量时不起作用
#VPATH := $(INC_DIR) $(SRC_DIR)
define SRC_PATH_DIR
vpath %$(1) $(SRC_DIR)
endef
define INC_PATH_DIR
#vpath %$(1) $(INCS_DIR)
endef
$(foreach suffix,$(SRCS_SUFFIX),$(eval $(call SRC_PATH_DIR,$(suffix))))
$(foreach suffix,$(INCS_SUFFIX),$(eval $(call INC_PATH_DIR,$(suffix))))
#vpath %$(INCS_SUFFIX) $(INCS_DIR)
SRCS := $(foreach dir,$(SRC_DIR),$(foreach suffix,$(SRCS_SUFFIX),$(wildcard $(dir)/*$(suffix))))
DEPS := $(addprefix build/,$(addsuffix $(DEPS_SUFFIX),$(basename $(SRCS))))
OBJS := $(DEPS:$(DEPS_SUFFIX)=$(OBJS_SUFFIX))
TARGET_BASENAME := $(basename $(TARGET))
all : $(BUILD_ROOT)/$(TARGET)
$(BUILD_ROOT)/$(TARGET) : $(OBJS)
# $(CC) $(LFLAGS) -o $@ $^ -Map $(BUILD_ROOT)/$(TARGET_BASENAME).map
$(CC) $(CFLAGS) $(LINK_SCRIPT) -o $@ $^ -lusb-1.0 -Wl,-Map,$(BUILD_ROOT)/$(TARGET_BASENAME).map
$(OBJCOPY) $@ -O binary $(BUILD_ROOT)/$(TARGET_BASENAME).bin
$(OBJDUMP) -D $@ > $(BUILD_ROOT)/$(TARGET_BASENAME).dis
$(SIZE) $@
# include行为:
# 首先检查此文件是否存在,如果不存在,会检查是否有创建此文件的规则并执行,执行成功后重新include此文件。
# 如果文件存在,依旧检查规则,查看文件是否需要更新,如果要更新,更行后重新include。
# 总结:include行文发生在make读取文件阶段,make会检查include的文件是否存在,且是否是最新的,include总是会包含最新的文件。
include $(DEPS)
$(OBJS) :
$(CC) -c $(CFLAGS) -o $@ $<
config.mk :
$(error @请提供config.mk文件)
# ;所连接的命令将在一个shell进程中执行。
# set -e 指定发生错误后立即退出执行
$(foreach dir,$(BUILD_DIR),$(dir)/%$(DEPS_SUFFIX)) : %.c | $(BUILD_DIR)
@set -e; \
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,$(dir $@)\1.o $@ : ,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
$(foreach dir,$(BUILD_DIR),$(dir)/%$(DEPS_SUFFIX)) : %.S | $(BUILD_DIR)
@set -e; \
$(CC) -M $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,$(dir $@)\1.o $@ : ,g' < $@.$$$$ > $@; \
$(RM) $@.$$$$
$(BUILD_DIR) :
@$(MKDIR) -p $@
clean :
$(RM) $(BUILD_ROOT)
windows原生支持了linux子系统wsl2,我在wsl2中安装了一个ubuntu22.04,使用方法基本与vmware中安装的一致(libusb的编译和安装,tasks.json,launch.json ,Makefile均一致 本章仅介绍不同之处),配合vscode中的wsl插件,个人认为比vmware更加方便。
安装方法网上有很多, 可以参考这篇文章 https://zhuanlan.zhihu.com/p/466001838
-
点击桌面图标启动
-
在shell中直接输入wsl启动
-
- 安装 wsl插件
- wsl插件的使用
wsl插件使用方法很简单,在wsl ubuntu的工作目录中直接输入 code . 命令,即可打开当前目录。
MinGW 的全称是:Minimalist GNU on Windows 。是将经典的开源 C语言 编译器 GCC 移植到了 Windows 平台下,因此可以将源代码编译为可在 Windows 中运行的可执行程序。而且还可以使用一些 Windows 不具备的,Linux平台下的开发工具。一句话来概括:MinGW 就是 GCC 的 Windows 版本 。
"tasks": [
"label": "make_build",
"type": "shell",
"command": "make",
"options": {
"shell": {
"executable": "C:\\msys64\\ucrt64.exe",
"args": []
"isBackground": false,
"problemMatcher": [],
"presentation": {
"group": "my-group"
"version": "2.0.0"
"version": "0.2.0",
"configurations": [
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\build\\os",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\msys64\\usr\\bin\\gdb.exe",
"logging":{"engineLogging":true},
"preLaunchTask": "make_build",
"setupCommands": [
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
关于libusb-win32开发的经验(2012-11-10 11:37:50)转载▼标签: win32rs232驱动usblibusbit 分类: 外围器件接口
作为设备开发者, 一般需要让设备与上位机PC通讯, 我们往往考虑采用以下几种接口: rs232, USB, ethernet.
现在在PC机上已经很难见到rs232的接口, 而ethernet也需要做特殊的配置, USB大多成为我们的首选. 对于数据偏少的应用, 我们可以利用USB虚拟串口的方式来完成这样的任务, 虚拟串口的驱动和实例, 对于下位机来说也非常常见. 有个问题: 很多应用无法用虚拟串口的方式来得到满足, 只能按照USB的方式来解决问题. 这个时候, 我们只好针对USB进行编程. 对于复杂的驱动编程, 大多数程序员往往望而却步. 不过总有其他简单的方法解决问题. 这里, 我们介绍一个USB通讯库: libusb.
libusb是一个针对usb通讯的库. 使用它, 你不需要知道操作系统的细节, 你只需要对USB有足够的了解即可. 它也不需要你写驱动, 所有的工作都可以在用户态完成. 使用方法很简单, 这里有一个示例: http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32_documentation#IV.Examples , 是不是很简单?
libusb自己带有一个内核驱动, 名字叫libusb0.sys, 放在WINDOWSSYSTEM32DRIVERS里面. 用户程序调用libusb0.dll, dll会把任务交由驱动来完成. 这样保证用户态就能够完成USB通讯的作业.
具体做了什么, 可以通过下载项目的源文件来了解, 等我有时间的时候再看看吧.
安装方法
libusb现在有好几个版本. 主页面在这里: http://www.libusb.org/
因为我们一般是进行工程应用, 选择相对稳定的版本: libusb-0.1.
平台在windows下的话, 我们采用libusb-win32: http://www.libusb.org/wiki/libusb-win32
linux下一般已经添加到源里面去了, 查找libusb即可.
windows下安装方法: http://www.libusb.org/wiki/libusb-win32#Installation
里面有2种安装方式, Filter Driver Installation 和 Device Driver Installation, 前面一个可以说是开发环境, 后面可以说是发布驱动本身. 我们因为是做系统, 选择前面一个方式, 省得麻烦.
这里有比较详细的文档: http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32_documentation
libusb-win32的下载地址http://sourceforge.net/apps/trac/libusb-win32/wiki
开发者论坛地址:http://libusb.6.n5.nabble.com/
libusb-1.0 API Reference:http://libusb.sourceforge.net/api-1.0/
开发过程中有超时问题的原因:http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32_documentation
首先声明,这是看到国外论坛上的学习文章后,独立翻译过来作为笔记用,加入部分自我理解,并且全部原创。
libusb是一个开源库,可以帮助开发者在用户空间的层面上与UBS设备进行通讯。如果想了解更多,可以查看他们的主页:http://libusb.org/
在其文档中,建议首先阅读USB2的规格说明:http://www.usb.org/developers/docs/,这可以帮助真正地
libusb的使用教程
文章目录libusb的使用教程一 libusb 介绍二 libusb 的外部接口2.1 初始化设备接口2.2 操作设备接口2.3 控制传输接口2.4 批传输接口2.5 中断传输接口3 Libusb库的使用3.1 find设备3.2 打开设备3.3 读写设备和操作设备3.4 关闭设备
Linux 平台上的usb驱动开发,主要有内核驱动的开发和基于libusb的无驱设计。
对于内核驱动的大部分设备,诸如带usb接口的hid设备,linux本身已经自带了相关的驱动,我们只要操作设备文件便
要在Linux上安装libusb库,请按照以下步骤进行:
1. 打开终端,并使用适用于您的Linux发行版的包管理器搜索libusb软件包。例如,在Debian或Ubuntu上,可以使用apt-get命令:
sudo apt-get update
sudo apt-get install libusb-1.0-0-dev
在其他Linux发行版上,您可能需要使用不同的包管理器(如yum、dnf、zypper等)进行安装。请根据您的发行版文档或官方网站上的指示进行操作。
2. 安装完成后,您可以使用pkg-config命令来获取libusb的相关编译和链接选项。在终端中执行以下命令:
pkg-config --libs --cflags libusb-1.0
该命令将输出libusb库的编译和链接选项,包括头文件路径和库文件路径。
3. 确保您的编译环境正确配置了这些选项。例如,在使用gcc编译C代码时,可以像这样使用pkg-config输出的选项:
gcc -o myprogram myprogram.c `pkg-config --libs --cflags libusb-1.0`
完成上述步骤后,您应该成功安装了libusb库,并可以在您的Linux系统中使用它。如果您在安装过程中遇到任何问题,请参考您的Linux发行版文档或官方网站,或者提供更多详细信息以获取更准确的帮助。