开源改变世界

重新审视更快地传输到 SD 卡 #830

推推 grbl 3年前 (2023-02-06) 235次浏览
关闭
whosawhatsis 打开了这个问题 2014 年 3 月 12 日 · 24条评论
关闭

重新审视更快地传输到 SD 卡#830

whosawhatsis 打开了这个问题 2014 年 3 月 12 日 · 24条评论

评论

重新审视更快地传输到 SD 卡 #830
贡献者

通过 USB 连接将 gcode 传输到 SD 卡总是太慢而不实用。通常,将卡移至计算机以传输 gcode,然后再将其移回打印机开始打印,但我一直在考虑一些更方便的替代选项。

首先,我们应该考虑是否可以加快转移速度。@bkubicek在https://github.com/ErikZalm/Marlin/issues/382中提到,如果你有 512B 的内存来存储块,应该可以将块传输到 SD 卡。可以在具有 4K RAM 的 Atmega644P 上运行 Marlin,但这些已经变得非常罕见,我知道现在常用的所有芯片(Atmega1284、Atmega1280、Atmega2560 和 At90USB1286)都有 8K RAM,所以看起来我们应该为此目的准备半K。

串行连接当然也是一个限制因素,但我读到因为 At90USB1286 是它自己的 USB > 串行转换器,数据速率实际上从未减慢到串行波特率,所以 USB 1.1“全速”速率高达12Mbit/s 理论上应该是可以的。然而,我已经用当前代码对此进行了测试,并且发现在基于 AT90USB1286 的板上将文件传输到 SD 所花费的时间与使用 Atmega2560 和 FT252RL 以 250000 波特进行 USB > 串行转换所花费的时间没有明显的速度差异,这表明用于写入 SD 卡的方法目前是瓶颈。

我的另一个想法是在完成写入之前从文件开始打印。这将使传输速率变得不那么重要,因为您不必在开始打印之前等待传输完成,只需在断开 USB 连接之前。UP 打印机使用这样的系统(写入某些不可移动的存储设备)开始打印,同时仍在写入文件。我查看了代码,看起来目前无法正常工作,因为通过 USB 的数据流将阻止从 SD 读取数据,直到完成为止。通常最好让 USB 命令优先于 SD,

想法?

重新审视更快地传输到 SD 卡 #830

好主意;心存善念;睿智哲思。

据我所知SD卡接口是SPI。如果由硬件 SPI 模块处理,则全速应该是可能的。如果您有逻辑分析仪或示波器,请检查 SPI 线上的暂停。MOSI ans SCK 线应该一直在变化。如果他们有暂停,那么 SPI 速度可能会增加。(对不起,我不能自己检查)

要在保存文件的同时开始打印,您还需要同时读取和写入。所以写文件的结尾会读文件的开头。这也需要考虑到 SPI 数据速率估计和软件实现。

在 USB 端不要指望达到 12Mbit/s。USB 协议使用一些包装。它还取决于发送到设备的块的大小。使用“lsusb -vv”可以告诉您使用的数据包大小。对于 Arduino Mega2560,它是每毫秒一次 64 字节数据包。你不会得到更多。如果固件报告相同的值,您可能需要检查它。

另一个大问题是优先权转移。正如我所见(我不太熟悉代码),优先级是通过在 ISR 中执行重要的操作而在主例程中执行其余操作来实现的。因此需要添加优先机制。您可能会移动函数中的功能,然后从 ISR 或主例程调用该函数。但我假设那里有很多收养工作。

重新审视更快地传输到 SD 卡 #830
贡献者作者

我的理解是 ISR 只处理步进器和时序。其余的(从串行/SD 读取 gcode,向规划器发送移动,规划器自己的处理等)在常规程序时间内完成。

重新审视更快地传输到 SD 卡 #830

请查看从第 313 行开始的 stepper.cc://
“步进驱动程序中断”- 此定时器中断是主力。
在第 545 行(是的,仍然是 ISR)它有这个:
MSerial.checkRx(); // 检查串行字符。

