Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2018, 19:44

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:15 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2976
а добавьте в структуру ещё
unsigned c : 1;
и посмотрите что получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:28 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
Проверил, ничего не изменилось :
Цитата:
COMMON 0x0000000020000024 0xb ./src/main.o
0x0000000020000024 nbt
0x0000000020000026 q2
0x000000002000002a bit
0x000000002000002c cnt
0x000000002000002e q1

как и в первом случае размер структуры кратен самому большому элементу (в моем случае uint16_t - 2 байта). А так как второй элемент у меня однобайтовый, а выделено на него 2-ва байта, то во втором байте расположился бит C.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:36 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2976
ну тогда ((packed, align(4))) надо обязательно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:41 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2364
Посмотрите, как расположена в памяти c1 (по исходной структуре топикстартера)
Вложение:
Без-имени-1.jpg
Без-имени-1.jpg [ 76.65 Кб | Просмотров: 537 ]


Я ж говорю - великое дело - нормальный отладчик с браузером памяти. А то вот буквально в соседней теме человеки бодаются за наиболее кошерное ПО


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 21:53 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
Мы не о том говорили, у вас структура расположилась в памяти с адреса 1fe4 - то есть кратного 4-м. Но это частный случай. Так как максимальный элемент структуры 1 байт и структура объявлена packed, то она может расположиться в памяти с адреса кратного 1. А это вызовет ошибку адресации при обращении к этой памяти как к слову. _pv указал как правильно объявить структуру что бы она всегда начиналась с адреса кратного 4-м.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 22:14 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2976
но так как по размеру структура в тоже кратна только 2 байтам а не 4, то и переворачивать её придётся по 2 два байта, а не по 4, соответственно можно и вообще по одному байту переворачивать, как BusMaster в начале предложил, разницы особой не будет, а на выравнивание тогда можно вообще забить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 20 фев 2018, 22:25 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
Конечно можно, но я обратил ваше внимание на ваш конкретный случай. Где вы сначала создали структуру (packed), а потом присвоили адрес структуры 4-х байтному указателю. А переворачивать можно и побитно :) , в этой ветке даже есть код. Но быстрее всего (всего 5 тактов) это будет по 4 байта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 11:53 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 325
Ребят, спасибо за участие, но Вы отвлеклись. проблема в том, что в структуре находятся поля не кратные байту, и переворачивание хоть побайтно, хоть по словам ломает исходную информацию, так как информация попадает на границу байтов-слов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 13:16 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 2976
а какая разница где они находятся, для всей структуры бит из позиции N перевернётся в 144-N,
или надо что ли каждое поле перевернуть оставив при этом со своим смещением на старом месте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 13:55 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 325
_pv писал(а):
а какая разница где они находятся, для всей структуры бит из позиции N перевернётся в 144-N,

еслиинформация не кратна байту, то при переворачивании инфа будет испорчена на границах байта-слова:
к примеру в байте 10101100 нужная инфа, при переворачивании байта = 00110101 инфа уже другая
_pv писал(а):
или надо что ли каждое поле перевернуть оставив при этом со своим смещением на старом месте?
похоже на то


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 14:30 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
Биты переворачиваются правильно. Видно ТС сам толком не знает что нужно. Опишите всю задачу целиком. Что откуда нужно получить и куда отправить.

ЗЫ:У меня давно закрались подозрения ;), когда увидел структуру в которой CRC и утверждение что структуру нужно развернуть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 14:50 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 325
void1509 писал(а):
Биты переворачиваются правильно. Видно ТС сам толком не знает что нужно. Опишите всю задачу целиком. Что откуда нужно получить и куда отправить.

есть структура, листинг которой приводил выше, которая укладывается в массив из 18 байт, потом этот массив выдаётся побайтно в последовательный порт, для правильной работы принимающего устройства, которое принимает байты и необходим "разворот".
void1509 писал(а):
ЗЫ:У меня давно закрались подозрения ;), когда увидел структуру в которой CRC и утверждение что структуру нужно развернуть.
тка как внешнему устройству невозможно изменить логику работы и необходим разворот.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:12 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
Я пнимаю, что есть некое устройство со своим протоколом обмена. Но хотелось бы увидеть первоисточник - к примеру даташит на устройство с описанием данного протокола.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:14 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 325
void1509 писал(а):
Я пнимаю, что есть некое устройство со своим протоколом обмена. Но хотелось бы увидеть первоисточник - к примеру даташит на устройство с описанием данного протокола.

