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

 
 
> Вычисление CRC
Danis
сообщение Nov 19 2010, 18:19
Сообщение #1


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



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


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Danis
сообщение Nov 20 2010, 15:54
Сообщение #2


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Привет, коллеги по цеху!

Вот сижу, роюсь в периферийной библиотеке STM32.
Интересует аппаратный расчет CRC16 на STM32. Кто нить это использовал? Сейчас я пока пользуюсь только программным расчетом CRC16. Использую следующие функции:

// BYTE – unsigned char
// WORD – 2байта (unsigned short)

// ---------------- функция расчета СRC16 --------------------------------------------------
WORD GetCRC16(BYTE* Buffer, WORD Size)
{
return(GetCRC16Fragment(Buffer, Size, 0));
}
//************************************************************


//----------------------------------------------------------------------------------------------------------

WORD GetCRC16Fragment(BYTE* Buffer, WORD Size, WORD PrevFragmentCRC)
{
WORD crc, i, j;

crc = PrevFragmentCRC;
for (i=0; i<Size; i++)
{
crc ^= Buffer[i] << 8;

for (j=0; j<8; j++)
{
if ((crc & 0x8000) != 0)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return(crc);
}
//************************************************************************

Например, в одном из проектов я по SPI (DMA) принимаю из Ethernet контроллера буфер 1472 байта, это максимальный размер данных UDP пакета. Конечно же, чтоб проверить целостность пакета передаю его в функцию GetCRC16. Последние 2 байта пакета содержат его CRC16. Таким образом, при целостности пакета, функция GetCRC16 должна возвратить 0. Все это здорово работает, за минусом того, что на это дело тратиться 3.8 ms процессорного времени. Поэтому заинтересовался аппаратным расчетом CRC. В примерах из стандартной библиотеки нашел функцию:

/**
* @brief Computes the 32-bit CRC of a given buffer of data word(32-bit).
* @param pBuffer: pointer to the buffer containing the data to be computed
* @param BufferLength: length of the buffer to be computed
* @retval 32-bit CRC
*/
uint32_t CRC_CalcBlockCRC(uint32_t pBuffer[], uint32_t BufferLength)
{
uint32_t index = 0;

for(index = 0; index < BufferLength; index++)
{
CRC->DR = pBuffer[index];
}
return (CRC->DR);
}

Но это как я понимаю CRC32. Можно ли на STM32 аппаратно вычислить CRC16 по полиному 1021? Кто нить пользовался? Насколько аппаратный расчет CRC быстрее считает чем программный? Хочу услышать Ваши мнения. В понедельник приду на работу, тогда уж на железе погоняю….


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
Serj78
сообщение Nov 20 2010, 18:39
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



CRC - это вообще-то остаток от деления. В вашей функции оно сильно неэффективно. (сдвигами). Табличная реализация значительно эффективнее.

(Есть замечательный документ "Ross N. Williams
Элементарное руководство
по CRC алгоритмам
обнаружения ошибок
Все, что Вы хотели бы знать о CRC алгоритмах, но боялись спросить,
опасаясь, что ошибки Ваших знаний могут быть обнаружены" -погуглите. )

В даташите указано, что полином аппаратного блока CRC фиксированный :
Uses CRC-32 (Ethernet) polynomial: 0x4C11DB7
– X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1

и изменить его нельзя, увы sad.gif
А было бы здорово, если бы для полинома был отдельный регистр... smile.gif
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 20 2010, 18:45
Сообщение #4


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(Serj78 @ Nov 20 2010, 21:39) *
CRC - это вообще-то остаток от деления. В вашей функции оно сильно неэффективно. (сдвигами). Табличная реализация значительно эффективнее.


Пожалуйста, дайте Вашу табличную реализацию для CRC16. Хотелось бы в виде легко переносимой функции в стиле Си. Если это сэкономит время - это будет просто здорово. Даташит по STM32 относительно CRC прочитал, действительно фиксированный. Сейчас мне нужно написать функцию или нагуглть для подготовки этой CRC32. Придется отказаться от моей привычной CRC16 в STM32.

........
Вот нашел кое-что, но в стиле С++ с классом, там полином даже как у STM32 - unsigned long ulPolynomial = 0x04C11DB7, и табличная реализация. Чуть попозжа перепишу для Си и тут выложу. Погоняем и сравним......
Прикрепленные файлы
Прикрепленный файл  CRC32.zip ( 4.88 килобайт ) Кол-во скачиваний: 96
 


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
Danis
сообщение Nov 25 2010, 05:56
Сообщение #5


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(Danis @ Nov 20 2010, 21:45) *
Погоняем и сравним......



Вот реализовал программную функцию расчета CRC32, с учетом алгоритма расчета STM32. Выше в посте я уже писал, что обычная софтовская функция CRC32 считает по полиному 0x04C11DB7 по другому, нежели аппаратно железка. Для корректного подсчета в нее нужно ввести перестановку битов.

Файл - STM32_SOFT_CRC32.zip

Эта не табличная реализация, медленная, но считает также как STM32 аппаратно. Табличную реализацию пока еще не написал, может кто напишет и выложит?

А это аппаратная реализация подсчета CRC32 непосредственно в железке. Немного переделал функцию из периферийной библиотеки STM32, для удобства.

Файл - STM32_HARD_CRC32.zip

Считает очень быстро, в 5 раз быстрее чем табличная реализация подсчета классической CRC32.

Буфет размером 1472 byte считает за 100 us, так что по моему, очень даже не плохо!
Прикрепленные файлы
Прикрепленный файл  STM32_SOFT_CRC32.zip ( 355 байт ) Кол-во скачиваний: 195
Прикрепленный файл  STM32_HARD_CRC32.zip ( 304 байт ) Кол-во скачиваний: 175
 


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 25th July 2025 - 21:41
Рейтинг@Mail.ru


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