Двоичное редактирование, ведущее к удалению ранее добавленного двоичного числа - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть прошивка C для устройства, которое отправляет набор из 6 флагов, закодированных в двоичном виде, в настольное приложение. В данный момент микропрограмма создает переменную unsigned int, в которой она пытается добавить к ней шесть чисел в диапазоне от 0 до 30, закодированных в 5 битах. Код, подобный используемому, следующий:

KVAr_estagios_1_to_6 =  1;    
KVAr_estagios_1_to_6 =  KVAr_estagios_1_to_6 + (2 * (0x00000020));
KVAr_estagios_1_to_6 =  KVAr_estagios_1_to_6 + (3 * (0x00000400));
KVAr_estagios_1_to_6 =  KVAr_estagios_1_to_6 + (4 * (0x00008000));
KVAr_estagios_1_to_6 =  KVAr_estagios_1_to_6 + (5 * (0x00100000));
KVAr_estagios_1_to_6 =  KVAr_estagios_1_to_6 + (6 * (0x02000000));

Выполняя тесты, я обнаружил, что первое из шестизначных чисел всегда получается неправильным: оно всегда было нулевым независимо от значения, которое было ему установлено (в моем примере кода выше, 1). Более того, это произошло только после шестой, последняя строка была добавлена ​​в код; Если было сделано только 5 добавлений, проблем не возникает.

Таким образом, в приведенном выше примере кода я ожидаю увидеть десятичное число 206703681, которое будет отображаться эквивалентно двоичному 001100010100100000110001000001. Однако вместо этого оно показывает 20670368 0 или 110001010010000011000100000 0 . И если я решу не вставлять последнюю строку кода (KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));), проблема исчезнет, ​​и первый номер будет правильно установлен, но теперь отсутствует последний флаг, который я хочу отправить.

Я пробовал много разных способов сделать бинарное сложение без успеха. У меня сложилось впечатление, что какая-то дополнительная информация «переполняет» переменную, чего не должно происходить, так как я работаю с unsigned int, то есть доступно 32 бита.

Любая помощь приветствуется. Не стесняйтесь делать уточняющие вопросы; описать происходящее было нелегко.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Прежде всего, извините, если я не смог правильно описать свою проблему. Это даже не тот тип программирования, с которым я обычно работаю.

Моему коллеге удалось выяснить, в чем была проблема: в определенный момент информация преобразовывалась в переменную типа float, и это каким-то образом облажало ситуацию. Вероятно, это связано с битами, используемыми для десятичного представления, хотя я не уверен, как сработала проблема, поскольку преобразование выполнялось независимо от объявления шестого числа. Когда плавающее преобразование было удалено, проблема перестала появляться, и теперь все работает нормально.

0 голосов
/ 03 сентября 2018

Невозможно воспроизвести (см. Код ниже).

int main() {
    uint32_t result = 0;
    for(int i=0; i<6; i++) {
        uint32_t factor = 1 << (i*5); // left shift 1 by "i times 5 bits"
        result += (i+1)*factor;
        printf("factor for position %d: %08X\n",i+1,factor);
    }

    printf("result: %u\n",result);

    for(int i=0; i<6; i++) {
        uint32_t value = result & 0x1F;
        printf("value for position %d: %d\n",i+1,value);
        result >>= 5;
    }
}

Выход:

factor for position 1: 00000001
factor for position 2: 00000020
factor for position 3: 00000400
factor for position 4: 00008000
factor for position 5: 00100000
factor for position 6: 02000000
result: 206703681
value for position 1: 1
value for position 2: 2
value for position 3: 3
value for position 4: 4
value for position 5: 5
value for position 6: 6
...