手术以增加Arduino IDE的串行端口缓冲区





我不是Arduino基础架构的忠实拥护者。是的,今天我们已经有了更多选择-例如pro IDEPlatform IO。但是,我总是会从原始IDE中感到胃灼热。当我想做一件非常简单的事情时,我只是欣赏它的前一天:增加ATmega32串行端口的接收缓冲区。最后,我想出了一个可以帮助您解决其他问题的解决方案-因此,即使您并不是特别需要此功能,也可能会发现查看我所做的工作很有帮助。



这次经历给我留下了双重印象。一方面,我鄙视此非描述性编辑器,因为它对我隐藏了太多东西,并且提供了很少的有用工具。另一方面,当您深入研究其内部结构的细节时,它给我留下了深刻的印象。



首先,您可能会问我为什么要使用IDE。简而言之,我不使用它。但是,如果您做其他人会使用的事情,则几乎无法忽略。但是,如果您设置了自己的IDE,则一旦代码上线,就会有人尝试将其与IDE一起使用。我曾经写过一本基于Z80的4美元的计算机。我很少有时间来构建自己正在写的东西,但是我真的很想尝试构建这台小型计算机。有一阵子,一切都处于半分解状态,然后他们给了我一笔付款。我收到了它,而且-您可能已经猜到了-它仍然被拆开了一半。但是我终于找到了完成项目的时间,并下载了CP / M。







该项目的唯一问题是缺少将数据从项目传输到PC的好选择,反之亦然。似乎最好处理Intel十六进制文件并通过终端复制/粘贴它们。我想要更好的东西,并在周六早上陷入了兔子洞。结果,我想出了一种将自己的菜单项添加到Arduino IDE的方法,以便根据项目中使用的硬件来编辑编译器设置。这个技巧值得学习,因为它在此特定任务之外很有用。



问题:Arduino串行端口缓冲区大小限制



我不会打扰您如何使董事会发挥作用的细节,因为只有在拥有董事会的情况下,您才会感兴趣。如果确实需要,所有详细信息都在Hackaday.io讨论中结果,Arduino串行端口缓冲区不够大,无法通过XModem传输,因此被认为是可靠的。一切似乎都可以使用默认的64字节缓冲区,但是XModem正在发送更多数据,并且很容易想到缓冲区溢出。



更新缓冲区有多困难?另一方面,这是一项琐碎的任务。另一方面,这非常困难,因为您的工具正在竭尽全力为您提供帮助。



工具集



小型计算机项目使用真正的Z80芯片和ATMega32A来执行几乎所有辅助功能。它提供时钟速度,串行端口,存储等。但是,Arduino IDE不直接支持ATMega32A,因此您必须安装工具箱才能执行此操作。这种情况需要MightyCore,所以我使用了它。



串行端口库配置有#define语句,因此您可以更正缓冲区大小。默认情况下,如果未进行任何配置,则将根据可用RAM的数量获取值:



#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_TX_BUFFER_SIZE 16
#else
#define SERIAL_TX_BUFFER_SIZE 64
#endif
#endif
#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif


做出改变



很简单,不是吗?在加载HardwareSerial.h之前定义符号。狗屎-此文件已加载到Arduino.h中。SP希望将其添加到您的程序中,并使其首先启动。似乎某些版本的IDE会检查您是否已启用它,以免重新启用它,但版本1.8.5并未。也许我可以将一些设置传递给编译器?不。至少不是通过IDE。



我已经尝试了很多东西。当然,我只想更改主要库。但这不好。稍后,您可能需要默认设置。如果您更新工具箱,所有更新将丢失。我想避免这种情况。互联网上的某人建议复制并修改平台文件。不是一个完美的解决方案。



用以下方法检查假设



我可以看到我正在做的事情没有用,因为我是在HardwareSerial.cpp中临时插入#if和#error语句。例如:



#if SERIAL_RX_BUFFER_SIZE==256
#error 256
#endif


现在,如果错误256在编译过程中崩溃,我知道大小已设置。如果不是,则系统拒绝我的更改。



权衡:将设置添加到板级菜单



我真的很想提出一种方法来仅在特定项目中更改设置,从而设置串行缓冲区的大小。我没有成功。但是我设法从Mighty Core更改了board.txt。是的,我必须确保更新不会覆盖我的编辑,但是它们很简单,并且如果文件中缺少某些内容,这将是显而易见的。







显然,这是因为我为IDE创建了一个菜单,该菜单仅在将ATMega32用于Mighty Core时显示。在菜单中,您可以选择一种预设的缓冲区大小。



