Contact me: hankecnc@gmail.com

一种测试内存需求的方法? #704

推推 grbl 3年前 (2023-02-06) 375次浏览
关闭
thinkyhead 打开了这个问题 2014 年 1 月 10 日 · 4条评论
关闭

一种测试内存需求的方法?#704

thinkyhead 打开了这个问题 2014 年 1 月 10 日 · 4条评论

评论

一种测试内存需求的方法? #704
成员

我注意到 Twitter 上的一篇帖子抱怨最新的 Marlin 不适合 1280 板,但我不知道这有多准确。因此,我希望能够找出给定构建配置需要多少闪存和工作 RAM。Arduino 软件有助于告诉我们二进制文件有多大,但据我所知,在典型的打印过程中,固件中没有代码来报告使用情况(或空闲 RAM)。这是否可以轻松实现,也许作为状态 GCode M27 的一部分?

一种测试内存需求的方法? #704
贡献者

只是一些想法…

我最近也想知道,Marlin 是否可以或可以在运行时甚至编​​译时检测到内存溢出。

我注意到,当我增加 delta 打印机上的缓冲区时(只是为了尝试其行为方式),Marlin 在连接时没有回答。所以它似乎溢出了。

在打印某些对象时,我在打印中间的某个地方也没有响应。
我主要通过 Cura 打印 OpenSCAD 模型,所以条件应该差不多。
Cura 从 Marlin 那里得到一个错误(看起来像一个通信错误)并且最近 Cura 在那之后停止了,但是最新的 Cura 提交允许在大多数错误情况下继续(重复命令),但是 Marlin 不再回答。即使重新连接也不起作用。Marlin 在这种情况下的行为就像连接了一个太大的缓冲区。

这就是我跳进这里的原因。

我的问题似乎取决于对象和速度,两次运行的中断位置似乎相等或至少非常相似(即在同一层,但我只尝试了几次)。
较小的物体可以不间断地打印。
可能是复杂性与时间的问题。

这一切都没有经过很好的测试,所以结论是推测性的,但看起来可以排除其他影响(硬件、温度)。

回到检测内存需求:
根据我已经在代码中看到的内容,我假设内存使用量大部分是恒定的。例如,计划缓冲区是恒定的。我也没有看到函数的递归调用。

如果内存使用可以被视为常量(或者说是有限的),那么它可以在编译时或运行时进行检查,例如通过将最高变量的内存地址与局部变量加上一些安全区域(可以是check_memory 函数,可以在代码中的特定位置调用)。

至少还有一个问题:哪个是“最高”变量(最接近堆栈顶部(=最低地址)的变量)?这应该依赖于编译器(链接对象的序列,不同种类的对象可以存储在不同的区域等)。但我认为,gcc 应该是 Marlin 的标准吗?

使用给定的编译器,甚至可以在编译时使用编译器定义的值(错误,但我认为这些值在链接阶段结束之前不应该是已知的……)。至少我们可以确定将“最高”变量放在哪里。

上次我为微处理器编写固件时,我没有链接源文件,但我使用了一个 main.cpp 文件,其中 #include 所有部分。这样您就可以完全控制源文件的顺序,并且可以在那里实现内存测试功能,并且 main() 也可以驻留在此处,委托给另一个内部主要功能并调用内存检查。

一种测试内存需求的方法? #704
成员作者

不确定这有多重要,但 qr_solve.cpp 包括对 malloc 的调用,显然是唯一这样做的来源。

至于你的打印失败,Cura 确实有一些有用的技巧,而且 daid 已经为你可以尝试的 Marlin 提出了一些骇人听闻的事情,但据我所知,他们不会承诺。就我个人而言,我遇到过很多通信中断和打印中断的问题,以至于我刚刚停止使用 USB,现在只使用 SD 打印。

一种测试内存需求的方法? #704
贡献者

感谢提到malloc,我没想到会在这样的固件里看到malloc,所以就没有去搜索了。
除此之外,我只是快速浏览了代码,没有时间深入研究。

USB 故障:
通常,我可以通过 Printrun 打印与 gcode 文件相同的完整对象,因此 Cura 应该做一些不同的事情。

我总是想知道当所有行都经过 crc 检查时,Marlin 怎么会出错,因此执行的每一行都应该是正确的,对吧?否则 Cura 应该得到一个错误并重复该行。
Cura 端的日志显示正确的行,但 Marlin 的回答有误。所以我目前正在寻找可能导致这种行为的马林鱼方面的问题。

除了停止之外,我有时似乎打印出错误的值,例如,我的打印机在 x 方向上用完了打印区域,或者突然缩回灯丝,直到它跳出打印机顶部的鲍登挤出机。

根据直接的 x 移动,我假设移动中的 x 值被修改。
Delta 打印机通过将所有步进器一起移动来沿 x 方向移动,因此这不可能是由计划缓冲区中的修改或类似的东西引起的。它必须是源值(类似于 G(0|1) X)。

如果该值将被 USB 传输修改,则 crc 校验不太可能检测不到。
但是内存溢出确实可以在检查后更改堆栈上的数字,所以我现在正在朝这个方向看。

此外,我有时会收到 Marlin 登录 Cura 的错误消息,其中一个单词中的字符被修改,例如“che*ksum error”,这也可能是由 Marlin 中的内存冲突引起的。
注意,在这种情况下也可能是传输失败,因为在这个方向上没有 crc 检查。