Makefile与现代构建工具:探索STM32F103在Linux下的构建演进之路

ubuntu linux下建立stm32开发环境: GCC安装以及工程Makefile建立 买了一个STM32开发板,却不想在window下开发,也不想用那么占内存的IAR MDK等软件,所以决定在ubuntu下建立该开发环境,像之前avr linux一样,找了下资料,国内有人做过,但都没有很详尽的教程,所以花了三四天才完成.其实原理很简单,就是安装适用与STM32的GCC,以及建立该工程,主要是Makefile加上STM32的官方库. 阅读详情

Makefile与现代构建工具:探索STM32F103在Linux下的构建演进之路

在嵌入式开发领域,构建系统的选择往往决定了项目的可维护性和开发效率。对于STM32F103这样的经典微控制器,传统的Makefile已经服务了开发者多年,但随着项目复杂度提升和团队协作需求增加,现代构建工具如CMake和xmake开始展现出独特优势。本文将深入分析这三种构建方案在Linux环境下的实际表现,帮助中高级开发者做出更明智的技术选型。

1. 构建系统的设计哲学与演进脉络

构建工具的本质是自动化代码编译和链接过程,但不同工具背后的设计理念却大相径庭。Makefile作为最古老的构建工具之一,其核心思想是基于文件依赖关系和时间戳的增量构建。一个典型的STM32 Makefile包含编译器定义、源文件列表、编译选项和链接脚本,这些元素共同构成了项目的构建骨架。

然而,传统Makefile在跨平台支持和依赖管理方面存在明显短板。当项目需要支持多种芯片型号或开发环境时,维护多个Makefile变体变得异常繁琐。这正是现代构建工具发力的重点领域——CMake通过抽象的生成器概念,能够为不同平台生成原生构建文件;而xmake则强调极简配置和内置依赖管理,试图提供更一体化的解决方案。

从技术演进角度看,构建工具的发展经历了三个阶段:

  • 手工编译阶段:开发者手动输入冗长的编译命令
  • 脚本自动化阶段:Makefile提供基础自动化能力
  • 元构建系统阶段:CMake/xmake等工具生成平台特定的构建文件

这种演进反映了嵌入式开发从单兵作战向团队协作、从小型项目向复杂系统发展的必然趋势。

2. Makefile在STM32开发中的经典实践

对于许多资深嵌入式开发者来说,Makefile仍然是首选工具,因为它提供了无与伦比的透明度和控制力。下面是一个优化后的STM32F103 Makefile核心配置:

# 工具链配置
CROSS_COMPILE = arm-none-eabi-
CC = $(CROSS_COMPILE)gcc
OBJCOPY = $(CROSS_COMPILE)objcopy
SIZE = $(CROSS_COMPILE)size

# 编译选项
CPU_FLAGS = -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
CFLAGS = $(CPU_FLAGS) -Os -ggdb -Wall -ffunction-sections -fdata-sections
LDFLAGS = $(CPU_FLAGS) -Wl,--gc-sections -T$(LINKER_SCRIPT)

