Господа, а вот у меня вопрос:
В 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));
 }