工具链的一些杂知识

MDK介绍及其使用

一文教你使用MDK开发工具-CSDN博客

MDK、KEIL、uVision 之间的区别

MDK( Microcontroller Development Kit ),也称 MDK-ARM 、KEIL MDK、KEIL For ARM,都是同一个东西。ARM 公司现在统一使用 MDK-ARM 的称呼,MDK 的设备数据库中有很多厂商的芯片,是专为微控制器开发的一款工具,为满足基于 MCU 进行嵌入式软件开发的工程师需求而设计,支持 ARM7,ARM9,Cortex-M4/M3/M1,Cortex-R0/R3/R4 等 ARM 微控制器内核。KEIL 是公司的名称,有时候也指 KEIL 公司的所有软件开发工具。Keil 公司在2005年被 ARM 公司收购。

uVision 是 KEIL 公司开发的一个集成开发环境(IDE)。它包括工程管理,源代码编辑,编译设置,下载调试和模拟仿真等功能,uVision 有 uVision2、uVision3、uVision4 和 uVision5 四个版本,目前最新的版本是 uVision5。它提供一个环境,让开发者易于操作。uVision 通用于 KEIL 的开发工具中,例如 MDK,PK51,PK166,DK251等。

armclang

就是俗称的AC6 armclang是ARM公司提供的一款C/C++编译器,专门用于为ARM架构的处理器生成高性能代码。该编译器通常与ARM的其他工具链一起使用,适合嵌入式系统开发。

请注意,确保在项目中使用合适的工具和版本,并根据需求查阅最新的文档。

OpenOCD

跟我一起学OpenOCD(一) - 知乎 (zhihu.com)

OpenOCD是一个开源的调试/编程工具,主要用于嵌入式系统,它支持多种硬件设备和调试协议,如JTAG和SWD。它通常与GNU工具链结合使用,可以为开发人员提供硬件调试和烧录固件的功能。

Ozone

Ozone使用介绍-基础功能 - 开发环境 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

MinGW

mingw 是一个为 Microsoft Windows 平台编译和运行 Unix 程序的工具套装,它提供了类似于 Unix 环境下的编译器、链接器等工具,以便在 Windows 平台上开发使用 GCC(GNU 编译器集合)和其他开源 Unix 工具的软件。

LLVM

LLVM基本概念入门 - 知乎

来自于百度百科的解释

  • LLVM 命名最早源自于底层虚拟机(Low Level Virtual Machine)的缩写,由于命名带来的混乱,LLVM就是该项目的全称。LLVM 核心库提供了与编译器相关的支持,可以作为多种语言编译器的后台来使用。能够进行程序语言的编译器优化、链接优化、在线编译优化、代码生成。LLVM的项目是一个模块化和可重复使用的编译器和工具技术的集合。

现在的LLVM是一个编译器框架。LLVM作为编译器框架,是需要各种功能模块支撑起来的,你可以将clang和lld都看做是LLVM的组成部分,框架的意思是,你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能,或者就单纯自己开发软件工具,而利用LLVM来支撑底层实现。LLVM由一些库和工具组成,正因为它的这种设计思想,使它可以很容易和IDE集成(因为IDE软件可以直接调用库来实现一些如静态检查这些功能),也很容易构建生成各种功能的工具(因为新的工具只需要调用需要的库就行)

arm-none-eabi-gcc

arm-none-eabi-gcc 是一个专为 ARM 架构的嵌入式系统设计的 GCC 编译器版本。它可以生成裸机代码,适用于没有操作系统的应用程序。开发者常用它来编译针对 ARM Cortex 和其他 ARM 设备的软件。

arm-none-eabi-gcc 和 armclang的区别

arm-none-eabi-gcc 和 armclang 是两种不同的编译工具链,主要用于嵌入式系统中基于 ARM 处理器的代码编译。它们之间存在一些关键的区别,以下是它们各自的特点及区别的简要概述:

  1. 开发者和背景

    • arm-none-eabi-gcc: 是 GNU 编译器集合(GCC)的一个变体,专门用于 ARM 处理器。这个工具链是开源的,由 GNU 项目支持。
    • armclang: 是 ARM 公司推出的编译器,属于 ARM Compiler 工具链的一部分。ARM Compiler 6及更高版本基于开源的 LLVM/Clang 技术,但包含许多 ARM 提供的专有优化和扩展。
  2. 编译技术和优化

    • arm-none-eabi-gcc: 利用 GCC 的优化技术,提供了广泛的架构支持和成熟的优化方法。
    • armclang: 使用 LLVM 编译技术框架,通常提供更现代的优化策略和更好的代码生成质量,尤其是在 C++ 的高级特性支持方面。
  3. 语言支持

    • 两者都支持主要的编程语言如 C 和 C++。但是,由于 ARM Compiler 包括来自 LLVM/Clang 的优势,armclang 可能在支持最新 C++ 标准方面有更好的表现。
  4. 调试和错误信息

    • armclang 通常提供更详细的错误和警告信息,这可以使调试过程更加高效。
    • arm-none-eabi-gcc 的错误信息较为传统,但由于广泛使用,网上有大量关于其调试的资源和社区支持。
  5. 生态系统和集成

    • arm-none-eabi-gcc 由于是开源和免费,被广泛应用于多种开发环境和项目中。其生态系统非常成熟,有大量的第三方库和工具支持。
    • armclang 尽管集成了许多 ARM 特定的优化,但作为商业产品,可能在使用上不如 GCC 灵活,特别是在版权和许可证管理方面。
  6. 性能

    • 性能比较并不绝对,依赖于具体的应用场景和代码特性。在某些情况下,armclang 生成的代码运行效率更高,而在其他情况下,arm-none-eabi-gcc 可能表现得更好。

