MDK介绍及其使用
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 处理器的代码编译。它们之间存在一些关键的区别,以下是它们各自的特点及区别的简要概述:
-
开发者和背景:
- arm-none-eabi-gcc: 是 GNU 编译器集合(GCC)的一个变体,专门用于 ARM 处理器。这个工具链是开源的,由 GNU 项目支持。
- armclang: 是 ARM 公司推出的编译器,属于 ARM Compiler 工具链的一部分。ARM Compiler 6及更高版本基于开源的 LLVM/Clang 技术,但包含许多 ARM 提供的专有优化和扩展。
-
编译技术和优化:
- arm-none-eabi-gcc: 利用 GCC 的优化技术,提供了广泛的架构支持和成熟的优化方法。
- armclang: 使用 LLVM 编译技术框架,通常提供更现代的优化策略和更好的代码生成质量,尤其是在 C++ 的高级特性支持方面。
-
语言支持:
- 两者都支持主要的编程语言如 C 和 C++。但是,由于 ARM Compiler 包括来自 LLVM/Clang 的优势,armclang 可能在支持最新 C++ 标准方面有更好的表现。
-
调试和错误信息:
- armclang 通常提供更详细的错误和警告信息,这可以使调试过程更加高效。
- arm-none-eabi-gcc 的错误信息较为传统,但由于广泛使用,网上有大量关于其调试的资源和社区支持。
-
生态系统和集成:
- arm-none-eabi-gcc 由于是开源和免费,被广泛应用于多种开发环境和项目中。其生态系统非常成熟,有大量的第三方库和工具支持。
- armclang 尽管集成了许多 ARM 特定的优化,但作为商业产品,可能在使用上不如 GCC 灵活,特别是在版权和许可证管理方面。
-
性能:
- 性能比较并不绝对,依赖于具体的应用场景和代码特性。在某些情况下,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 的核心组成
- 代码补全 (Code Completion)
- 输入时自动显示建议列表
- 包含变量、函数、类、方法等
- 支持模糊匹配 (如输入
fs.rm
可匹配fs.rmdir
)
- 参数提示 (Parameter Hints)
- 显示函数参数信息
- 当前参数位置高亮显示
- 函数重载时可通过箭头切换
- 快速信息 (Quick Info)
- 悬停时显示符号定义
- 包含文档注释、类型信息等
- 错误检查 (Error Checking)
- 实时语法检查
- 类型错误检测
- 未定义符号提示
IntelliSense 的工作原理
VS Code 通过以下方式提供 IntelliSense:
- 基于词法分析:简单的文本匹配补全
- 基于语言服务器协议 (LSP):通过语言服务器获取深度分析
- 基于 TypeScript/JavaScript 的 TS Server:专为 JS/TS 优化
- 基于标签 (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启动速度快,项目构建速度快,但不是给人看的 可以认为两者同级。
层级关系
- 开发者层:编写CMakeLists.txt定义构建规则
- 生成器层:CMake解析配置,生成底层构建文件
- 执行器层:Make/Ninja执行具体构建命令
- 工具链层:编译器(如gcc)、链接器等实际执行编译