Обработка строк с avr-gcc и


Я работаю на взаимодействие некоторых старых оборудованием позиционирования с Arduino, но проведя большую часть своей работы с высшим уровнем языка мне сложно справиться с ограничениями АВР-НКУ.

У меня есть два вопроса: это хороший способ, чтобы разобрать эту строки? Что я могу сделать, чтобы оптимизировать этот код для встраиваемых платформ?

// this is in the global scope of my program. normally accepted as bad code, 
// but it seems to make sense in the context of an embedded platform.
// "global" cache
int data[10];

void getPosition(){
    // position message is always less than 25 bytes with null termination characters
    byte bufferIndex = 0;
    char buffer[25];

    // read the position command from the serial port
    // should look like:
    //      D20BIX+00733Y+00080S99\r\n
    //  
    // and we need the X+00000 and Y+00000 parts
    //
    if (Serial.available() > 0){
        while (Serial.available() > 0 && bufferIndex < 25){
            buffer[bufferIndex] = Serial.read();

            if (buffer[bufferIndex++] == '\n'){
                buffer[bufferIndex] = '\0';
                break;
            }
        }

        Serial.flush();

        // check to see if we have good orientation on the buffer by
        // checking for lines starting with model identifier 'D'
        String input = String(buffer);

        if (buffer[0] == 'D' && bufferIndex <=24){  
            int x_result = data[1];
            int y_result = data[4];
            String check;
            char token_buffer[8] = {'0', '0', '0', '0', '0', '0', '0', '0' };

            // scan for x, target token is X+00000
            String x_token = input.substring(5, 11);
            check = x_token.substring(2, 6);
            check.toCharArray(token_buffer, 8);

            x_result = atoi(token_buffer);
            if (x_token[1] == '-'){
                x_result *= -1;
            }

            // scan for y, target token is Y+00000
            String y_token = input.substring(12, 18);
            check = y_token.substring(2, 6);
            check.toCharArray(token_buffer, 8);

            y_result = atoi(token_buffer);
            if (y_token[1] == '-'){
                y_result *= -1;
            }

            // finalize results
            data[1] = x_result;
            data[4] = y_result;
        }
    }
}


1930
3
c++
задан 18 апреля 2011 в 06:04 Источник Поделиться
Комментарии
1 ответ

ИМХО: обработка строк-это не очень хорошая идея для встраиваемых приложений. Если вы действительно заботитесь о скорости, было бы лучше использовать какой-нибудь бинарный формат ж/о динамических чисел длина и т. д.

Я предлагаю вы не можете изменить протокол из-за устаревшего кода/оборудование. Тогда вы можете попробовать превратить ваш анализатор в конечных автоматизировать. Вы просто составьте таблицу (первый индекс текущего состояния, второй показатель для класса читать тип char, значение нового государства и функции для вызова), а затем (государства, Ф) = переход[состояние][class_of[*с++]]; ф(); файлы, созданные с YACC для некоторых простых грамматик, может быть полезным.

Если вам нужно только некоторые незначительные изменения в ваш код, вы здесь.
Сначала Вы читаете данные в свой буфер. Все, что вам нужно сделать, это просто некоторые вычисления по схеме Горнера:

x_result = ((buffer[5]-'0')*10+buffer[6]-'0')*10+... ;
if (buffer[4] == '-') x_result =- x_result;

Строки конструктора, метода substring и другие строковые операции являются весьма дорогостоящими.

2
ответ дан 19 апреля 2011 в 09:04 Источник Поделиться