在选择哪一个编译器进行项目开发时,需要考虑多个因素,如团队的熟悉度、项目需求对优化的依赖程度、成本(尤其是 armclang 可能涉及的许可成本)以及与其他工具的兼容性等。

clangd

clangd是llvm项目推出的C++语言服务器,通过LSP(Language Server Protocal)协议向编辑器如vscode/vim/emacs提供语法补全、错误检测、跳转、格式化等等功能。C++的LSP曾经是cquery, ccls, clangd三足鼎立。但是clangd支持clang-tidy实时检查的功能是另外两者不具备的,而且cquery和ccls都是单个开发者主导的项目,clangd背后则是有llvm的背书。目前来看,“姓赵”的clangd在这场c++ lsp赛跑中已经有了不小的领先优势。

VScode的IntelliSense

IntelliSense 是 VS Code 提供的智能代码补全和理解功能,它结合了代码补全、参数信息、快速信息和成员列表等功能,极大地提高了开发效率。

IntelliSense 的核心组成

  1. 代码补全 (Code Completion)
    • 输入时自动显示建议列表
    • 包含变量、函数、类、方法等
    • 支持模糊匹配 (如输入 fs.rm 可匹配 fs.rmdir)
  2. 参数提示 (Parameter Hints)
    • 显示函数参数信息
    • 当前参数位置高亮显示
    • 函数重载时可通过箭头切换
  3. 快速信息 (Quick Info)
    • 悬停时显示符号定义
    • 包含文档注释、类型信息等
  4. 错误检查 (Error Checking)
    • 实时语法检查
    • 类型错误检测
    • 未定义符号提示
IntelliSense 的工作原理

VS Code 通过以下方式提供 IntelliSense:

  1. 基于词法分析:简单的文本匹配补全
  2. 基于语言服务器协议 (LSP):通过语言服务器获取深度分析
  3. 基于 TypeScript/JavaScript 的 TS Server:专为 JS/TS 优化
  4. 基于标签 (Tag Parser):如 C/C++ 扩展使用的方案

交叉编译器

在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译.简单地说,就是在一个平台上生成另一个平台上的可执行代码

arm 交叉编译器各种gcc 傻傻分不清楚:gnueabi,gnueabhf,none-eaib - 知乎

交叉编译工具链的命名规范

arch [-vendor] [-os] [-(gnu)eabi]

arch : 架构的意思,如ARM ,MIPS

vendor: 工具链的提供厂商

os: 支持的操作系统

eabi:嵌入式应用二进制接口(Embedded Application Binary Interface)

arm gcc还分为 是否支持操作系统 支持操作系统: arm-none-linux-eabi-gcc 不支持操作系统: arm-none-eabi-gcc none表示vendor是none,也就是不属于某一公司的 (更多的解释是none是指无操作系统)

ABI 和 EABI

ABI:二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。

EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。

两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)

ninja,make,cmake

cmake

cmake是一个生成 .ninja 和 .makefile 的工具。cmake只需要用户通过对源码文件的简单描述(就是CMakeLists.txt文件),就能自动生成一个project的makefile文件或者ninja文件,然后就可以通过ninja或者make进行启动编译了,很多IDE都在用cmake作为项目管理工具。

make与ninja

make功能强大,可以给人看,ninja启动速度快,项目构建速度快,但不是给人看的 可以认为两者同级。

层级关系
  1. 开发者层:编写CMakeLists.txt定义构建规则
  2. 生成器层:CMake解析配置,生成底层构建文件
  3. 执行器层:Make/Ninja执行具体构建命令
  4. 工具链层:编译器(如gcc)、链接器等实际执行编译

HAL库(Hardware Abstraction Layer 硬件抽象层库)

1. 核心定义与归属

HAL 库是 STMicroelectronics(意法半导体) 为自家 STM32 系列微控制器(MCU) 量身打造的底层软件库,是 STM32 生态中核心的开发工具之一,基于 ARM 的 CMSIS 标准构建。