要获得此结果,您需要执行三个步骤:



  1. 告诉IDE您有一个新的菜单项并描述它的外观。
  2. 新项目应更改编译器设置。
  3. 由于现有系统也会更改编译器设置,因此您需要确保它们不会损坏。


第一步很容易。我的boards.txt文件位于〜/ .arduino15 / packages / MightyCore / hardware / avr / 2.0.5 / boards.txt中。几乎最顶部是菜单项列表,最后我添加了我的菜单项:



# Menu options
menu.clock=Clock
menu.BOD=BOD
menu.LTO=Compiler LTO
menu.variant=Variant
menu.pinout=Pinout
menu.bootloader=Bootloader
menu.SerialBuf=Serial Port Buffers (RX/TX)


然后,我向下移动这些行,并将菜单添加到ATMega32的现有LTO设置的前面:



32.menu.SerialBuf.disabled=Default
32.menu.SerialBuf.disabled.compilerSB.c.extra_flags=
32.menu.SerialBuf.disabled.compilerSB.cpp.extra_flags=
 
32.menu.SerialBuf.SB64=64/64
32.menu.SerialBuf.SB64.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB64.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=64 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB128=128/128
32.menu.SerialBuf.SB128.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
32.menu.SerialBuf.SB128.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=128
 
32.menu.SerialBuf.SB12864=128/64
32.menu.SerialBuf.SB12864.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB12864.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=128 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB256=256/256
32.menu.SerialBuf.SB256.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
32.menu.SerialBuf.SB256.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=256
 
32.menu.SerialBuf.SB25664=256/64
32.menu.SerialBuf.SB25664.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
32.menu.SerialBuf.SB25664.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=64
 
32.menu.SerialBuf.SB25632=256/32
32.menu.SerialBuf.SB25632.compilerSB.c.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32
32.menu.SerialBuf.SB25632.compilerSB.cpp.extra_flags=-DSERIAL_RX_BUFFER_SIZE=256 -DSERIAL_TX_BUFFER_SIZE=32


菜单结构



您可以看到32.menu对象将给定处理器的所有项目组合在一起。接下来是我们的菜单键(SerialBuf)。随后是每个菜单项的唯一键。重要的是不要重复使用它们。例如,如果您有两个SB64密钥,则只有其中一个可以使用。



如果为该键分配等号,则可以为该菜单项分配文本。例如,“默认”或“ 64/64”。您还可以向该键添加一个属性,该属性将在激活该项目时分配。



例如,如果选择256/256,则编译器将设置editorSB.c.extra_flags属性。为什么我想出了这样的财产名称,您稍后会明白。



和平共处



不存在editorSB.c.extra_flags属性。正确地将其称为compile.c.extra_flags。但是,Mighty Core LTO设置使用相同的密钥。因此,新菜单首先出现并设置伪造属性很重要。然后,您需要更正LTO代码:



# Compiler link time optimization
32.menu.LTO.Os=LTO disabled
32.menu.LTO.Os.compiler.c.extra_flags={compilerSB.c.extra_flags}
32.menu.LTO.Os.compiler.c.elf.extra_flags=
32.menu.LTO.Os.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags}
32.menu.LTO.Os.ltoarcmd=avr-ar
 
32.menu.LTO.Os_flto=LTO enabled
32.menu.LTO.Os_flto.compiler.c.extra_flags={compilerSB.c.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.compiler.c.elf.extra_flags=-w -flto -g
32.menu.LTO.Os_flto.compiler.cpp.extra_flags={compilerSB.cpp.extra_flags} -Wextra -flto -g
32.menu.LTO.Os_flto.ltoarcmd=avr-gcc-ar


主要变化是将每组标志添加到预设菜单。这会将所有标志添加到正确的属性editor.c.extra_flags。



我为所有情况配置了错误陷阱,以确保正确分配了所有内容。



自己定制



当然,如果您需要其他选项,则可以更改选项。您还可以使用此技巧在Arduino.h文件获得控制之前设置其他参数。有关于文件如何配置各种平台参数,包括boards.txt。



最好用相同的信息创建自己的独立的board.txt文件,但随后我将不得不将其余的Mighty Core随身携带。相反,我只是将此文件的副本另存为boards.txt.custom,如果菜单消失了,我将其内容与boards.txt进行比较以查看发生了什么变化。



自然,如果您不需要与使用IDE的支持人员打交道,那么您就可以忘掉它。最好使用Pro IDE,即使有一些缺点。好吧,您可以始终参考Platform.io。



也可以看看:






All Articles