正如我所说,我不太喜欢代码。但我的理解是,大量的处理时间花在了 ISR 上。绝对超过您对一般项目的期望。

UART 的问题是硬件只缓冲一个字节并且没有流量控制。所以 Marlin 必须在下一个字节到达之前读取那个字节。在 USB 端,可能会延迟读取数据(通过延迟 ACK 来控制 USB 流量?),但您可能必须调整 USB 堆栈才能做到这一点。在深入研究之前,请确保有一个可用的 USB Spy。

重新审视更快地传输到 SD 卡 #830

关于 SD 的问题 — 对于其他系统,以手机为例 – 从 gui/PC 将 SD 视为外部 PC HD 或由外部设备在内部使用。是否可以从外部触发 Marlin 进行切换,以便在复制到 SD 时将 SD 变为外部 HD – 然后 – 根据触发命令重置系统以将 SD 设备放回固件的本地存储?

重新审视更快地传输到 SD 卡 #830
贡献者作者

@bstott以 AVR(尤其是没有本地 USB 支持的 AVR)作为中介,可能不是。对于像 printrboard 这样的单芯片板,它可能可以工作,但您可能必须断开串行连接才能使其工作,这可以说与移动 SD 卡一样不便。

重新审视更快地传输到 SD 卡 #830

@whosawhatsis不需要断开串口。USB 将此称为“复合设备”,即具有多种设备类型的设备。因此串行线 (CDC) 和 USB 棒 (大容量存储) 的组合是可能的。我为另一个项目实现了它。

因此,对于带有原生 USB 的 AVR,这是可能的。在双芯片解决方案中,问题是两个芯片都想同时与 SD 卡通信,这将是有问题的。

但是你仍然需要在 AVR 上有足够的计算能力,否则它会很慢而且什么也赢不了。

重新审视更快地传输到 SD 卡 #830
贡献者作者

AVR 上的计算能力问题就是我所指的。我知道 ARM 芯片可以将自己呈现为复合设备。

重新审视更快地传输到 SD 卡 #830
贡献者

您可以使用便宜的 USB 转 SD 适配器并将引脚与 Arduino 混合使用,这样
它就可以释放卡并使其在 PC 上显示为大容量存储,然后
将其取回以从中读取。适配器可能会被误认为该
卡已被插入并再次取出,因此它可以很好地与
PC 的操作系统配合使用。

在 2014 年 3 月 18 日 08:43,whosawhatsis notifications@github.com写道:

AVR 上的计算能力问题就是我所指的。我知道
ARM 芯片可以将自己呈现为复合设备。

直接回复此电子邮件或在 GitHub 上查看它 https://github.com/ErikZalm/Marlin/issues/830#issuecomment-37909922

重新审视更快地传输到 SD 卡 #830
贡献者作者

@nophead这将是一个聪明的 hack,但我认为最好是想出一个在生产环境中更实用的系统,一些对使用 Marlin 的人甚至不知道它的人有用的东西,而不仅仅是我们黑客.

重新审视更快地传输到 SD 卡 #830
贡献者

通过 8 位微型 USB 从全速 USB 到异步串行再到 SPI,您将永远无法获得与 USB 高速到 4 位 SD 接口相同的速度。

您可以购买微型 SD 插槽扩展器,因此实际上只需切割和拼接其中一个即可。

重新审视更快地传输到 SD 卡 #830
贡献者作者

@nophead我不建议尝试通过将卡移动到通过 USB 连接的真实读卡器来获得全速。我的建议是找到一种方法使其足够快,以便在不这样做的情况下实用。

重新审视更快地传输到 SD 卡 #830
贡献者

是的,必须有一些改进的余地。我通过 USB 从 250kb 的 RPI 获得不到 3k 字节/秒,但通过 RPI 的直接串口以 115200kb 获得更多。

重新审视更快地传输到 SD 卡 #830
贡献者作者

此外,如果我们让 print-while-uploading 工作,上传速度慢也没关系。

重新审视更快地传输到 SD 卡 #830

