реклама на сайте
подробности

 
 
> CRC32, uint32_t
toweroff
сообщение Mar 1 2015, 21:16
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый день!

Нужна софтовая реализация. Не проблема, гугел их находит не задумываясь

Но из того, что я находил, даже табличная реализация считает по 1 байту

А хотелось бы найти подсчет сразу по 32 бита, не по 8. Благо мой массив данных всегда кратен 4 байтам, а аппаратного CRC на борту контроллера нет
По идее, это же должно увеличить производительность? sm.gif

UPD
что-то нашел от Интела

черт... там используются 4 таблицы из uint32_t[256]
места в оперативке нет, во флеше тоже... придется побайтно считать crying.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
adnega
сообщение Mar 2 2015, 11:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Типичный кусок кода для бестабличного вычисления:
Код
for (j = 0; j < 8; j++) ...;

Не вижу причин для ускорения даже если заменить 8 на 32. Расчет-то все равно побитный.
Считайте в лоб, без таблиц - минимум по расходу памяти.
Подсчет можно вести во время получения порции данных, а не когда весь образ будет готов - вряд ли канал обновления сравниться со скоростью вычисления CRC и записи во flash. Лучше вообще считать во время записи во flash. Финальная задержка порядка времени обработки одного блока.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 2 2015, 11:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(adnega @ Mar 2 2015, 17:12) *
Типичный кусок кода для бестабличного вычисления:
Код
for (j = 0; j < 8; j++) ...;

Не вижу причин для ускорения даже если заменить 8 на 32. Расчет-то все равно побитный.

Кроме побитного и табличного есть и другие способы.
Например - табличный не по-байтный, а по-тетрадный: размер таблицы в 8 раз меньше, действий только чуть больше.
Также можно считать CRC за один проход для целого байта (без таблиц) по формуле. Но этот способ знаю только для CRC16.

Цитата(toweroff @ Mar 2 2015, 13:32) *
кстати, может я сам себе придумал геморрой проблему?
размер блока 32К, сколько там достаточно бит в CRC? может и в 16 уложусь, тогда все вопросы сами собой пропадут sm.gif

Неужто Ваш МК не может справиться с таким небольшим объёмом??
Я думал - Вы мегабайты считаете....
У нас бутлоадер тоже считает CRC32 (Cortex-M на 12МГц без PLL).
Таблично. CRC32. При каждом старте ПО. На глаз задержки старта не заметно. Даже PLL не стали включать.
Размер прошивки == почти 200кБ.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 2 2015, 14:48
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(jcxz @ Mar 2 2015, 13:38) *
Также можно считать CRC за один проход для целого байта (без таблиц) по формуле. Но этот способ знаю только для CRC16.
Я знаю для CCITT (полином 0x8408), XMODEM (полином 0x1021). Давайте меняться? В примере применения от первых scenix (виртуальная периферия IrDA) было вскользь упомянуто как они получили такую формулу для 0x8408, но тогда я эту методику не осилил, а сейчас то описание потерялось и не гуглится sad.gif

Добавлено: нагуглил. Да, и тогда не понял, и сейчас не осиливаю.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 2 2015, 14:55
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Mar 2 2015, 20:48) *
Я знаю для CCITT (полином 0x8408), XMODEM (полином 0x1021). Давайте меняться? В примере применения от первых scenix (виртуальная периферия IrDA) было вскользь упомянуто как они получили такую формулу для 0x8408, но тогда я эту методику не осилил, а сейчас то описание потерялось sad.gif

Я как раз для 0x1021 и знаю только wink.gif
Код
//Расчёт CRC16 полином == 0x1021
u32 CRC16(void const *buf, int len, u32 crc)
{
  u8 const *p = (u8 const *)buf;
  while (--len >= 0) {
    u32 c = crc << 16 >> 24 ^ *p++;
    c ^= c >> 4;
    crc = crc << 8 ^ c ^ c << 5 ^ c << 12;
  }
  return crc & 65535;
}

на вход crc - начальное значение (0 или ~0) или результат от CRC16() предыдущего региона в цепочке регионов

Вот-бы для CRC32 найти! sm.gif

PS: Хотя нет - знаю ещё одну формулу для другого CRC16, но не знаю какой полином (данная CRC используется в наших устройствах работающих по нашему собственному протоколу).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 2 2015, 16:16
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(jcxz @ Mar 2 2015, 16:55) *
Я как раз для 0x1021 и знаю только wink.gif
Ну да, у меня такая же:
Код
void crc::ccitt::calculate(uint8_t byte)
{
    base Current_tmp = Current ^ byte;

    uint_fast8_t Tmp= (Current_tmp ^ (Current_tmp << 4)) & 0xff;
    Current = (Current_tmp >> 8) ^ (Tmp << 8) ^ ( Tmp << 3) ^ ( Tmp >> 4);
}

