Arduino平台很受欢迎,无论它是被责骂还是受到好评。 它的创建者设法将进入阈值降低到单击鼠标几下+几行代码和瞧的程度-在这里您的LED闪烁。 通常,对于在AVR上快速制作手工艺品的原型,Arduino的东西非常方便。 他们唯一失败的是IDE,很难调用它。 在IDE的功能中,它仅提供一件事-项目创建和组装的自动化。
对于Windows用户,还有另一种选择:MS Visual Studio社区+
vMicro插件,可让您编写草图,但具有IDE提供的所有功能。 通过“工具”菜单,该插件可以在Studio中自由运行,并且可以在试用中尽其所能。 从理论上讲,付费版本支持逐步调试,但作为vMicro许可副本的所有者,它们并没有给人留下深刻的印象。
对于Linux用户,一切都一如既往:我们需要一个好的IDE-选择“受害者”并尝试为其固定必要的功能。 有一些基于
Eclipse的解决方案,但是我不喜欢Eclipse,我
已经写过一次了 。 当手头根本没有什么合适的东西时,我忍受他是不可避免的邪恶。 在所有免费的IDE中,我最尊重强大而出色的
Qt Creator ,我和我的团队已经在其中工作了一年多。 因此,我将讨论如何将其转变为Arduino的开发环境。
1.整地
Qt Creator可以在或多或少自尊的Linux发行版的存储库中找到。 例如在古代中就这样
$ sudo pacman -S qtcreator
此外,我们将需要有关Arduino本身的软件包。
$ sudo pacman -S arduino arduino-avr-core
在我们最终忘记Arduino的那一天,我们将需要用于AVR的另一个编译器,汇编器,链接器和标准C库,因此我们将它们放入
$ sudo pacman -S avr-gcc avr-binutils avr-libc
我们将在本文中测试调试器和仿真器,因此我们将安装此类软件包
$ sudo pacman -S avr-gdb simavr
2.在Qt Creator中创建一个项目
在C ++中运行Qt Creator并创建一个没有Qt的新项目

选择项目的位置并为其命名

作为构建系统,请使用常规的qmake

我们默认情况下保留工作集,稍后进行修复

在版本控制下,根据需要添加项目

我们得到了标准的C ++项目

项目中只有两个文件:main.cpp和led-blink.pro。 第一个被删除,第二个从其中写入的所有内容中清除,得到一个完全空的项目

现在用笔,我们开始在* .pro文件中编写文本,形成Arduino的项目结构
# # Arduino Core ARDUINO_DIR=/usr/share/arduino/hardware/archlinux-arduino/avr/ # (Arduino Uno, Nano, Mini) ARDUINO_MCU=atmega328p # ARDUINO_FCPU = 16000000L
我们从项目中排除与Qt相关的所有内容,然后选择项目模板
# , Qt ! QT -= gui core CONFIG -= qt # - , ELF TEMPLATE = app
我们为汇编二进制文件及其名称设置目录
DESTDIR = ../bin TARGET = led-blink
接下来,连接标题搜索目录
# INCLUDEPATH += $$ARDUINO_DIR/cores/arduino INCLUDEPATH += $$ARDUINO_DIR/variants/standard INCLUDEPATH += $$ARDUINO_DIR/libraries INCLUDEPATH += /usr/avr/include
定义C编译器及其键
QMAKE_CC = /usr/bin/avr-gcc QMAKE_CFLAGS += -c -g -Os -w -ffunction-sections -fdata-sections QMAKE_CFLAGS += -MMD -mmcu=$$ARDUINO_MCU -DF_CPU=$$ARDUINO_FCPU QMAKE_CFLAGS += -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR
和C ++编译器及其键
QMAKE_CXX = /usr/bin/avr-g++ QMAKE_CXXFLAGS += -c -g -Os -w -ffunction-sections -fdata-sections QMAKE_CXXFLAGS += -fno-exceptions -fno-threadsafe-statics QMAKE_CXXFLAGS += -MMD -mmcu=$$ARDUINO_MCU -DF_CPU=$$ARDUINO_FCPU QMAKE_CXXFLAGS += -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR
设置链接器及其键
QMAKE_LINK = /usr/bin/avr-gcc QMAKE_LFLAGS = -w -Os -Wl,--gc-sections -mmcu=$$ARDUINO_MCU QMAKE_LIBS = -lm
我们配置ELF文件的后处理,以便将其转换为Intel HEX,以用于板上的后续固件
QMAKE_POST_LINK += /usr/bin/avr-objcopy -O ihex -j .text -j .data -S ${TARGET} ${TARGET}.hex
指定哪些头文件包含在项目中。
HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h)
定义Arduino Core源文件
SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp)
那么,那么,我们什么时候才真正开始绘制草图? 让我们现在开始,但是我们所做的,高尚的努力,是使草图代码正常工作的必要最低要求。
现在将草图源添加到项目中。 右键单击树中的项目,然后选择“添加新...”。添加C ++源文件

