评论
我想我知道为什么会这样。我会尽快修复它。问题与 websocket 连接消失有关。 |
找到异常的发生点。发布 FluidNC-3.6.5-pre2 |
好吧,赶上。如果退出 Web 界面然后暂停并结束程序——也会崩溃。在第 641 行满足 Protocol.cpp |
这些与 websockets 的过早关闭是一致的。 |
遗留一个问题:在执行过程中重新连接时,G 代码 |
文件上传问题在 WebUI 代码中。我几天前修复了它,但还没有发布。 重新连接是一个很难解决的问题。问题是,当您重新连接时,FluidNC 必须通过 HTTP 将 index.html.gz 发送到浏览器。index.html.gz 存储在 FLASH 文件系统中,因此发送它需要大量的 FLASH 访问。与 RAM 访问相比,FLASH 访问非常慢。此外,FluidNC核心代码也基本存储在FLASH中;ESP32 上几乎没有足够的 RAM,尤其是指令 RAM (IRAM) 不足以容纳所有 FluidNC 代码。即使从 FLASH 中取代码,ESP32 也能通过缓存保持较高的指令执行率。不幸的是,当 ESP32 在中断处理程序中并且正在对数据进行 FLASH 访问时,缓存未命中不会正常工作,就像您尝试发送 index.html 时发生的那样。 可以标记中断例程,以便将它们永久缓存在有限数量的 IRAM 中。不幸的是,xtensa C++ 编译器存在缺陷,虚拟方法的 vtable 以及 switch 语句的跳转表都留在闪存中,而不是将它们缓存在 RAM 中。因此,如果您在 ISR 处理程序中调用虚拟方法或编写 switch 语句,当 FLASH 控制器正忙于从 index.html.gz 访问数据时,如果您碰巧在 vtable 或跳转表上发生缓存未命中,则可能会导致崩溃. 我们使用的一种缓解措施是自定义链接器脚本,该脚本将某些 vtables 强制放入 RAM。这真的很难维护,因为没有简单的方法可以找到所有必须特殊封装的模块。由于链接器脚本中的一些命名更改,当我们更改为新的编译器和框架版本时,它完全崩溃了。 另一个缓解措施是,我这样做是为了在运行时尝试重新加载 WebUI,只是将您重定向到一个页面,上面写着“抱歉,现在无法重新加载”。但有时我会关闭它,这样我就可以进行完全重新加载,以期找到需要移动的虚表。 即使使用重定向,也有很小的崩溃概率,因为必须从 FLASH 访问重定向页面 – 但它非常小,因此崩溃窗口更小。 ESP32 通过一系列技巧实现其非凡的成本/性能,当您尝试使用它构建复杂的实时系统时,很难避免掉入这些技巧之间的裂缝之一。 另一种缓解方法可能是选择从 SD 获取 index.html.gz – 但是当您尝试从一个 SD“同时”访问 index.html.gz 和 GCode 时,您可能会遇到 GCode 计时故障的可能性。它可能有效,但我可以想象一个全新的微妙问题层,让我撕掉更多的头发 – 而不会增加微小的捐赠率,这甚至不支付我在 FluidNC 上工作时喝的咖啡的费用。 另一种可能性是从主机获取 index.html.gz。这有其自身的一系列问题。 |
哦,哎哟。这是一个多处理器同步问题。当来自浏览器的 websocket 关闭时,websocket disconnect 事件触发,从活动 IO 通道列表中删除 websocket 对象,然后删除该对象。与此同时,另一个 CPU 核心正在轮询所有活动的 IO 通道,以查看是否有任何通道要发送状态,并且另一个核心上的代码已经从列表中获取了 websocket 对象指针,因此它调用了一个已删除的对象. 我必须考虑解决这个问题的最佳方法。 |
感谢您的全面回答! Offtop,我已经找了两天了,无论如何都找不到:如何在程序结束时从 G 代码中禁用步进电机? |
嗯,你太小看我了…… G代码G90 G90 $MD命令$SD/Run=/test2.g |
想通了,需要暂停一下:G04 P1 ps |
需要暂停的原因是因为 $MD 不是 GCode 命令 – NIST 标准 GCode 语言对电机一无所知。由于MD不经过GCode解释器处理,因此无法自动同步到GCode执行顺序。您需要明确地将 GCode 执行与暂停同步。 处理 GCode 行时,在获取、解析并传递给运动规划器之前,一行不会完成。预读对于确保速度和方向变化时的平稳运动是必要的。否则,机器将不得不在每个运动段之间加速和减速直至停止。 |
控制板
ESP32+OLED+SD 有无OLED不影响问题。
机器描述
驱动程序未连接。
输入电路
没有反应
配置文件
启动消息
用户界面软件
没有反应
发生了什么?
浏览器连接esp 32,执行大G代码时,一切OK结束。如果您退出浏览器,那么当您完成从 SD 卡读取后(条带结束),系统将重新启动。发生在 3.4.4 之后的版本上。
其他信息
另一个观察:从手机启动时,禁用 Wi-Fi 后,执行停止。然后崩溃。
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
闪存读取错误,1000
ets_main.c 371
ets 2016 年 6 月 8 日 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip:0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
时钟模式:DIO 1
负载:0x3fff0030,len:1184
负载:0x40078000,len:12812
负载:0x40080400,len:3032
条目 0x400805e4
[MSG:INFO Init OLED SDA:gpio.21 SCL:gpio.22]
[MSG:INFO: FluidNC v3.0.x (noGit)]
[MSG:INFO: Compiled with ESP32 SDK:v4.4.1-1-gb8050b365e]
[MSG:INFO: Local filesystem type is spiffs]
[MSG:INFO: Configuration file:config.yaml]
[MSG:INFO: Machine ESP32 Dev Controller V4]
[MSG:INFO: Board ESP32 Dev Controller V4]
[MSG:INFO: SPI SCK:gpio.18 MOSI:gpio.23 MISO:gpio.19]
[MSG:INFO: SD Card cs_pin:gpio.5 detect:NO_PIN]
[MSG:INFO: Stepping:RMT Pulse:2us Dsbl Delay:0us Dir Delay :1us 空闲延迟:255ms]
[MSG:INFO: 轴计数 3]
[MSG:INFO: 共享步进器禁用 gpio.13]
[MSG:INFO: X 轴 (10.000,1010.000)]
[MSG:INFO: Motor0]
[MSG:INFO: stepstick Step:gpio.12 Dir:gpio.14 Disable:NO_PIN]
[MSG:INFO: X All Limit gpio.17:low:pu]
[MSG:INFO: Motor1]
[MSG:INFO: Y 轴(10.000,1010.000)]
[MSG:INFO: Motor0]
[MSG:INFO: stepstick Step:gpio.26 Dir:gpio.15 Disable:NO_PIN]
[MSG:INFO: Y All Limit gpio.4:low:pu]
[ MSG:INFO: Motor1]
[MSG:INFO: Z 轴 (-990.000,10.000)]
[MSG:INFO: Motor0]
[MSG:INFO: stepstick Step:gpio.27 Dir:gpio.33 Disable:NO_PIN]
[MSG:信息:Z All Limit gpio.16:low:pu]
[MSG:INFO: Motor1]
[MSG:INFO: Kinematic system: Cartesian]
[MSG:INFO: Using spindle NoSpindle]
[MSG:INFO: STA SSID is not set]
[MSG:INFO: AP SSID FluidNC IP 192.168.0.1 mask 255.255.255.0 channel 1]
[MSG:INFO: AP started]
[MSG:INFO: WiFi on]
[MSG:INFO: Captive Portal Started]
[MSG:INFO: HTTP在端口 80 上启动]
[MSG:INFO: Telnet 在端口 23 上启动]
Grbl 3.0 [FluidNC v3.0.x (noGit) (wifi) ‘$’ for help]
[MSG:INFO: ‘$H’|’$X’ to unlock]
[MSG:INFO: Channel 自动报告间隔设置为 100 ms]
[MSG:INFO: 通道自动报告间隔设置为 100 ms]
[MSG:INFO: 注意:已解锁]
在核心 1 上的 PC 0x401a224f 处调用了 abort()
Backtrace:0x40085e25:0x3ffb22d00x4008f3b5:0x3ffb22f0 0x4009534d:0x3ffb2310 0x401a224f:0x3ffb2390 0x401a2296:0x3ffb23b0 0x401a205b:0x3ffb23d0 0x401b997d:0x3ffb23f0 0x4010c3ff:0x3ffb2410 0x4010e961:0x3ffb2430 0x400ed211:0x3ffb2450 0x400d561d:0x3ffb24b0 0x400d5766:0x3ffb24d0 0x400edada:0x3ffb2500 0x400edb79:0x3ffb2520 0x400e1d68:0x3ffb2540 0x400dc0b9:0x3ffb2560 0x400dc70e :0x3ffb2580 0x400e1dc1:0x3ffb25a0 0x400dafd2:0x3ffb25c0 0x400eb818:0x3ffb2680 0x400ec71a:0x3ffb26a0 0x400e1bed:0x3ffb27e0 0x40110ffb45:0x3
ELF 文件 SHA256:0000000000000000
重新启动…
ets 2016 年 6 月 8 日 00:22:57
rst:0xc(SW_CPU_RESET),boot:0x13(SPI_FAST_FLASH_BOOT)
configsip:0,SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
模式:DIO,时钟div 1
负载:0x3fff0030,len:1184
负载:0x40078000,len:12812
负载:0x40080400,len:3032
条目 0x400805e4
[MSG:INFO Init OLED SDA:gpio.21 SCL:gpio.22]
[MSG:INFO: FluidNC v3.0.x (noGit)]
[MSG:INFO: Compiled with ESP32 SDK:v4.4.1-1-gb8050b365e]
[MSG:INFO: 本地文件系统类型为 spiffs]
[MSG:ERR: 由于恐慌而跳过配置文件]
[MSG:INFO: 使用默认配置]
[MSG:INFO: Axes: 使用默认值]
[MSG:INFO: 机器默认值 (试驾)]
[MSG:INFO: Board None]
[MSG:INFO: SPI not defined]
[MSG:INFO: No SD Card CS Pin]
[MSG:INFO: See http://wiki.fluidnc.com/en/配置/sd_card#sdfallbackcs-access-sd-without-a-config-file%5D
[MSG:INFO: Stepping:RMT Pulse:4us Dsbl Delay:0us Dir Delay:0us Idle Delay:255ms]
[MSG:INFO: Axis count 3 ]
[MSG:INFO: X 轴 (-1000.000,0.000)]
[MSG:INFO: Y 轴 (-1000.000,0.000)]
[MSG:INFO: Z 轴 (-1000.000,0.000)]
[MSG:INFO: 运动系统: Cartesian]
[MSG:INFO: Using spindle NoSpindle]
[MSG:INFO: STA SSID is not set]
[MSG:INFO: AP SSID FluidNC IP 192.168.0.1 mask 255.255.255.0 channel 1]
[MSG:INFO: AP 已启动]
[ MSG:INFO: WiFi on]
[MSG:INFO: Captive Portal Started]
[MSG:INFO: HTTP started on port 80]
[MSG:INFO: Telnet started on port 23]
Grbl 3.0 [FluidNC v3.0.x (noGit) (wifi) ‘$’ 寻求帮助]
[MSG:INFO: ‘$H’|’$X’ 解锁]