|
CRC32, uint32_t |
|
|
|
Mar 1 2015, 21:16
|

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

|
Добрый день! Нужна софтовая реализация. Не проблема, гугел их находит не задумываясь Но из того, что я находил, даже табличная реализация считает по 1 байту А хотелось бы найти подсчет сразу по 32 бита, не по 8. Благо мой массив данных всегда кратен 4 байтам, а аппаратного CRC на борту контроллера нет По идее, это же должно увеличить производительность?  UPD что-то нашел от Интела черт... там используются 4 таблицы из uint32_t[256] места в оперативке нет, во флеше тоже... придется побайтно считать
|
|
|
|
|
 |
Ответов
|
Mar 2 2015, 11:12
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Типичный кусок кода для бестабличного вычисления: Код for (j = 0; j < 8; j++) ...; Не вижу причин для ускорения даже если заменить 8 на 32. Расчет-то все равно побитный. Считайте в лоб, без таблиц - минимум по расходу памяти. Подсчет можно вести во время получения порции данных, а не когда весь образ будет готов - вряд ли канал обновления сравниться со скоростью вычисления CRC и записи во flash. Лучше вообще считать во время записи во flash. Финальная задержка порядка времени обработки одного блока.
|
|
|
|
|
Mar 2 2015, 11:38
|
Гуру
     
Группа: Свой
Сообщений: 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 уложусь, тогда все вопросы сами собой пропадут  Неужто Ваш МК не может справиться с таким небольшим объёмом?? Я думал - Вы мегабайты считаете.... У нас бутлоадер тоже считает CRC32 (Cortex-M на 12МГц без PLL). Таблично. CRC32. При каждом старте ПО. На глаз задержки старта не заметно. Даже PLL не стали включать. Размер прошивки == почти 200кБ.
|
|
|
|
|
Mar 2 2015, 14:48
|

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

|
Цитата(jcxz @ Mar 2 2015, 13:38)  Также можно считать CRC за один проход для целого байта (без таблиц) по формуле. Но этот способ знаю только для CRC16. Я знаю для CCITT (полином 0x8408), XMODEM (полином 0x1021). Давайте меняться? В примере применения от первых scenix (виртуальная периферия IrDA) было вскользь упомянуто как они получили такую формулу для 0x8408, но тогда я эту методику не осилил, а сейчас то описание потерялось и не гуглится  Добавлено: нагуглил. Да, и тогда не понял, и сейчас не осиливаю.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Mar 2 2015, 14:55
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Сергей Борщ @ Mar 2 2015, 20:48)  Я знаю для CCITT (полином 0x8408), XMODEM (полином 0x1021). Давайте меняться? В примере применения от первых scenix (виртуальная периферия IrDA) было вскользь упомянуто как они получили такую формулу для 0x8408, но тогда я эту методику не осилил, а сейчас то описание потерялось  Я как раз для 0x1021 и знаю только  Код //Расчёт 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 найти!  PS: Хотя нет - знаю ещё одну формулу для другого CRC16, но не знаю какой полином (данная CRC используется в наших устройствах работающих по нашему собственному протоколу).
|
|
|
|
|
Mar 2 2015, 16:16
|

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

|
Цитата(jcxz @ Mar 2 2015, 16:55)  Я как раз для 0x1021 и знаю только  Ну да, у меня такая же: Код 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)
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|