我使用arm-none-eabi-gcc(来自启动板)和Eclipse作为我的STM32开发工具大约几个月(在ubuntu上)。我认为它比keil MDK更好的IDE。但现在我想摆脱舒适的IDE并学习如何编译程序。我想知道如何在命令行中逐步编译程序。但这不是一个简单的方法。我认为生成目标文件几乎与普通程序相同。困难可能是链接。我对链接和链接器脚本知之甚少。如何将中断向量放入正确的内存地址。 ARM CMSIS中有哪些必要文件。那个newlib怎么样?我必须使用它。什么是" -spaecs"命令行选项。对我来说问题太多了。你有关于此的任何信息或参考。提前谢谢。
顺便说一句,我跑的很奇怪
全部
获取
../ system / src / newlib / _cxx.cpp:13:19:致命错误:cstdlib:没有这样的文件或目录
但在Eclipse中构建时没有错误
答案 0 :(得分:0)
首先,-specs = XYZ.specs要求链接程序查看文件XYZ.specs以获取其他链接程序库信息。例如,这是nano.specs文件中的一些行
%重命名链接nano_link %重命名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)。图书馆,而且据某些人说,都在许多方面被破坏了。