Linux上的Arduino:将Qt Creator配置为开发环境

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 SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.c) \ src/led-blink.cpp SOURCES += $$files($$ARDUINO_DIR/cores/arduino/*.cpp) 

但是为了不列出冗长的来源清单,我通常会这样做

 #  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) #   SOURCES += $$files(./src/*.cpp) 

现在终于写一个草图

 #include "led-blink.h" //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void setup() { } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void loop() { } 

现在,我们在项目树上单击鼠标右键,然后选择“组装”



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



一切正常,还有ELF,这对于调试和十六进制控制器中的固件非常有用。 现在让我们编写另一个闪烁器,其引脚13上有LED

 #include "led-blink.h" #define LED_STAND_PIN 13 unsigned long time = 0; unsigned long DELAY = 500000; bool on = false; //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void setup() { pinMode(LED_STAND_PIN, OUTPUT); } //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ void loop() { if ( micros() >= time + DELAY ) { time = micros(); on = !on; } uint8_t state = on ? HIGH : LOW; digitalWrite(LED_STAND_PIN, state); } 

我们收集项目,转到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 | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e950f (probably m328p) avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: reading input file "led-blink.hex" avrdude: writing flash (2838 bytes): Writing | ################################################## | 100% 0.47s avrdude: 2838 bytes of flash written avrdude: verifying flash memory against led-blink.hex: avrdude: load data flash data from input file led-blink.hex: avrdude: input file led-blink.hex contains 2838 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.38s avrdude: verifying ... avrdude: 2838 bytes of flash verified avrdude: safemode: Fuses OK (E:00, H:00, L:00) avrdude done. Thank you. 

告诉我们过程进行得很顺利。 LED将以2 Hz的频率闪烁。

原则上,您可以在IDE中配置固件。 为此,请进行启动设置,例如



然后选择启动项目(按Ctrl + R),我们将执行固件并按照与Arduino IDE完全相同的方式启动。

结论


所描述的设置过程是一个非常耗时的过程。 但是作为回报,我们获得了基于Linux内核的系统(Windows也适用)上最出色的IDE之一的全部功能。 自动描述,重构,方便的代码导航-所有这些现在都可以成功使用。

正如他们所说,这个例子是“在额头上”。 实际上,Arduino IDE将Arduino Core编译为单独的static core.a库并链接到可执行文件。 结果,在标准环境中收集的固件的大小小于本文中介绍的方法。 我仍然必须弄清楚这些细微差别。 同时,在以下有关该主题的文章中,我们将讨论:

  • 项目的结构,找出main()函数的位置,并说明为什么在Arduino上过度循环是不好的
  • 使用模拟器进行分步调试
  • 我们将处理程序集中使用的编译器选项

通常,我们将尝试阐明许多有助于理解正在进行的过程的问题,如果没有这些问题,将来很难从Arduino切换到更高级的东西。

Source: https://habr.com/ru/post/zh-CN408261/


All Articles