注释
@terjeio: 我知道这个潜在的问题。它实际上已经存在了几年,至少直到现在还没有人注意到。然而,遗漏某些事件的情况应该极为罕见,因为这些事件必须在彼此相隔几微秒的时间内发生,才能不被处理。 虽然我真的很喜欢你的简单解决方案,但我对是否实施它犹豫不决,因为我不能 100% 确定不会以某种意想不到的方式影响状态机。需要在极端情况下进行大量测试,以确保发现并处理任何边缘情况。 |
在考虑对我自己的 32 位版本进行此更改时(由于 MHz 的增加,它似乎更容易显示问题)按照 terjeio 所说的那样做是否合适,然后立即复制回 rt_exec = sys_rt_exec_state 并“转到”一个新的如果对这 4 项进行测试,则在打开前插入标签,是否要重试?(是的,没有人喜欢“goto”,但我只是想知道这是否涵盖任何边缘情况?) 再一次,虽然我在这里看到了潜在的问题,但我没有看到可能存在哪些边缘情况不会在 OP 中提到的代码行(通过讨厌的“随时”中断)之后立即引起问题。 |
(实际上,将“if”改为“while”就不需要“goto”了) |
我已将读取变量的代码更改为原子读取和清除,以使其更加健壮:
有关详细信息,请参阅我的 github 帐户上的分支。 |
这是一个很好的解决方案。 顺便说一句,查看了您的帐户后,您可能对https://github.com/oilulio/Cisolate感兴趣(这不是我的,但那家伙确实为我解决了很多问题 – 它之前已经生产出良好的 PCB那个 – 自动钻孔 gcode 是让我着迷的东西)。 |
第 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));
为了避免丢失事件?