如何使用arm-none-eabi-gcc编译STM32程序

问题描述 投票:0回答:1

我使用arm-none-eabi-gcc(来自launchpad)和Eclipse作为我的STM32开发工具大约几个月(在ubuntu上)。我认为这是一个比keil MDK更好的IDE。但现在我想摆脱舒适的IDE并学习如何编译程序。我想知道如何在命令行中逐步编译程序。但这不是一个简单的方法。我认为生成目标文件几乎与普通程序相同。困难可能是链接。我对链接和链接器脚本知之甚少。如何将中断向量放入正确的内存地址。 ARM CMSIS中有哪些必要文件。那个newlib怎么样?我必须使用它。什么是“-spaecs”命令行选项。对我来说问题太多了。你有关于此的任何信息或参考。提前致谢。

顺便说一句,我跑的很奇怪

做所有

得到

../system/src/newlib/_cxx.cpp:13:19:致命错误:cstdlib:没有这样的文件或目录

但是在Eclipse中构建时没有错误

gcc arm stm32
1个回答
0
投票

首先,-specs = XYZ.specs要求链接器查看文件XYZ.specs以获取其他链接器库信息。例如,以下是nano.specs文件中的一些行

%rename link nano_link%rename link_gcc_c_sequence nano_link_gcc_c_sequence ... * cpp_unique_options:-isystem = / include / newlib-nano%(nano_cpp_unique_options)

* nano_libc:-lc_nano ...

基本上是用于描述操作和要包含的文件的内部语言。 specs文件的内容取决于许多因素,包括编译器,MCU等。

对于nano.specs,主要的内容是它包括nanolib。

转向nanolib与newlib。缺点是newlib是嵌入式系统的libc实现(与Linux等大型机器的“常规”glibc相比),而nanolib是基于微控制器的嵌入式系统的进一步优化库。 Nanolib默认带有“小”printf,以进一步减少输出程序的大小。为了更多背景,我在这里写了一篇博客文章。 https://imagecraft.com/blog/2019/04/embedded-gcc-libraries-newlib-vs-nanolib/

为了完全回答你的所有问题(CMSIS,GCC如何编译和链接...),它需要的不仅仅是一个简单的答案,可以适应这里。我建议查找“GNU Embedded ARM”工具链,并从其文档开始。基本操作很简单:编译器将文件编译为目标文件(.o),链接器将它们与libc组合成一个工作程序。为ARM MCU构建程序的主要困难是使用哪些供应商库来访问外设。 CMSIS是解决“通用”ARM MCU要求的一种方法,但大多数程序需要的远不止这些。

STM32特别优秀,ST提供了许多库甚至是GUI工具(CubeMX),但也非常糟糕,因为库中有不少于3个主要版本(标准外设库或SPL,HAL和低级LL),据一些人说,在很多方面都被打破了。

© www.soinside.com 2019 - 2024. All rights reserved.