Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
1

Битовые операции с 64 битными числами (STM32)

24.10.2019, 17:45. Показов 4279. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго Вам всем вечера, пытаюсь прочитать значение переменной unsigned long long при помощи битовой операции
C++
1
2
3
unsigned long long packet_start=0xABCDEFABCD;
packet_start&(1ULL<<15)//еще вычитывает 0x8000
packet_start&(1ULL<<16)//уже нет - 0x00
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2019, 17:45
Ответы с готовыми решениями:

Битовые операции с числами
&lt;?php ## Распаковка значений из битового поля echo &quot;Примитив: &quot; . (126076330 &amp; 3) . &quot;&lt;br...

Битовые операции с отрицательными числами и QByteArray
Накидал простенький код для объяснения ситуации. Есть цикл, в нем счетчик от -512 до 512, с...

Создание изображения на stm32 с 16 битными градациями серого
Необходимо средствами stm32f746 обработать массив данных, снятый с датчиков, преобразовав его в...

Проблема с 32 битными числами
Есть такой участок кода: uint32_t chostmoe = 0; uint8_t stepen; chostmoe += (1&lt;&lt;stepen); в...

10
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
24.10.2019, 18:05 2
а чем вы "читаете" значение бита? Огласите весь код, пожалуйста.
0
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
24.10.2019, 19:15  [ТС] 3
Весь код не оглашу, так как уже не рядом с компьютером. В unsigned long long хранится переменная EM -Marine метки. Мне надо читать именно
C++
1
2
3
4
5
6
if(packet_start&(1ULL<<39)man_one() ;
else man_zero() ;
if(packet_start&(1ULL<<38)man_one() ;
else man_zero() 
....
Потом подсчет контрольной суммы
0
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
24.10.2019, 19:38 4
GaFBich, надо получить значение бита чтоли?

C
1
2
3
4
uint8_t getBitValue(unsigned long long value, uint8_t bitNum)
{
     return (value >> bitNum) & 0x1;
}
1
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
24.10.2019, 19:45  [ТС] 5
Да значение бита, но вопрос, почему значение бита получаю до 15 сдвига и усё, а дальше на выходе 0x0.
Вот в каком-нибудь Builder C++ работает, а в Keil не хочет!?
0
Эксперт .NET
11068 / 6985 / 1571
Регистрация: 25.05.2015
Сообщений: 21,072
Записей в блоге: 14
24.10.2019, 20:48 6
Где-нибудь забыли, что приводите к типу, который такую разрядность не вмещает...

Добавлено через 1 минуту
Никто не мешает применить структуру со своими методами вместо unsigned long long, который для STM32 не родной.
0
Модератор
Эксперт по электронике
8946 / 6712 / 921
Регистрация: 14.02.2011
Сообщений: 23,681
24.10.2019, 21:38 7
а кто сказал что unsigned long long это 64 бита?
попробуй uint64_t
1
Почетный модератор
11528 / 4323 / 448
Регистрация: 12.06.2008
Сообщений: 12,424
24.10.2019, 22:57 8
Цитата Сообщение от GaFBich Посмотреть сообщение
C
1
2
3
4
if(packet_start&(1ULL<<39)man_one() ;
else man_zero() ;
if(packet_start&(1ULL<<38)man_one() ;
else man_zero()
Тут вообще ошибка синтаксиса, т.к. количество открывающихся скобок больше, чем количество закрывающихся.


Не знаю, как в Keil, но с GCC работает. Например, код:
C
1
2
3
4
5
6
7
8
9
10
11
unsigned long long aaa = 0x123456789abcdef1;
 
void blablabla(void)
{
}
 
int main(void)
{
        if (aaa & (1ULL << 39))
                blablabla();
}
При компиляции без оптимизации:
Код
arm-none-eabi-gcc -mthumb -mcpu=cortex-m3 -nostartfiles -O0 a.c
и создаём дизасемблерный файл:
Код
arm-none-eabi-objdump -S a.out > a.dis
Получается такой код: (адреса он автоматически сделал с 0x8000, потому что я не использовал линковочный скрипт... просто не надо обращать внимание на адреса)
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
; функцию blablabla() пропускаю, т.к. она пустая и вообще нас не интересует
0000800c <main>:
    800c:       e92d 4890       stmdb   sp!, {r4, r7, fp, lr}
    8010:       af00            add     r7, sp, #0
    8012:       4b09            ldr     r3, [pc, #36]   ; (8038 <main+0x2c>)
    8014:       e9d3 bc00       ldrd    fp, ip, [r3]  ; загрузить младшую часть в fp, а старшую в ip
    8018:       f04f 0100       mov.w   r1, #0   ; подготавливаются временные значения для операций and (по сути, это младшая и старшая части для (1ULL << 39))
    801c:       f04f 0280       mov.w   r2, #128        ; 0x80
    8020:       ea0b 0301       and.w   r3, fp, r1  ; отдельно делается and между младшей частью...
    8024:       ea0c 0402       and.w   r4, ip, r2  ; ...и старшей
    8028:       4323            orrs    r3, r4  ; объединяются по или
    802a:       d001            beq.n   8030 <main+0x24>  ; если получился ноль, то прыгаем дальше
    802c:       f7ff ffe8       bl      8000 <blablabla>  ; иначе переходим на функцию blablabla()
    8030:       2300            movs    r3, #0
    8032:       4618            mov     r0, r3
    8034:       e8bd 8890       ldmia.w sp!, {r4, r7, fp, pc}
    8038:       00018040        .word   0x00018040
Теперь включим оптимизацию: -O2
C
1
2
3
00008000 <main>:
    8000:       2000            movs    r0, #0
    8002:       4770            bx      lr
Оптимизатор решил, что тут бестолковые действия и выкинул их
Хорошо, добавим volatile перед объявлением aaa:
C
1
volatile unsigned long long aaa = 0x123456789abcdef1;
И внутри blablabla() сделаем какое-нибудь действие... например, "aaa = 0;"
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
00008000 <main>:
    8000:       2200            movs    r2, #0
    8002:       4908            ldr     r1, [pc, #32]   ; (8024 <main+0x24>)
    8004:       f84d bd04       str.w   fp, [sp, #-4]!
    8008:       e9d1 bc00       ldrd    fp, ip, [r1]  ; читаем младшую часть в fp, старшую в ip
    800c:       f00c 0380       and.w   r3, ip, #128    ; 0x80 ... делать and с нулём для младшей части не имеет смысла, поэтому работаем только со старшей
    8010:       4313            orrs    r3, r2  ; сделали бестолковое действие... наверное, ради установки флага для следующей инструкции
    8012:       d003            beq.n   801c <main+0x1c> ; если получился ноль, то прыгаем на 801c
    8014:       2200            movs    r2, #0  ; иначе (оптимизатор раскрыл функцию) записываем в r2 и r3 нули и сохраняем их в aaa в виде 64-битного числа
    8016:       2300            movs    r3, #0
    8018:       e9c1 2300       strd    r2, r3, [r1]
    801c:       2000            movs    r0, #0
    801e:       f85d bb04       ldr.w   fp, [sp], #4
    8022:       4770            bx      lr
    8024:       00018038        .word   0x00018038
В общем, на GCC всё работает как ожидается.
1
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
25.10.2019, 07:36  [ТС] 9
Всем спасибо, проект немного переработал, запустил на другом компьютере все запархало. Выше было написано про синтаксис (скобки), это была написано с телефона, а не взято напрямую из проекта.
0
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
25.10.2019, 12:50 10
Цитата Сообщение от GaFBich Посмотреть сообщение
переработал, запустил на другом компьютере все запархало
ну так в чем был косяк?
0
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
25.10.2019, 18:26  [ТС] 11
Вот сам не пойму, попробую еще раз с моделировать такую ситуацию, надо бекап проекта найти.
0
25.10.2019, 18:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2019, 18:26
Помогаю со студенческими работами здесь

Работа с 128 битными числами
Делаю генерацию ключей для RSA. Контроллер atmega644p. Понадобилось оперировать 128 битными...

Открытый текст и ключ заданы 32-битными числами
Ключ 3955667167 Открытый текст 1535694080 С помощью RC5-16/4/4 получить шифрованный текст....

Битовые последовательности и битовые операции
Вычислить сумму по модулю 2 всех бит в позициях, номер которых кратен 2^k. (1, 2, 4, 8, 16, 32). ...

Битовые операции, битовые поля.
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций....

Используя только битовые операции и операции арифметического сложения и вычитания вычислить выражение
Даны числа a и b. Используя только битовые операции и операции арифметического сложения и...

Используя только битовые операции и операции арифметического сложения и вычитания, вычислите число
Даны числа x и y. Используя только битовые операции и операции арифметического сложения и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru