开源改变世界

protocol_exec_rt_system() 中的潜在错误代码? #173

推推 grbl 3年前 (2023-01-21) 249次浏览

打开
terjeio 打开了这个问题 2017 年 4 月 16 日 · 5 条评论
打开

protocol_exec_rt_system() 中的潜在错误代码?#173

terjeio 打开了这个问题 2017 年 4 月 16 日 · 5 条评论

注释

protocol_exec_rt_system() 中的潜在错误代码? #173

第 327 行:

system_clear_exec_state_flag((EXEC_MOTION_CANCEL | EXEC_FEED_HOLD | EXEC_SAFETY_DOOR | EXEC_SLEEP));

应该改成

system_clear_exec_state_flag(rt_exec & (EXEC_MOTION_CANCEL | EXEC_FEED_HOLD | EXEC_SAFETY_DOOR | EXEC_SLEEP));

为了避免丢失事件?

protocol_exec_rt_system() 中的潜在错误代码? #173
贡献者

@terjeio: 我知道这个潜在的问题。它实际上已经存在了几年,至少直到现在还没有人注意到。然而,遗漏某些事件的情况应该极为罕见,因为这些事件必须在彼此相隔几微秒的时间内发生,才能不被处理。

虽然我真的很喜欢你的简单解决方案,但我对是否实施它犹豫不决,因为我不能 100% 确定不会以某种意想不到的方式影响状态机。需要在极端情况下进行大量测试,以确保发现并处理任何边缘情况。

protocol_exec_rt_system() 中的潜在错误代码? #173

在考虑对我自己的 32 位版本进行此更改时(由于 MHz 的增加,它似乎更容易显示问题)按照 terjeio 所说的那样做是否合适,然后立即复制回 rt_exec = sys_rt_exec_state 并“转到”一个新的如果对这 4 项进行测试,则在打开前插入标签,是否要重试?(是的,没有人喜欢“goto”,但我只是想知道这是否涵盖任何边缘情况?)

再一次,虽然我在这里看到了潜在的问题,但我没有看到可能存在哪些边缘情况不会在 OP 中提到的代码行(通过讨厌的“随时”中断)之后立即引起问题。

protocol_exec_rt_system() 中的潜在错误代码? #173

(实际上,将“if”改为“while”就不需要“goto”了)

protocol_exec_rt_system() 中的潜在错误代码? #173
作者

我已将读取变量的代码更改为原子读取和清除,以使其更加健壮:

if (sys_rt_exec_state && (rt_exec = system_clear_exec_states())) { // Get and clear volatile sys_rt_exec_state atomically. ...

有关详细信息,请参阅我的 github 帐户上的分支。

protocol_exec_rt_system() 中的潜在错误代码? #173

这是一个很好的解决方案。

顺便说一句,查看了您的帐户后,您可能对https://github.com/oilulio/Cisolate感兴趣(这不是我的,但那家伙确实为我解决了很多问题 – 它之前已经生产出良好的 PCB那个 – 自动钻孔 gcode 是让我着迷的东西)。

喜欢 (0)