PlatformIO 中的 avr-gcc 与 Arduino

avr-gcc vs Arduino in PlatformIO

我正在使用 PlatformIO 作为 IDE 来对 AVR MCU 进行编程。我正在开始 AVR 编程(我有 C/C++ 的背景并且在 OS 上编程,而不是嵌入式,虽然我过去做过一些 Arduino 的东西)并使用 PlatformIO 给我代码registers/pins 的完成,这就是我使用它的原因。

看来我无法在不丢失代码完成的情况下将框架从 Arduino 切换到 PlatformIO 中的 avr-gcc。

I am wondering if there's any drawbacks in keeping Arduino as the framework?

我知道 Arduino 在后面使用 avr-gcc,但我读到它仍然在用户不知情的情况下进行了一些设置(例如延迟的 Timer0 设置,这是我需要的,因为我将它用作我的 ATTiny85 上 USI 的时钟源)。

Otherwise, is there anyway in PlatformIO to keep code completion and use avr-gcc instead of Arduino?

谢谢!

编辑:我在 OSX 或 linux (ubuntu).

我从未使用过PlatformIO,我的回答仅基于我对 AVR 开发和 Arduino 混乱的(扩展)知识……错误……框架。

Arduino 框架 使用 AVR-libc(标准低级框架,为您提供在 AVR 上编程所需的所有工具),并添加了一个抽象层,因此你不是直接处理寄存器,而是使用更容易理解的接口。

所以当你在一个引脚上写字时,不是查看 AVR 的 IC 脚号,而是寻找匹配的 PORT 地址来配置它并改变它,你正在使用 digitalWrite() board 的密码。因此,无论 IC 是什么,引脚都将保持不变,并具有一致的功能。

引脚定义是使用提供给编译器的头文件完成的,该头文件取决于您 IDE 中的目标设置(因此无论您使用 Arduino Mega 还是 Leonardo,AVR port/pin 和电路板引出线将发生根本变化)。

鉴于您对 PlatformIO 的描述,它使用该信息根据电路板配置为您提供适当的引出线完成。它当然也利用了 Arduino 框架的面向对象方法,因此您可以在使用单例时轻松完成方法(就像使用 Serial 时)。

另一方面,使用原始 AVR-libc 很难获得任何有意义的完成,因为大部分操作都是在通过预处理器别名声明的寄存器上完成的,并且整个代码都是纯 C 语言,所以代码完成并不是很有帮助(你不能列出适用于给定对象的所有方法......就像 Serial 示例一样)。

然后,Arduino 提供了一种很好的高级方法来对嵌入式代码进行原型设计,然后您可以在需要及时优化时策划 and/or space。一些项目(如用于 repraps 的 Marlin 固件)使用某种混合方法,以更优化的方式重新实现 Arduino 接口的许多部分(如 digitalWriteSerial 对象)。

最后,我对您的建议是放弃 platform.ioarduino IDE,如果您真的喜欢 IDE,请切换到 eclipse GUI,或更好的,使用您喜欢的强大编辑器(如 vim/nvim、emacs、atom、sublime…)让它像处理任何其他 C 代码一样处理 AVR 代码。

如果您使用 VisualMicro 插件和 VisualStudio(Community Edititon)处理 Arduino 项目,包括 avr-gcc 内部结构,所有代码完成/语法高亮/goto 声明等都适用于您项目和所有库中的任何内容。

这是您要找的吗?

当然,如果你用 VisualMicro 会很烦人 "for free"

正如 ivankravets 在 PlatformIO community platform (see: https://community.platformio.org/t/avr-programming-without-arduino-framework/525/4) 上指出的那样,只需从 platformio.ini 文件中删除行 framework = arduino 即可摆脱 Arduino 框架并在其中工作用于 avr-gcc 的裸 C。