2. 核心组成模块
  • 外设驱动模块:覆盖 STM32 所有常用外设(GPIO、UART、SPI、I2C、ADC、DAC、定时器、DMA、CAN、USB 等),每个外设都封装了完整的操作接口(初始化、配置、数据收发 / 采集、中断处理等)。
  • 系统级功能模块:包含时钟树配置(HAL_RCC_XXX 系列函数)、中断控制器配置、低功耗模式(睡眠 / 停机 / 待机)管理、复位处理等核心系统功能。
  • 工具链适配模块:兼容主流开发环境(STM32CubeIDE、Keil MDK、IAR EWARM),支持与 STM32CubeMX(图形化配置工具)联动,可自动生成初始化代码,大幅减少手动编码工作量。
  • 辅助功能模块:提供延时函数(HAL_Delay)、错误处理机制、外设状态查询等通用工具函数,提升开发便捷性。

CMSIS(Cortex Microcontroller Software Interface Standard)

1. 核心定义与归属

CMSIS 是 ARM 公司 制定的 行业统一软件接口标准(注意:不是具体的软件库,而是 “规范 / 协议”),面向所有基于 ARM Cortex-M 内核(M0/M0+/M3/M4/M7 等)的微控制器,所有主流 MCU 厂商(ST、NXP、Microchip、TI、瑞萨等)均需遵循该标准。

2. 核心组成模块(关键子规范)
  • CMSIS-Core(内核核心层):最基础、最核心的模块,定义了:
    • 内核寄存器的统一访问接口(如 NVIC 中断控制器、Systick 定时器、MPU 内存保护单元的配置函数);
    • 系统初始化函数(SystemInit())、时钟配置接口,统一不同厂商 Cortex-M MCU 的内核启动流程;
    • 内核状态查询、中断优先级管理等通用 API,避免开发者直接操作内核寄存器导致的兼容性问题。
  • CMSIS-Driver(外设驱动接口层):定义了外设驱动的统一接口模板(如 UART、SPI、GPIO、ADC 等),厂商需按该模板实现驱动函数(如UART_TransmitSPI_Receive),确保不同厂商的外设驱动接口一致。
  • CMSIS-RTOS(实时操作系统接口层):定义了 RTOS 的统一 API 规范(如任务创建、信号量、消息队列、定时器等),主流 RTOS(FreeRTOS、RTX5、μC/OS-III)均遵循该标准,使 RTOS 能跨厂商 MCU 无缝移植。
  • CMSIS-DSP(数字信号处理库接口层):定义了 DSP 功能的统一接口(如 FFT、滤波、矩阵运算、PID 控制等),ARM 提供了标准的 CMSIS-DSP 库实现,开发者可直接调用,无需关注底层算法细节。
  • CMSIS-Pack(软件包格式层):统一了 MCU 设备描述、驱动库、中间件、示例代码的打包格式,方便开发工具(如 Keil MDK、STM32CubeIDE)自动识别、导入和管理软件资源。
3. 特点与适用场景
  • 优点:通用性极强、跨平台性好、生态完善,是 Cortex-M MCU 开发的 “通用语言”,适用于所有基于 Cortex-M 内核的 MCU 项目,尤其适合需要跨厂商移植、使用中间件(RTOS/DSP)的复杂项目。
  • 缺点:仅定义接口规范,不提供具体的驱动实现(需厂商或第三方基于规范开发),开发者无法直接使用 CMSIS,必须结合厂商库(如 HAL 库)或第三方库才能落地。

HAL 库与 CMSIS 的关系

  1. 层级关系:CMSIS 是 底层标准,HAL 库是 基于 CMSIS 标准的具体实现——HAL 库的内核操作(如中断配置、Systick 定时器、时钟初始化)完全遵循 CMSIS-Core 规范,外设驱动接口也兼容 CMSIS-Driver 模板。
  2. 作用互补
    • CMSIS 解决 “跨厂商兼容性”:让代码能在 ST、NXP、TI 等不同厂商的 Cortex-M MCU 间移植;
    • HAL 库解决 “ST 内部跨型号开发效率”:让 STM32 用户无需关注 CMSIS 底层细节,快速调用封装好的 API 开发功能。
  3. 依赖关系:HAL 库必须遵循 CMSIS 标准才能保证兼容性(否则无法适配 Cortex-M 内核);而 CMSIS 需要 HAL 库这类厂商库来落地实现,才能被开发者直接使用(CMSIS 本身只是 “规则”,不是可执行代码)。 简单总结:CMSIS 是 “通用接口规则”,HAL 库是 ST 按规则为 STM32 定制的 “工具包”,两者结合既保证了跨平台兼容性,又提升了 STM32 的开发效率。
experience
使用 Hugo 构建
主题 StackJimmy 设计