увы, нету даташита и описания протокола, закрытая инфа..., всё что мог, привёл выше.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:27 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1295
Откуда: Китай, Пекин
вот тут обсуждалось побитовое вычитывание байтового массива

в вашем случае можете прям как _pv предложил, пробежаться по 144 битам этим,
Цитата:
Код:
if src[src_offset>>3] & (1<<(src_offset++&7)) dst[dst_offset>>3] |= (1<<(dst_offset++&7)) else dst[dst_offset>>3] &= ~(1<<(dst_offset++&7));


только естественно переписав индексы dst_offset и src_offset


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:32 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 517
Похоже это из мира грёбаного юникода, который практически невозможно понять без бутылки водки.
Начнём с того что ответ железяки из мира динозавров - выглядит достаточно странно, но зато имеет хорошее описание. Последовательность получается такая:
144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129 и так далее, до нуля - это описание бит.
при этом 144,143,142,141 является одним полем, с младшим битом 141 /// 140,139,138,137,136,135 вторым полем, с младшим битом 135 , и так далее
А теперь, как они падают в память нормального компьютера:
137,138,139,140,141,142,143,144 первый байт, 129,130,131,132,133,134,135,136 второй байт
Падают именно так, хотя на экране видим "нормальную" изначальную последовательность.
И теперь к этой "нормальной" последовательности сверху накладывается структура. Естественно совпадений не будет. Для совпадения необходимо поменять байты местами - от младшего к старшему. Развернуть описание структуры. И кстати - если в документах структура заканчивается на бите 135 - то всю её необходимо сдвинуть, в начале у вас будет пустое пространство.
А потом выпить ещё водки, и забыть всё это как страшный сон.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 15:44 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
Была задача - развернуть структуру. Задача решена - было приведено несколько вариантов обработки (по байтно, по словно, по битно), но все они именно разворачивали структуру (дают один и тот же результат). В каком виде оно надо ТС - не известно. Ему казалось, что нужно развернуть структуру, может и не нужно. Оказать какую-то еще помощь не возможно, так как не известно - чего надо. Описание устройства ТС дать не может. Замкнутый круг. Получается - помогите разобраться - с чем ? - а я вам не скажу.
- Мама, жарьте рыбу !
- зятек, так нет же рыбы !
- мама - вы жарьте, рыба будет !

- Помогите разобраться !
- с чем ?
- вы помогите, с чем я сам знаю !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 17:33 
Старожил

Зарегистрирован: 26 янв 2010, 21:47
Сообщения: 325
cheblin писал(а):
вот тут обсуждалось побитовое вычитывание байтового массива

в вашем случае можете прям как _pv предложил, пробежаться по 144 битам этим,
Цитата:
Код:
if src[src_offset>>3] & (1<<(src_offset++&7)) dst[dst_offset>>3] |= (1<<(dst_offset++&7)) else dst[dst_offset>>3] &= ~(1<<(dst_offset++&7));


только естественно переписав индексы dst_offset, src_offset

по приведённой Вами ссылке на ветку форума, прочитал, можно более подробней что за индексы dst_offset, src_offset?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 18:26 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1295
Откуда: Китай, Пекин
тут был неправильный код


Последний раз редактировалось cheblin 22 фев 2018, 02:44, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 18:41 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2364
Ёбаный бегемот... Чукча не читатель... Уже сто раз обсудили обертку ассемблерных инструкций реверса бит, а тут исчо адын чел пишет еще одну ху... фигню, да еще и сопровождает замечанем "хуй знает, че сочинил".

Суть траблы у ТС: Получил поток по UART, вероятно, не в том порядке битов. Надо реверснуть порядок битов. Есть два варианта - либо в каждом полном байте порядок битов не тот, либо в полном сообщении нужно реверснуть.
Я ж в сотый раз говорю - ну посмотрите вы этот ёбаный отладчик - как биты расположились в исходном массиве и как их надо расположить так, чтобы было удобно (верно) читать/работать.
Ну youre bunny wrote, ну нахера снова писать какую-то дичь, перечисляя номера битов, как для младших школьников - 141, 140, 139 - ну ебена вошь, да всё уже и без того ясно, как ёбаный крокодил...