# 自动收集源文件
SRCS = $(wildcard src/*.c) $(wildcard lib/*.c)
OBJS = $(SRCS:.c=.o)

# 模式规则定义
%.o: %.c
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

这种配置的优势在于极简的依赖要求——只需要基本的make工具和GCC工具链即可开始开发。对于个人项目或小型团队,这种简单性具有很大吸引力。

Makefile的核心优势:

  • 极致轻量:无需额外依赖,构建过程完全透明
  • 高度可控:每个构建步骤都可自定义和调试
  • 学习价值:深入理解编译链接过程的最佳途径

但它的局限性也很明显:

  • 跨平台支持薄弱,需要在不同系统上手动调整路径和工具链
  • 依赖管理需要手工维护,容易出现遗漏或冲突
  • 项目规模扩大后,Makefile复杂度呈指数级增长

实践提示:使用bear工具可以自动生成compile_commands.json,为基于Makefile的项目提供IDE兼容性支持,这对代码补全和静态分析极其有用。

3. CMake:工业级构建解决方案

CMake通过抽象层概念解决了Makefile的跨平台问题。它不直接执行构建,而是生成特定平台的构建文件(Unix Makefiles、Ninja、Visual Studio等)。这种设计使得CMake成为大型项目和商业产品的首选。

3.1 CMake基础配置

创建一个典型的STM32 CMake项目需要定义工具链文件和项目配置:

# CMakeLists.txt 主要内容
cmake_minimum_required(VERSION 3.12)
project(STM32F103_Project LANGUAGES C ASM)

# 设置工具链
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR cortex-m3)

# 添加可执行文件
add_executable(${PROJECT_NAME}
    src/main.c
    src/system_stm32f10x.c
    startup/startup_stm32f10x_hd.s
)

# 设置编译选项
target_compile_options(${PROJECT_NAME} PRIVATE
    -mcpu=cortex-m3 -mthumb -mfloat-abi=soft
    -Os -ffunction-sections -fdata-sections
)

target_link_options(${PROJECT_NAME} PRIVATE
    -T${CMAKE_SOURCE_DIR}/linker_scripts/stm32f103c8tx.ld
    -specs=nosys.specs -Wl,--gc-sections
)

3.2 CMake高级特性

CMake的真正威力体现在其模块化系统和包管理能力上。通过find_package和现代CMake的目标概念,可以创建高度可重用的组件:

# 创建库目标
add_library(STM32F10x_StdPeriph_Driver STATIC
    lib/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c
    lib/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c
)

target_include_directories(STM32F10x_StdPeriph_Driver PUBLIC
    lib/STM32F10x_StdPeriph_Driver/inc
)

# 主目标使用库
target_link_libraries(${PROJECT_NAME} PRIVATE
    STM32F10x_StdPeriph_Driver
)

CMake还原生支持单元测试、安装规则和打包功能,这些对企业级开发至关重要。

4. xmake:新兴的现代化构建工具

xmake是一个相对较新的构建工具,试图吸取Makefile和CMake的优点,同时提供更简洁的配置语法和内置的依赖管理。它的设计哲学是"一切皆代码",使用Lua语法进行配置。

4.1 xmake基础配置

-- xmake.lua 基础配置
set_project("STM32F103_Project")
set_toolchains("arm-none-eabi-gcc")

add_rules("mode.debug", "mode.release")

target("STM32F103_Project")
    set_kind("binary")
    add_files("src/*.c")
    add_files("startup/startup_stm32f10x_hd.s")
    add_includedirs("include", "lib/STM32F10x_StdPeriph_Driver/inc")
    
    add_toolchains("arm-none-eabi-gcc")
    add_cxflags("-mcpu=cortex-m3 -mthumb -mfloat-abi=soft")
    add_ldflags("-Tlinker_scripts/stm32f103c8tx.ld")
    add_ldflags("-specs=nosys.specs -Wl,--gc-sections")

4.2 xmake的依赖管理

xmake的突出特点是内置的包管理系统,可以自动处理第三方依赖:

add_requires("stm32cubef1", {configs = {driver_only = true}})

target("STM32F103_Project")
    set_kind("binary")
    add_packages("stm32cubef1")
    -- 其他配置...

这种设计极大简化了依赖管理,特别是对于快速原型开发和小型团队。

5. 构建工具选型策略与实践建议

选择构建工具不是技术竞赛,而是基于项目需求和团队背景的理性决策。以下对比表格总结了三种工具的关键特性:

特性MakefileCMakexmake
学习曲线陡峭中等平缓
跨平台支持有限优秀良好
依赖管理手动通过模块内置
生态集成基础丰富成长中
配置复杂度高中低
企业应用较少广泛新兴

5.1 选择指南

选择Makefile当:

  • 项目规模小,只有少数几个文件
  • 需要极致的构建过程控制
  • 团队对Makefile有深厚经验
  • 开发环境相对固定

选择CMake当:

  • 项目需要支持多种IDE和构建系统
  • 有复杂的依赖关系和组件结构
  • 项目可能长期维护和扩展
  • 需要与CI/CD系统深度集成

选择xmake当:

  • 追求配置简洁和开发效率
  • 需要内置的包管理功能
  • 项目跨平台但不需要支持Visual Studio
  • 团队偏好"约定优于配置"的理念

5.2 迁移策略

对于已有Makefile项目,迁移到现代构建工具可以采取渐进策略:

  1. 保留现有Makefile,但添加CMake/xmake配置作为替代方案
  2. 逐步迁移模块,先从不重要的组件开始试验
  3. 并行运行两种构建系统,确保功能一致性
  4. 培训团队成员掌握新工具的基本概念

我在多个实际项目中发现,混合使用构建工具往往能发挥各自优势。例如,使用Makefile管理底层芯片支持包,而用CMake管理应用层代码。

6. 高级技巧与最佳实践

无论选择哪种工具,一些通用原则都能显著提升构建体验:

6.1 构建性能优化

# 使用Ninja代替Make加速构建
cmake -G Ninja -B build
cd build && ninja

# 利用ccache缓存编译结果
export CC="ccache arm-none-eabi-gcc"
export CXX="ccache arm-none-eabi-g++"

6.2 依赖管理进阶

对于复杂项目,可以考虑使用Git子模块或CMake的FetchContent管理依赖:

# 使用FetchContent集成第三方库
include(FetchContent)
FetchContent_Declare(
    stm32_stdperiph
    GIT_REPOSITORY https://github.com/stdperiph/stm32f10x_stdperiph_lib
    GIT_TAG        v3.6.0
)
FetchContent_MakeAvailable(stm32_stdperiph)

6.3 自动化与CI集成

现代构建工具都能很好地集成到CI/CD流水线中。以下是一个GitHub Actions配置示例:

name: STM32 Build
on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Install Toolchain
      run: |
        sudo apt-get update
        sudo apt-get install gcc-arm-none-eabi
    - name: Configure and Build
      run: |
        cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/arm-gcc-toolchain.cmake
        cmake --build build --parallel

构建系统的选择没有绝对正确答案,只有最适合特定项目和团队的方案。在我经历过的多个STM32项目中,最初都从简单的Makefile开始,但随着团队扩大和需求复杂化,逐步迁移到CMake带来了明显的协作效率提升。关键是要保持构建配置的清晰和可维护性,避免过度工程化,确保每个团队成员都能理解和维护构建过程。

Linux 环境下 STM32 开发:从工具链到 VSCode 高效调试 本文详细介绍了在Linux环境下进行STM32开发的完整工具链配置与VSCode高效调试方法。从ARM GCC交叉编译工具链安装、OpenOCD配置到VSCode插件设置,提供了实战经验分享和常见问题解决方案,帮助开发者提升嵌入式开发效率。 阅读详情

相关推荐

STM32裸机开发:基于GCC工具链的环境搭建与Makefile实战

在嵌入式系统开发中,编译工具链是连接源代码与硬件执行的关键桥梁。GCC(GNU Compiler Collection)作为一款开源、跨平台的编译器集合,其工作原理是将C/C++等高级语言通过预处理、编译、汇编、链接等阶段,最终生成目标处理器可执行的二进制文件。掌握GCC工具链,特别是针对ARM Cortex-M内核的arm-none-eabi-gcc,不仅能实现对编译过程的精细控制,还能深入理解代码优化、内存布局等底层机制,这对于追求代码尺寸、性能及可移植性的嵌入式项目具有重要价值。在常见的应用场景中,如

weixin_33928137的博客 320

linux环境下stm32f103,Linux下使用STM32F103C8

ubuntu18.04.1(x64) 使用STM32F103C81.板子使用JLINK烧写程序,需要先安装JLINK驱动(V9)JLinkExe会用到libreadline库,所以得把libreadline库装上。http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html 中Current Status选择下载,并安装,如下所示:1234tar ...

weixin_42381087的博客 1981

VSCode+STM32CubeMX+GCC构建现代嵌入式开发环境实战

嵌入式开发是物联网和智能设备的核心技术领域,其开发环境的选择直接影响工程效率和质量。传统IDE如Keil虽然入门简单,但在代码管理、团队协作和工具集成方面存在局限。现代开发理念强调模块化工具链和工程化实践,通过VSCode的丰富插件生态、STM32CubeMX的图形化配置和ARM GCC开源工具链,可以构建高效可定制的开发环境。这种方案不仅支持FreeRTOS等实时操作系统,还能实现版本控制、静态分析和持续集成等软件工程最佳实践。对于STM32开发者而言,从单一IDE转向模块化工具集是工作流的重大升级,能够

weixin_33857679的博客 630

基于Linux系统的stm32f103开发构建

├── build #构建中间文件存放 ├── include #头文件包含位置 ├── src #源文件位置 ├── startup #启动文件*.s *.ld位置 └── STM32F10x_StdPeriph_Lib_V3.6.0 #ST标准库位置 ├── _htmresc。

m0_62478299的博客 1779

STM32F103_uCLinux_BOOT.zip

这是基于STM32F103_uCLinux_BOOT资料,下载后可直接使用,如果大家有什么问题的话,欢迎大家提问交流!!!

在STM32F10x大容量产品上移植uClinux(英文)

在STM32F10x大容量产品上移植uClinux,官方英文版文档

STM32F103 ucLinux开发之四(内核启动后的调试)

Stm32-uclinux启动后的调试 1、 修改__pfn_to_page使得能够启动 根据STM32F103 ucLinux开发之三(内核启动后不正常)的描述,内核无法启动是选择了平板内存模式后,下面两个宏定义,导致计算错误,从而Backtrace的。 #define __pfn_to_page(pfn) (mem_map + ((pfn) - ARCH_PFN_OFFSET)...

weixin_30735391的博客 468

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 5002

STM32学习指南之Linux开发环境搭建

家目录根据自己实际情况进行修改。

Frank_Miya的博客 5973

给宇树Go2机器人装‘眼睛’:在Jetson Orin Nano上从零部署YOLOv5的保姆级避坑实录

本文详细介绍了在Jetson Orin Nano上为宇树Go2机器人部署YOLOv5视觉系统的完整流程,涵盖硬件选型、环境配置、模型优化及系统集成等关键步骤。针对机器人应用场景特有的离线部署、版本冲突和实时推理等挑战,提供了实用的解决方案和性能优化技巧,帮助开发者快速实现机器人的视觉能力升级。

weixin_29169505的博客 380

Silvaco TCAD | GaN HEMT器件仿真与高频功率应用实战

本文详细介绍了使用Silvaco TCAD进行GaN HEMT器件仿真的全流程,涵盖器件结构设计、极化效应建模、高频特性分析及功率损耗优化。通过实战案例展示了GaN HEMT在电动汽车电驱和快充模块等高频功率应用中的性能优势与效率提升策略,为工程师提供可靠的仿真方法与设计验证手段。

desk3的博客 184

嵌入式Linux裸机开发笔记(IMX6ULL)—ARM汇编基础

Cortex-A 芯片一上电 SP 指针还没初始化,C 环境还没准备好,C 语言中的函数调用涉及到出栈入栈,出栈入栈就要对堆栈进行操作,所谓的堆栈其实就是一段内存,由 SP 指针访问,SP 指针指向栈顶。本次笔记讲述了学习汇编的必要性,以及简单介绍了GNU大致语法和几种常见的汇编指令,还有很多不常用的指令没有记录到,但已经可以满足嵌入式裸机开发的基本需求了,本笔记单纯是个人在学习过程的知识复习回顾和总结,部分内容提炼于某些教程,本次笔记只记录一些个人使用到的常见汇编指令,希望可以帮助到有需要的小伙伴

qq_55730568的博客 1119

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析

现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类和way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C

weixin_30263073的博客 624

从零到一:在Linux上打造你的STM32F103嵌入式开发工作流

本文详细介绍在Linux环境下搭建STM32F103嵌入式开发工作流的完整流程,涵盖arm-none-eabi-gcc工具链配置、Makefile工程构建、OpenOCD调试烧录等核心环节。通过开源模板和实用技巧,帮助开发者摆脱IDE依赖,实现高效命令行开发,提升对嵌入式系统底层机制的理解。

desk3的博客 676

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8934

R语言vegan包实战:用varpart函数搞定生态学VPA分析(附完整代码与数据集)

本文详细介绍了如何使用R语言vegan包中的varpart函数进行生态学方差分解分析(VPA),包括数据准备、模型构建、结果解读和可视化呈现。通过完整的代码示例和数据集,帮助研究者理解不同环境因子对生物群落变化的相对贡献,并掌握显著性检验等高级技巧。

weixin_42525005的博客 450

Linux环境下基于Makefile与arm-none-eabi-gcc的STM32F103标准库工程编译实战

本文详细介绍了在Linux环境下使用Makefile和arm-none-eabi-gcc工具链编译STM32F103标准库工程的完整流程。从环境搭建、工程结构配置到Makefile编写与优化,提供了实战指南和常见问题解决方案,帮助开发者高效进行嵌入式开发。

l1k9j8h7g6的博客 670

【SOC估算】基于EKF与神经网络融合的锂电池SOC高精度估计及Matlab实现

本文探讨了基于EKF与神经网络融合的锂电池SOC高精度估计方法。通过结合扩展卡尔曼滤波(EKF)的模型驱动优势和神经网络的数据驱动学习能力,实现了对电池荷电状态(SOC)的精准预测。Matlab仿真验证了该混合算法在各种工况下均能显著降低估计误差,提升电池管理系统性能。

play7的博客 697

Linux环境中,使用Makefile来编译标准库STM32工程 ---- STM32F103C8T6

Linux环境中,使用Makefile来编译标准库STM32工程 ---- STM32F103C8T6

weixin_65437579的博客 1969

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 370

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux下STM32开发(2)——简单工程编写、编译与下载(Makefile)

一、需要的文件: (1)启动文件:startup_stm32f10x_hd.s (2)链接文件:stm32_flash.ld (3)c源码文件:main.c (4)头文件:stm32f10x.h (5)Makefile 打开下载的标准库:STM32F10x_StdPeriph_Lib_V3.5.0,因为truestudio使用的是gcc编译器,所以我们使用其文件夹的文件。 二、启动文件 所在目录:STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CM.

丨晋丨 4815

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

自用的STM32F103和STM32F407 makefile工程模版

STM32 GCC 编译模版 作者 ———— Ertuil github地址: https://github.com/andytt/stm32_template 介绍 这里是我在Mac环境上使用 gcc-arm-none-eabi编译时候,使用的模版。其中包含了一个makefile,可以编译、烧写stm32程序。 有三个框架分别支持:stm32F103R8T6、stm32F40...

Ertuil的博客 3140

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从零构建:Linux下STM32开发的工具链生态全景解析

本文全面解析了在Linux环境下从零构建STM32开发工具链的完整生态,涵盖GCC ARM编译器、OpenOCD调试器和Makefile自动化构建等核心组件。详细探讨了工具链配置优化、高级调试技巧、工程管理实践以及性能优化策略,帮助开发者获得对嵌入式开发全流程的完全掌控,提升开发效率与代码质量。

2w3e4r5t6y的博客 720

利用STM32CubeMx创建关于RT-Thread的Makefile工程

利用STM32CubeMx创建关于RT-Thread的Makefile工程 步骤利用STM32CubeMx创建关于RT-Thread的Makefile工程一、序言二、搭建环境三、开始建立工程四、修改Makefile五、修改链接文件总结 一、序言 说到为什么要建立Makefile工程,还要从我的老年机(PC)说起,实在是有点跟不上了。于是我换了ArchLinux系统,开始向Linux系统迈进,开始学...

Ythlee的博客 2578

linux+makefile向STM32移植FreeRTOS

linux+makefile向STM32移植FreeRTOS 前期准备: ubuntu或者虚拟机 stm32f103c8t6最小系统板 FreeRTOS官方文件 stm32f103c8t6的开发环境 stm32官方固件库 FreeRTOS的准备和修改: FreeRTOS的源文件从官方网站下载就行。 1、解压到ubuntu里之后进入FreeRTOS/Source/portable发现里面有一大堆...

qq_33161479的博客 2419

Linux下开发STM32:使用gcc-arm-none-eabi工具链编译生成bin、hex文件

1.为什么不是gcc在开发stm32的时候,编译工具链要使用gcc-arm-none-eabi,为什么不是gcc呢?这就要说到linux下的交叉编译了,因为我们要在PC机...

strongerHuang 2万+
上一篇: 避坑指南:nRF Connect SDK 3.2.0 安装过程中的常见网络与环境配置陷阱
下一篇: FPGA实现5位有符号定点原码乘法器:移位加与阵列结构性能对比与Quartus仿真
ruby5
博客等级 码龄15年 29粉丝 893原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值