作为复合设备呈现不依赖于性能。如前所述,我之前在 AVR 上实现了一个复合设备。但是这些设备的速度只会达到 CPU 可以管理的速度。大容量存储可能比 CDC 和 marlin 的串行馈送更快,因为 64 字节的大容量存储块只会出现在 USB 缓冲区中,而 CPU 将“只”需要将它们复制到 SD 卡。每字节更少的工作意味着更高的数据吞吐量和有限的可用性能。

但是,由于您专注于在上传时打印,因此创建一个发送完整文件的新 G 代码可能是最简单的方法,而 Marlin 只是开始打印它并将其存储到 SD 卡中。这样,唯一的限制是 Marlins 串行线速度,..

@nopheadUSB 以数据包的形式发送数据。通常每毫秒一个数据包。USB 主机要么等待更多数据来填充数据包,要么发送小的半填充数据包,甚至两者都发送,这会降低吞吐量。小数据包的大小为 8 字节。非常糟糕正在等待答复。因此,在发送下一行之前发送 G 代码并等待 OK 是 USB 上的一个比单独使用串行更大的问题。

重新审视更快地传输到 SD 卡 #830
贡献者

你不需要告诉我 USB 是如何工作的。我已经自下而上地实现了实时嵌入式 USB 主机和从机驱动程序。我还在 FPGA 中实现了 SPI 到 SD 和完整的 4 位 SD 接口,编写了大容量存储驱动程序等。

进行批量传输时,不限于每帧发送 1 个数据包。问题正如您所说,从流转换为数据包再转换为流。然而,即使是每毫秒 64 个字节,也比目前达到的速度快 20 倍左右。

重新审视更快地传输到 SD 卡 #830

也许可以使用像http://cz.mouser.com/Search/ProductDetail.aspx?qs=ffX8NcjNb2QQoal8dGQl8g%3d%3d
这样的东西…… 或者简单地连接几个继电器来备用风扇输出;-)

重新审视更快地传输到 SD 卡 #830 boelle 添加 公关:改进 T:功能请求 用户要求的功能。标签 2014 年 12 月 20 日
重新审视更快地传输到 SD 卡 #830
贡献者

嗯,我首先设置了标签……然后是的……快速复制东西的唯一方法是移动 SD 卡……通过串行上传只会非常快……

我想知道是否不应该关闭这个,因为增加 spds 没有那么多事情要做?

重新审视更快地传输到 SD 卡 #830
贡献者作者

@boelle提高传输速度没什么可做的,但我仍然认为边打印边上传的想法是缓解这一事实的好方法。

重新审视更快地传输到 SD 卡 #830
贡献者

打印机可能会耗尽命令这一事实又会怎样呢?那将意味着打印失败….

我也可能是错的,但你不能同时读写……

重新审视更快地传输到 SD 卡 #830

我认为这里的共识是使用内置 USB 支持的 CPU 并使用此 USB 而不是串行线。
这意味着这仅适用于具有此类 CPU 的主板。目前运行 Marlin 的大多数董事会不会从这一改进中受益。没有人开始实施它。
因此,我建议关闭它。
PS:您可以同时读写 UART,从 SD 读取应该足够快以交错读取和写入,因为打印读取可能非常慢。

重新审视更快地传输到 SD 卡 #830
贡献者

是的,但是你可以读写 sd 卡上的同一个文件吗?即在打印过程中在读取同一个文件时写入同一个文件?….

如果你做不到那么我 99.99% 会想关闭它

重新审视更快地传输到 SD 卡 #830

对 SD 卡的读写是字节级的。比如给我字节 500。然后将 0x12 写入字节 725。

创建文件后,文件的第一个字节是已知的,可以从该字节开始读取。写入例程可以跟踪是否写入了新字节。

所以读写同一个文件是没有问题的。

重新审视更快地传输到 SD 卡 #830
贡献者

但我是否正确,打印机打印数据的速度可能比获取新数据的速度快?

但是,是的……我想无论如何我都会关闭这个,如果有人解决了这个“问题”,那么我建议他们只做一个拉取请求,我们可以合并它……