评论
|
只是一些想法… 我最近也想知道,Marlin 是否可以或可以在运行时甚至编译时检测到内存溢出。 我注意到,当我增加 delta 打印机上的缓冲区时(只是为了尝试其行为方式),Marlin 在连接时没有回答。所以它似乎溢出了。 在打印某些对象时,我在打印中间的某个地方也没有响应。 这就是我跳进这里的原因。 我的问题似乎取决于对象和速度,两次运行的中断位置似乎相等或至少非常相似(即在同一层,但我只尝试了几次)。 这一切都没有经过很好的测试,所以结论是推测性的,但看起来可以排除其他影响(硬件、温度)。 回到检测内存需求: 如果内存使用可以被视为常量(或者说是有限的),那么它可以在编译时或运行时进行检查,例如通过将最高变量的内存地址与局部变量加上一些安全区域(可以是check_memory 函数,可以在代码中的特定位置调用)。 至少还有一个问题:哪个是“最高”变量(最接近堆栈顶部(=最低地址)的变量)?这应该依赖于编译器(链接对象的序列,不同种类的对象可以存储在不同的区域等)。但我认为,gcc 应该是 Marlin 的标准吗? 使用给定的编译器,甚至可以在编译时使用编译器定义的值(错误,但我认为这些值在链接阶段结束之前不应该是已知的……)。至少我们可以确定将“最高”变量放在哪里。 上次我为微处理器编写固件时,我没有链接源文件,但我使用了一个 main.cpp 文件,其中 #include 所有部分。这样您就可以完全控制源文件的顺序,并且可以在那里实现内存测试功能,并且 main() 也可以驻留在此处,委托给另一个内部主要功能并调用内存检查。 |
|
不确定这有多重要,但 qr_solve.cpp 包括对 malloc 的调用,显然是唯一这样做的来源。 至于你的打印失败,Cura 确实有一些有用的技巧,而且 daid 已经为你可以尝试的 Marlin 提出了一些骇人听闻的事情,但据我所知,他们不会承诺。就我个人而言,我遇到过很多通信中断和打印中断的问题,以至于我刚刚停止使用 USB,现在只使用 SD 打印。 |
|
感谢提到malloc,我没想到会在这样的固件里看到malloc,所以就没有去搜索了。 USB 故障: 我总是想知道当所有行都经过 crc 检查时,Marlin 怎么会出错,因此执行的每一行都应该是正确的,对吧?否则 Cura 应该得到一个错误并重复该行。 除了停止之外,我有时似乎打印出错误的值,例如,我的打印机在 x 方向上用完了打印区域,或者突然缩回灯丝,直到它跳出打印机顶部的鲍登挤出机。 根据直接的 x 移动,我假设移动中的 x 值被修改。 如果该值将被 USB 传输修改,则 crc 校验不太可能检测不到。 此外,我有时会收到 Marlin 登录 Cura 的错误消息,其中一个单词中的字符被修改,例如“che*ksum error”,这也可能是由 Marlin 中的内存冲突引起的。 |


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