工具链的一些杂知识

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 工具的软件。

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,也就是不属于某一公司的

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)、链接器等实际执行编译
experience
使用 Hugo 构建
主题 StackJimmy 设计