在下一个窗口中组织项目内部的源代码

单击“浏览”并为* .cpp文件创建src文件夹

现在给文件起个名字

单击下一个窗口“完成”。 我们得到这样的照片

IDE将将此文件添加到led-blink.pro构建脚本中
HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h)
但是为了不列出冗长的来源清单,我通常会这样做
# Arduino Core HEADERS += $$files($$ARDUINO_DIR/cores/arduino/*.h) HEADERS += $$files($$ARDUINO_DIR/variants/standard/*.h) # Arduino Core SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp) # SOURCES += $$files(./src/*.cpp)
现在,我们将执行Arduino IDE永远不会提供的工作:将头文件添加到草图中,执行与上述相同的步骤

在此文件中,添加必要的项目标题
#ifndef LED_BLINK_H #define LED_BLINK_H #include <Arduino.h> #endif // LED_BLINK_H
配置标题和源的路径
# INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) files(./src
现在终于写一个草图
#include "led-blink.h"
现在,我们在项目树上单击鼠标右键,然后选择“组装”

我们转到项目文件夹。 现在,我们有了bin /目录,其中包含编译器的工作产品

一切正常,还有ELF,这对于调试和十六进制控制器中的固件非常有用。 现在让我们编写另一个闪烁器,其引脚13上有LED
#include "led-blink.h" #define LED_STAND_PIN 13 unsigned long time = 0; unsigned long DELAY = 500000; bool on = false;
我们收集项目,转到bin /。 我们坚持您的USB板。 在我的情况下是Uno,在我的系统上它设置了一个名为/ dev / ttyACM0的端口进行编程。 执行命令
$ avrdude -c arduino -p m328p -P /dev/ttyACM0 -b 115200 -U flash:w:led-blink.hex:i
在这里
- -P / dev / ttyACM0-编程器端口
- -p m328p-控制器型号
- -c arduino-程序员类型:内置于Uno板
- -b 115200-端口速度
- -U闪存:w:led-blink.hex:i-指示固件的区域,操作类型(写入)和固件文件
与此类似的排气
avrdude: AVR device initialized and ready to accept instructions Reading |
告诉我们过程进行得很顺利。 LED将以2 Hz的频率闪烁。
原则上,您可以在IDE中配置固件。 为此,请进行启动设置,例如

然后选择启动项目(按Ctrl + R),我们将执行固件并按照与Arduino IDE完全相同的方式启动。
结论
所描述的设置过程是一个非常耗时的过程。 但是作为回报,我们获得了基于Linux内核的系统(Windows也适用)上最出色的IDE之一的全部功能。 自动描述,重构,方便的代码导航-所有这些现在都可以成功使用。
正如他们所说,这个例子是“在额头上”。 实际上,Arduino IDE将Arduino Core编译为单独的static core.a库并链接到可执行文件。 结果,在标准环境中收集的固件的大小小于本文中介绍的方法。 我仍然必须弄清楚这些细微差别。 同时,在以下有关该主题的文章中,我们将讨论:
- 项目的结构,找出main()函数的位置,并说明为什么在Arduino上过度循环是不好的
- 使用模拟器进行分步调试
- 我们将处理程序集中使用的编译器选项
通常,我们将尝试阐明许多有助于理解正在进行的过程的问题,如果没有这些问题,将来很难从Arduino切换到更高级的东西。