注释
如果我对基于代码的代码进行类似的重写,那么 C++ 将为零。这是具有专用功能的嵌入式固件。不需要对旨在帮助新手程序员的无用方法的虔诚奉献。事实上,我认为你的努力是对原作者的侮辱。他们拥有开发优秀项目的技能和动力。你的听起来像是一个旨在安抚 CS 之神的研究生学期项目。
|
请,本论坛只接受建设性或积极的评论。 |
只是想补充一点,这绝不是侮辱;相反。事实上,我很感激在创建 CNC 板时得到的帮助,所以我也决定做出贡献。虽然我还是电子产品的新手,但人们确实认为我是 C++ 方面的专家软件工程师。尽管如此,我总觉得我的工作应该为自己说话。 我再次强调这仍然是一个 WIP,我需要更多的时间。 无论如何:如果 Bart 和 Mitch 不欣赏我的帮助,那是我的损失,而且是我一个人的损失。在这种情况下,我们将关闭这张票并将其保留。 |
@ggallant571 |
我很遗憾已经严厉地回应了很多。从事该行业很长时间(从汇编程序开始),并且多次被类似的陈述所困扰。我认为 GRBL 代码是有史以来最好的产品之一。它只是工作。事实上,考虑到它所面临的限制,它的效果非常好。我非常钦佩坚持生产产品的开发人员的技能和毅力。也许如此之多以至于建议另一种方法被认为是对他们的侮辱。使用更强大的处理器可能需要对整个项目进行彻底检查。尤其是在用户配置层。有一个愿意做志愿者的人很棒。至于我自己移植 GRBL,早在有公共存储库之前就为 STM32 移植了。
|
@ggallant571从您的评论中,我相信您错误地认为我介绍了类和(更通用的)C++ 代码之类的东西。我没有。GRBL_ESP32 不是 GRBL;它进化了,已经有了用于主轴和电机的类,并使用来自外部库的类。IMO 这是一个不错的选择,鉴于 ESP32 比 Arduino Uno 强大得多,因此将更多的东西转移到运行时可配置是很有意义的。事实上,最近的功能之一就是 显然,功能和稳定性是 CNC 机床的关键。绝对没有关于这个的讨论(我昨天运行了一条 800K 线的刀具路径,想象一下如果它在中途断裂我会有什么感觉)。事实上,我相信如果我的工作做得好,在 PC 上运行“模拟”CNC 机床应该会相对容易,这样可以更轻松、更快速地进行测试,以确保未来版本的稳定性。但公平地说,这目前只是我的愿望清单上的东西,因为它的复杂性。但是……在有这样的设施之前,我也不认为彻底检查整个项目是明智的,尤其是逻辑。是的, 这就是为什么我从唾手可得的成果开始:在不改变逻辑的情况下移动事物并添加明显的(缺失的 ctor、虚拟析构函数、包含、命名空间、iso std 命名、样式等)。一步一步来。 |
我认为这是一条值得走的路。巴特和我已经朝着这个方向迈出了一步,所以你肯定走在一条合理的轨道上。从很久以前我就是一个彻头彻尾的 C 程序员,所以迁移到 C++ 引起了我的一些担忧,但我最近对新设置架构的体验让我确信,如果使用得当,C++ 会非常有价值。我所说的“高雅”是指“避免使用庞大的外部框架”和“尽量不要使用太多抽象和重载,以至于新读者无法弄清楚发生了什么”。 也许我们可以逐步地做,而不是一个带有一整套变化的分支,作为一系列 PR,一次呈现一个,并在中间时间进行审查。这使得测试和审查变得更加容易,并允许通过二分法来发现问题。以下是我对个别观点的评论:
Bart 和我现在大部分工作都使用 platformio。它可以从命令行使用,也可以集成在 VSCode IDE 中,或者以混合模式与 VSCode 集成但使用外部编辑器。platformio 的编译速度比 Arduino 快得多,这可能是因为它编译了单个文件,而不是使用 Arduino 将所有内容连接到一个文件并编译整个 wad 的可疑技巧。 VSCode 的受欢迎程度似乎在突飞猛进,所以感觉它是“主要支持的 IDE”的一个不错的选择。 我不知道 vMicro 的特点是什么——但我确实认为支持两个环境已经足够困难了,所以添加第三个环境似乎是额外的工作,没有太多好处。如果 vMicro 配置与 Arduino 相当,不需要额外考虑,那么它是无关紧要的。我们必须支持 Arduino,因为它很熟悉,但我们真的不太喜欢它 – 当“一个构建来统治他们”土地时,容纳新手的需求可能会消失(见下文)。
文档总是非常感谢!单独公关。
那在我们的清单上,Bart 朝着这个方向采取了一些步骤,但我们并没有像我们应该的那样系统地使用它。我认为这将是一个很好的第一步。或许您可以确保它在 VSCode/platformio 环境中运行良好(VSCode 确实支持 clang-format),然后教我们如何有效地使用它。仅更改空格的全局重新格式化将是一个很好的补丁,以及某种 git 自动化来检查提交。
这将是一个很好的第二个补丁。我同意包括 CPP 是不好的。我忘记了我们为什么这样做,但它可能与 Arduino IDE 的陌生性有关。如果你能找到一个更好的解决方案,它适用于普通的 Arduino 和 platformio,那将是一个很好的第二个补丁。第三个是消除 _ 前缀。
这听起来不错。对人类的好处是显而易见的。你能解释一下它如何帮助编译器做更少的工作吗?我没有意识到 C++ 编译器知道文件名和它的内容之间的关系。
哇,考虑到很难整理出在哪里使用的内容和依赖图,我真的很佩服你做到了这一点。我通常尝试这样做,尤其是构建代码,以便单个文件依赖于最少数量的包含 – 但在大型项目中,随着时间的推移保持这种纯度变得困难。我非常希望看到您的解决方案。
我不确定你在这里建议什么。我们有 Spindles 和 Motors 类(可能需要改进);我们还需要这些概念的名称空间吗?
是的,绝对想要这样做 – 并且在有意义的地方也使用枚举而不是#defines。很想得到你的帮助 – 但作为小型目标补丁,而不是一个巨大的综合体。
似乎是该系列的后期补丁之一。
这是一个讨论松弛的好话题。我的目标是完全摆脱编译时设置,启用“一个构建来统治它们,通过加载文本文件进行配置”。这在 AVR 上是不可行的,这就是为什么经典的 GRBL(甚至更大程度上是 Marlin)具有所有编译时设置的原因。但考虑到 SPI FLASH 芯片的成本非常低,它应该完全可以在 32 位处理器上运行。 设置重写受到保持与经典 GRBL 兼容性的需要的限制 – 所以发件人不会中断 – 以及当前和即将发布的 WebUI 版本。这是一个微妙的舞蹈,但我们对结果很满意。整体代码大小大幅减少,同时增加了功能并提高了可维护性。命名空间并不完美——我认为不可能设计一个同时对每个可能的观点或用例都最优的命名空间模式——但到目前为止感觉很愉快。
上面详细介绍过。总的来说,你似乎正朝着我个人喜欢的方向前进——根据我与巴特的谈话,我怀疑他的感觉大致相似。
大概是历史性的。主轴是在制品。如果您可以将笔合并到 Spindle 类结构中 – 或合并到改进的结构中 – 请试一试。但将其作为单独的补丁(或系列)进行。
在制品
我不知道打印功能从何而来;也许是经典 GRBL 的残余。它们没有在我能找到的任何地方使用。我删除了 print.cpp 和 print.h 并且它仍然编译 – 虽然我还没有尝试过 #defines 的所有可能组合
那是历史性的。如前所述,我们希望所有 ifdef 都消失。WebUI 集成的许多方面与类似的 grbl 代码是多余的,因此改进和合并是可能的。事实上,我使用新设置实现的代码量大幅减少主要来自 WebUI 代码的改进,用数据迭代替换了大块的复制和粘贴代码。
我们应该开始增量 PR 的过程吗? |
刚刚注意到我不得不要求一个松弛的邀请。不知道它是如何工作的……但请发送一个到:atlaste at yahoo dot com;可能更容易沟通。
通常我不会同意这一点,因为这意味着我必须重新开始……但既然你们在我的董事会上帮助了我这么多,我会破例。
vMicro 也这样做。不过我不熟悉platformio;会调查的。就我个人而言,只要我能使用 Visual Studio(顺便说一句,这是与 VSCode 不同的产品),我就很高兴。我(和许多其他人)使用 vMicro 的唯一原因是因为 Arduino 支持不是开箱即用的。
好的。也可能是谈论这个大方向的好时机。 小背景……在我的公司,我必须管理数百万个 loc 代码库。显然,我们有很多关于代码的文档。一开始很难做到的事情是使代码和文档保持同步——因为开发人员倾向于更改代码而不是搜索文档。 在某个时候,我们决定使用 MD 文件,并将它们放在与 cpp/h 文件相同的文件夹中(名称相似)。虽然一开始这可能看起来很混乱,但最大的优势是,如果有关于代码的文档,它也“在你面前”,这有助于保持代码和文档的同步。我强烈建议在这里也使用这种方法。
我将把它与 PR #1一起放在一张单独的票中,其中包含更多详细信息。
我承认 CI 总的来说是一个好主意,我们在这里广泛使用它。但是,正确设置 CI 绝对是一项单独的任务,并且可能需要相当长的时间才能正确完成。我可以简要描述一下我们在公司所做的工作,以提供一些想法。 CI 不应该提交;它会给开发人员带来奇怪的行为,因为你突然得到一个需要合并的新分支。所以,我们要做的是运行 clang-format,做一个 diff,然后检查它是否为空。但 CI 可以提供更多帮助:我们自动构建、进行静态代码分析、在所有单元测试中运行代码覆盖并创建安装包。前段时间,我创建了https://github.com/atlaste/CPPCoverage,我们还与所有单元测试一起运行它,以自动生成报告并检查一切是否仍在工作。因为我们经营一家公司,所以我们同意在主合并之间通常应该增加覆盖率(这不是强制执行的),所以随着时间的推移情况会变得更好。
好的,我们称之为 PR #2。
好的,我们称之为 PR #3。
不,编译器不是。但是,如果您有一个包含所有定义的大头文件,则每次包含基类时都必须对其进行解析(因为所有定义都在那里)。如果一个类被拆分,则需要解析的代码量非常少。 这个和上面的(PR #2 )有很多重叠,所以我会把它们结合起来。
让我们从这里开始吧,PR #4。 我想介绍更多概念:设置、机器、IO。让我们逐步执行此操作,看看哪些有效(哪些无效)。
让我们称之为 PR #5并从简单的事情开始。Easy这里定义为:把代码放到类中,变成静态成员。这样,命名将是正确的(主要原因见下文),即使代码的行为完全相同。
是的,我相信更多关于这个主题的讨论是个好主意。
一旦代码在正确的类和命名空间中,这实际上并不难。如果命名空间对应于文件夹,类对应于文件,您可以简单地浏览代码并查看需要什么。比如 剩下的是机器/设置配置和平台包括的#define。对于配置,这通常是一个 无论如何,让我们称之为 PR #6。
听起来还不错!
公关#7
公关#8
让我们删除它们。ESP32
让我从加入 Slack 开始,然后从上面的#1开始。 |
关闭….讨论移至 Slack |
地图册 评论 on 2 Aug 2020
在过去的几周里,我花了很多时间研究 grbl-esp32 代码库。其中之一是我想自己使用 GRBL/ESP32,这意味着我还必须真正了解代码库才能实现代码更改和功能。目前,我还没有触及代码的逻辑,所以它的行为应该仍然与 devt 分支相同。
只是想分享这个,尽管这仍然是一个 WIP(甚至还没有编译),并且有一些悬而未决的问题。
.clang-format
文件并将其调整为我认为的主要编码风格。它并不完美,但至少它是一致的。_
保留全局名称空间中的前缀,并且#include
CPP 文件通常被认为是一种不好的做法。在我看到这些的地方,我消除了它们。grbl.h
,基本上包括所有内容。这意味着增量编译将被破坏,因为对于每个标头更改,编译器都必须重新编译该批次。我更改了文件以包含那里需要的内容。#define
‘s 也可能是类 (const/constexpr) 变量。后者的优点是您可以获得编译时检查(因为它们是强类型的)并且它们是作用域的。实际上,我通过将代码设置为 const 来修复了一些隐式舍入错误。(就性能或内存使用而言,这并不重要)。正在进行的工作和未来的工作:
我仍然有一些我自己无法解决的悬而未决的问题:
servo_axis
和有点困惑RcServoClass
。为什么不是一切都在后者?还是这仍然是 WIP?print.cpp
功能,因为还有grbl_send
似乎更通用的变体。我正在处理的分支可以在这里找到:https ://github.com/atlaste/Grbl_Esp32/tree/CleanupDevt/Grbl_Esp32 。再次强调,这仍然是一个 WIP,甚至还没有编译;需要做更多的工作,如果可能的话,我会继续投入时间。