开源改变世界

为什么 $$ 需要空闲状态? #820

推推 grbl 2年前 (2023-01-23) 90次浏览

关闭
J-Dunn 打开了这个问题 2015 年 10 月 15 日 · 8条评论
关闭

为什么 $$ 需要空闲状态?#820

J-Dunn 打开了这个问题 2015 年 10 月 15 日 · 8条评论

注释

为什么 $$ 需要空闲状态? #820

如果机器正在移动,发出 $$ 请求会得到“not idle”响应。为什么?

那里似乎没有任何无效且独立于轴运动的内容。OTH,在相关轴的移动过程中,任何以 $ 开头的参数设置命令都可以合法地被拒绝。

在手动控制期间,能够在可能较长的运动期间询问机器参数作为确认或作为编写进一步命令的前奏是有用的。$$ 拒绝只是对所有 $ 命令的一揽子阻止,还是有原因?

为什么 $$ 需要空闲状态? #820
成员

@J-Dunn: 是的。这是有充分理由的。打印和发送消息的时间太长。

为什么 $$ 需要空闲状态? #820
作者
      if ( sys.state & (STATE_CYCLE | STATE_HOLD) ) { return(STATUS_IDLE_ERROR); }
         // Block during cycle. Takes too long to print.

啊是的,我忘了我读过那条评论。

  // Wait until there is space in the buffer
  while (next_head == serial_tx_buffer_tail) { 

是的,我可以看到如果 128 字节缓冲区已满,宁愿加载处理器!
除了基本的 GRBL 定时器外,它将锁定芯片。它具有调用 ISR 的所有开销,只是为了写入一个 IO 寄存器。如果这就是它所做的全部,您也可以简单地轮询 UDRE0。

也许这可以以更有效的方式完成。GRBL 中有一些非常清晰、优化的代码,这一点似乎有些杂乱无章。(那里有很多 TODO,所以我需要一些帮助。)

是否有一些基本的、非中断的步进代码被这个循环阻塞了?

测试:设置一个轴运行并在恒速段期间发送一系列几个 $$ 命令,因此不调用 st_prep_buffer()。示波器显示所有步进脉冲停止。我显然遗漏了一些东西,但我不明白为什么即使非 ISR 代码被锁定在 serial_write() 的 while 循环中,步进中断也不会完成它们的工作,

谢谢

    // TODO: Restructure st_prep_buffer() calls to be executed here during a long print.    

这很好,但似乎无法解释为什么它会在不需要重新计算的恒速段上冻结步进脉冲。

为什么 $$ 需要空闲状态? #820
作者

深入了解 TX 阻塞,我发现了一个小的代码大小增益:

  // enable rx and tx
// UCSR0B |= 1<<RXEN0;
//  UCSR0B |= 1<<TXEN0;

  // enable interrupt on complete reception of a byte
//  UCSR0B |= 1<<RXCIE0;
  UCSR0B |= 1<<RXCIE0 | 1<<TXEN0 |1<<RXEN0;

12 个字节。每一点都很重要;)

为什么 $$ 需要空闲状态? #820
成员

@J-Dunn: 感谢代码提示。

为什么 $$ 需要空闲状态? #820
作者

别客气。;)
你能指出我在串行阻塞中遗漏了什么吗?它不明白为什么 ISR(TIMER1_COMPA_vect) 等在 ISR(SERIAL_UDRE) 中重新启用中断时似乎没有被调用。主线程中是否需要发生某些事情来保持脉冲继续运行?

快速指针会有所帮助。

为什么 $$ 需要空闲状态? #820
成员

@J-Dunn:请参阅 serial.c 中的第 91 行。

为什么 $$ 需要空闲状态? #820
作者

谢谢,我意识到这是目前缓慢且低效的,我可能会写一些东西来至少一次处理 PGMstrings。但我仍然希望在每个 TX 字节之间至少从定时器获得一个脉冲,但它似乎完全阻塞。

一旦它处于恒速段,定时器不应该继续发射并脉冲 STEP 输出吗?

为什么 $$ 需要空闲状态? #820
作者
The number of segments "checked-out" from the segment buffer and the number of segments in
   the segment buffer are sized such that no operation in the main program takes
   longer than the time it takes the stepper algorithm to empty the segment buffer. 

除了串行输出!

   Currently, the segment buffer conservatively holds roughly up to 40-50 msec of steps.

所以 st_prep_buffer() 需要每 40 毫秒调用一次,并且在主线程中被阻塞:

while (next_head == serial_tx_buffer_tail)

我会考虑重构它是否值得。

喜欢 (0)