void crc::xmodem::calculate(uint8_t byte)
{
    base Current_tmp = Current;
    uint_fast8_t Tmp = ((Current_tmp >> 8) ^ byte) & 0xFF;
    Tmp ^= Tmp >> 4;
    Current = (Current_tmp << 8) ^ (Tmp << 12) ^ (Tmp << 5) ^ Tmp;
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- toweroff   CRC32   Mar 1 2015, 21:16
- - VAI   Вот 2 функции, одна "железная" для STM32...   Mar 2 2015, 05:49
- - toweroff   Спасибо! У меня не STM и не старшие кортексы ...   Mar 2 2015, 06:50
|- - blackfin   Цитата(toweroff @ Mar 2 2015, 09:50) Эта ...   Mar 2 2015, 07:05
|- - toweroff   Цитата(blackfin @ Mar 2 2015, 10:05) Там,...   Mar 2 2015, 07:32
- - ViKo   А вы перешлите второй раз прошивку для верификации...   Mar 2 2015, 08:14
|- - toweroff   Цитата(ViKo @ Mar 2 2015, 11:14) А вы пер...   Mar 2 2015, 10:48
|- - VAI   Цитата(ViKo @ Mar 2 2015, 12:14) А вы пер...   Mar 2 2015, 11:02
|- - toweroff   Цитата(VAI @ Mar 2 2015, 14:02) Запись же...   Mar 2 2015, 11:20
|- - toweroff   Цитата(jcxz @ Mar 2 2015, 14:38) У нас бу...   Mar 2 2015, 11:55
- - ViKo   Кусками или целиком - какая разница? Сначала запис...   Mar 2 2015, 11:18
- - SM   Для CRC-32 такие конструкции категорически не выго...   Mar 2 2015, 17:13
|- - Сергей Борщ   Цитата(SM @ Mar 2 2015, 19:13) Для CRC-32...   Mar 3 2015, 07:54
|- - SM   Цитата(Сергей Борщ @ Mar 3 2015, 10:54) о...   Mar 3 2015, 08:11
|- - Сергей Борщ   Цитата(SM @ Mar 3 2015, 10:11) Это что зн...   Mar 3 2015, 09:08
- - SM   в общем, объясню на примере 0x8408: 1) byte ^= cr...   Mar 3 2015, 10:49
- - Сергей Борщ   Такс. Я разобрался. 0x8408, сдвиг вправо. За время...   Mar 3 2015, 12:24
|- - SM   Цитата(Сергей Борщ @ Mar 3 2015, 15:24) Т...   Mar 3 2015, 12:50
|- - Сергей Борщ   Цитата(SM @ Mar 3 2015, 14:50) Короче, им...   Mar 3 2015, 14:06
|- - SM   Цитата(Сергей Борщ @ Mar 3 2015, 17:06) Н...   Mar 3 2015, 14:23
|- - Сергей Борщ   Цитата(SM @ Mar 3 2015, 16:23) То есть, 0...   Mar 3 2015, 16:05
- - toweroff   Подниму тему вот по какому вопросу Когда пользова...   Mar 11 2015, 18:34
|- - SM   Цитата(toweroff @ Mar 11 2015, 21:34) но ...   Mar 11 2015, 18:49
- - toweroff   Да суть-то не в этом - с нулем или константой срав...   Mar 11 2015, 18:58
|- - SM   Цитата(toweroff @ Mar 11 2015, 21:58) Есл...   Mar 11 2015, 19:04
|- - toweroff   Цитата(SM @ Mar 11 2015, 22:04) Эту конст...   Mar 11 2015, 19:32
|- - SM   Цитата(toweroff @ Mar 11 2015, 22:32) хмм...   Mar 11 2015, 19:42
- - toweroff   Так. Не получается у меня, или я не так понял. [...   Mar 11 2015, 20:12
|- - SM   Цитата(toweroff @ Mar 11 2015, 23:12) рас...   Mar 12 2015, 08:45
- - ViKo   Пользуюсь аппаратным CRC32 в STM32, никаких перест...   Mar 12 2015, 03:51
|- - toweroff   Цитата(ViKo @ Mar 12 2015, 06:51) Пользую...   Mar 12 2015, 04:48
- - ViKo   В аппаратном CRC STM32 перед началом расчета нужно...   Mar 12 2015, 06:16
- - toweroff   Вот о чем я и говорил - если не инвертировать, то ...   Mar 12 2015, 09:58
|- - SM   Цитата(toweroff @ Mar 12 2015, 12:58) Вот...   Mar 12 2015, 10:02
- - toweroff   Просто может возникнуть необходимость проверить ...   Mar 12 2015, 11:09


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 07:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016