Господа, а вот у меня вопрос:
В G коде принтеров используется формат чисел с плавающей точкой?
Например для перемещения, вместо: "G1 X10.5 Y10 Z0.5" так:"G1 X1.05e+1 Y1e+1 Z5e-1" ???
К чему это я? Колупаю прошивку GRBL, наткнулся на жесткий косяк в виде оверхедов парсера: Прием строки символов, перевод символов в число формата int, потом перевод этого числа в формат float, а потом перевод его опять в int 

Решил посмотреть реализацию парсера в marlin и... Вощем там совсем все плохо. Если в GRBL попытались оптимизировать преобразование строки в число функцией trunc() и самописной read_float(), то в marlin тупо применили тяжеловесную strtod  
 Вот у меня и вопрос, если в G коде нет чисел с плавающей точкой (я не обнаружил), то можно заменить strtod более легковесными быстрыми функциями. Или поимею уход от стандарта? Но почему тогда в GRBL так сделали? 
Для понимания ужаса говнокода:
Парсер принимает строку "G1", символ "1" преобразует в число float, потом это число преобразуется в int и только после этого делается разбор синтаксиса оператором switch  
 - Код: Выделить всё • Развернуть
     switch((int)code_value())
    {
    case 0: // G0 -> G1
    case 1: // G1
      if(Stopped == false) {
        get_coordinates(); // For X Y Z E F
        prepare_move();
        //ClearToSend();
        return;
      }
      break;
    case 2: // G2  - CW ARC
      if(Stopped == false) {
        get_arc_coordinates();
        prepare_arc_move(true);
        return;
      }
      break;
...
float code_value()
{
  return (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL));
}