Последний раз редактировалось BusMaster 21 фев 2018, 19:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 19:10 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
cheblin писал(а):
вот код. сразу скажу не тестировал. основная идея понятна.
Код:
void reverse_bits(uint8_t * bytes, uint32_t bits) {
   for (int32_t i = bits >> 1; -1 < i; i--)
      if ((bytes[i >> 3] & 1 << (i & 7)) != bytes[bits - i >> 3] & 1 << (bits - i & 7))
         if (bytes[i >> 3] & 1 << (i & 7))
         {
            bytes[i >> 3] |= 1 << (i & 7);
            bytes[bits - i >> 3] |= 1 << (bits - i & 7);
         }
         else
         {
            bytes[i >> 3] &= ~(1 << (i & 7));
            bytes[bits - i >> 3] &= ~(1 << (bits - i & 7));
         }
}

Чудной у вас какой-то алгоритм
Код:
void reverse_bits(uint8_t * bytes, uint32_t bits) {
   for (int32_t i = bits >> 1; -1 < i; i--)  // счетчик от bits / 2 до -1
      if ((bytes[i >> 3] & 1 << (i & 7)) != bytes[bits - i >> 3] & 1 << (bits - i & 7)) // сравниваем биты
                                                                        //симметрично с начала счета и с конца
         if (bytes[i >> 3] & 1 << (i & 7))   // если биты не равны - проверить бит i если в 1
         {
            bytes[i >> 3] |= 1 << (i & 7);  // установить в 1 тот же бит что выше проверяли (НАФИГА???)
            bytes[bits - i >> 3] |= 1 << (bits - i & 7);  // установить бит i от окончания счета
         }
         else   // если бит i в 0
         {
            bytes[i >> 3] &= ~(1 << (i & 7)); // очистить бит i от начала счета (опять же НАФИГА ???)
            bytes[bits - i >> 3] &= ~(1 << (bits - i & 7)); // очистить бит i от окончания счета
         }
}


Вообщем самый чудной алгоритм из всех приведенных в этой ветке.
ЗЫ: Я думаю что строки с надписью НАФИГА нужно поменять местами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 21:37 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1295
Откуда: Китай, Пекин
тут был неправильный код


Последний раз редактировалось cheblin 22 фев 2018, 02:43, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 21 фев 2018, 21:59 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 2364
Да ну блин, ну что же вы, ну блин, человеки, люди, ну опомнитесь... Прекратите изобредать всякую фигню. Ну уже же обсосали и обсудили, и даже нашли наиболее короткий из вариантов! Ну есть же инструкция реверса битов в АРМ-ядре! Ну едрическая вошь, ну какого долбаного негра продолжать писать непотребную херомантию с "ифами"? Это же срань господня...
и ведь обязательно найдется еще один китайский чукча, который предложит свой "вариант" if-else a|b>>3|b<<a | ~a|b
Или вы ожидаете, что компилятор с искусственным интеллектом прочтет ваши мысли и из этого сраноподобного кода сделает красивое ассемблерное rbit??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 22 фев 2018, 07:38 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2016, 18:04
Сообщения: 1295
Откуда: Китай, Пекин
у кого не ARM, STM8 к примеру, вот проверенный код
Код:
void reverse_bits(uint8_t* bytes, uint32_t bits)
{
   int32_t i = (bits >> 1) - 1;
   bits--;
   for (; -1 < i; i--)
      if (((bytes[i >> 3] & 1 << (i & 7)) == 0) != ((bytes[bits - i >> 3] & 1 << (bits - i & 7)) == 0))
      {
         bytes[i >> 3] ^= 1 << (i & 7);
         bytes[bits - i >> 3] ^= 1 << (bits - i & 7);
      }
}


Последний раз редактировалось cheblin 22 фев 2018, 14:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: развернуть битовый массив
СообщениеДобавлено: 22 фев 2018, 13:49 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 487
ну с инверсией бит ясно, а чего это у вас за такой хитрый if. (выражение) == 0 != (выражение) == 0 честно говоря подобной записи не встречал.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 62 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB