Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2740
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Циклический контроль избыточности

448

16.1. Введение в расчет CRC

Метод CRC основан на четко сформулированных свойствах полиномиальной арифметики. Чтобы вычислить контрольную сумму потока битов, сообщение рассматривается как полином3, который делится на другой фиксированный полином, называемый генераторным полином (generator polynomial). Остатком данной операции является контрольная сумма, которая добавляется к исходному сообщению. Получатель будет использовать ее вместе с генераторным полиномом для проверки правильности сообщения.

На практике все методы CRC используют полиномы в GF(2n). GF(pn) обозначает поле Галуа (Galois field), также известное как конечное поле (finite field), то есть поле с конечным числом элементов. Как и любое поле, поле Галуа – это множество (set), в котором определены операции умножения, сложения, вычитания и деления, удовлетворяющие некоторым основным правилам (basic rules). Наиболее распространенными примерами конечных полей являются целые числа по модулю p, где p – простое число. В нашем случае p равно 2, и это означает, что поле GF(2n) содержит только два элемента при n = 1: 0 и 1.

В GF(2n) сложение и вычитание выполняются по модулю 2, то есть они соответствуют логической операции исключающего ИЛИ (XOR).

0 1

0 0 1

1 1 0

Умножение соответствует логической операции И (AND).

0 1

0 0 0

1 0 1

Полиномы в GF(2n) – это полиномы от одной переменной x, коэффициенты которых равны 0 или 1. Метод CRC интерпретирует биты сообщения с данными как коэффициенты многочлена в GF(2n) со степенью, равной n − 1, где n – длина сообщения. Например, приняв за сообщение 111001102, длина которого равна 8, оно соответствует полиному:

x

7

1

+ x

6

1

+ x

5

1

+ x

4

0 + x

3

0

+ x

2

1

+ x

1

1

+ x

0

0

= x

7

+ x

6

+ x

5

+ x

2

+ x

 

 

 

 

 

 

 

 

 

 

 

 

Как было сказано ранее, в GF(2n) сложение и вычитание соответствуют логической опе-

рации исключающего ИЛИ. Это означает, что сумма полиномов

x

4

+ x

3

+1

и

x

3

+ x +1

 

 

 

 

 

 

 

равна x4 + x 4. Очевидно, что это также то же самое, что и вычитание двух полиномов.

Умножение полиномов в GF(2n), как правило, очень похоже на умножение десятичных целых чисел, в котором вместо десятичных разрядов отслеживаются степени х. Например, умножив два предыдущих полинома, мы получим:

3В русском языке уместнее использовать термин многочлен вместо полинома. Некоторые утверждают, что полином – это отношение двух многочленов. Однако, ознакомившись со словарями и учебниками, переводчик принял решение, что эти термины эквивалентны, поэтому далее будет использоваться термин

полином. (прим. переводчика)

4Вместо этого в обычной алгебре результатом сложения будет x 4 + 2x 3 + x + 2 .

Циклический контроль избыточности

449

Как видите, каждый член первого полинома перемножается с каждым членом второго, а затем мы складываем их в соответствии с правилами сложения в GF(2n).

Деление одного полинома на другой в GF(2n) аналогично делению столбиком (с остатком) целых чисел, за исключением того, что нет заимствования или переноса. Напри-

мер, давайте разделим полином

x

7

+ x

6

+ x

5

+ x

2

+ x

 

 

 

 

на полином

x

3

 

+ x

+1

.

Мы начнем с деления первого члена делимого на самый старший член делителя (то есть тот, который имеет наибольшую степень x, которая в данном случае равна x3). Далее мы умножаем делитель на только что полученный результат (первый член конечного частного).

Теперь мы вычитаем произведение, только что полученное из соответствующих членов исходного делимого, применяя правила вычитания в GF(2n).

Повторяем предыдущие шаги, за исключением того, что на этот раз используем два члена, которые были только что написаны в качестве делимого.

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

Циклический контроль избыточности

450

Существует два способа у получателя оценить правильность передачи. Он может вычислить контрольную сумму по первым n битам принятых данных и проверить, что она соответствует последним r полученным битам. Другой способ, и как это обычно бывает на практике, заключается в том, что приемник может разделить все принятые биты на генераторный полином и проверить, что остаток r-го бита равен 0.

Однако точный алгоритм вычисления CRC обычно отличается от обычного полиномиального деления. Более того, генераторный полином может определять специфичные начальные и конечные условия, как мы скоро увидим. Это означает, что генераторный полином не может быть изменен, но он хранится в портфолио5 хорошо изученных полиномов. Например, широко распространенный полином CRC-32 имеет вид:

x

26

+ x

23

+ x

22

+ x

16

+ x

12

+ x

11

+ x

10

+ x

8

+ x

7

+ x

5

+ x

4

+ x

2

+ x +1

 

 

 

 

 

 

 

 

 

 

 

 

и он может быть представлен в двоичном виде последовательностью битов

000001001100000100011101101101112 и в шестнадцатеричном виде числом 0x04C1 1DB7. Он принят многими протоколами передачи и хранения, такими как Ethernet, Serial ATA, MPEG-2, BZip2 и PNG.

16.1.1. Расчет CRC в микроконтроллерах STM32F1/F2/F4/L1

Деление столбиком полинома подходит для выполнения вычислений вручную. Тем не менее, еще один более эффективный алгоритм CRC – это полиномиальное деление с использованием метода обработки сообщений побитовым исключающим ИЛИ (bitwise message XORing technique), которая подходит для реализации отдельной аппаратной схемой: сдвиговыми регистрами.

Процесс вычисления CRC в микроконтроллерах STM32 связан с алгоритмом, определенным полиномом CRC-32, который выглядит следующим образом6:

Инициализируется регистр CRC значением 0xFFFF FFFF, сложенным по модулю 2

(XOR) со значением данных.

Он сдвигается побитово во входном потоке. Если вытесненное значение MSBбита равно «1», то выполняется операция исключающего ИЛИ значения в регистре CRC с генераторным полиномом.

Если все входные биты обработаны, сдвиговый регистр CRC содержит значение

CRC.

5http://reveng.sourceforge.net/crc-catalogue/all.htm

6Как мы увидим далее, в микроконтроллерах STM32F0,F3,F7,L0,L4 используется немного другое и более

мощное периферийное устройство CRC, не ограниченное полиномом CRC-32.

Циклический контроль избыточности

451

Рисунок 1: Как контрольная сумма CRC вычисляется в STM32

Предположим, что значение данных равно 101001012 (0xAD), а полином CRC равен 000101102 (0x16), тогда алгоритм, реализованный микроконтроллерами STM32, будет работать следующим образом (рисунок 1 иллюстрирует этот процесс):

1.Исходное содержимое регистра CRC вычисляется с помощью операции исключающего ИЛИ между 0xFF и 0xAD.

2.Поскольку MSB-бит равен 0, регистр CRC просто сдвигается влево.

3.Теперь MSB-бит регистра CRC равен 1. Сначала мы сдвигаем регистр влево, а затем выполняем операцию исключающего ИЛИ с полиномом CRC (0x16).

4.При ставшем равным 0 MSB-бите регистр CRC просто сдвигается влево.

5.Теперь MSB-бит регистра CRC равен 1. Сначала мы сдвигаем регистр влево, а затем выполняем операцию исключающего ИЛИ с полиномом CRC (0x16).

6.При ставшем равным 0 MSB-бите регистр CRC просто сдвигается влево.

7.Теперь MSB-бит регистра CRC равен 1. Сначала мы сдвигаем регистр влево, а затем выполняем операцию исключающего ИЛИ с полиномом CRC (0x16).

8.Теперь MSB-бит регистра CRC равен 1. Сначала мы сдвигаем регистр влево, а затем выполняем операцию исключающего ИЛИ с полиномом CRC (0x16).

Циклический контроль избыточности

452

9.Наконец, MSB-бит снова равен 0. Мы выполняем сдвиг влево регистра CRC. Конечное значение представляет собой контрольную сумму, которая добавляется к концу сообщения.

Вышеприведенный алгоритм является просто упрощением фактического алгоритма, реализованного в микроконтроллерах STM32. На самом деле он отличается по двум основным причинам:

Полином CRC является фиксированным и соответствует CRC-32 (0x04C1 1DB7).

Один регистр входных/выходных данных размером 32 бита, а контрольная сумма CRC вычисляется для всего 32-битного регистра, а не для каждого байта7.

Это резко ограничивает эффективность использования данного периферийного устройства.

16.1.2.Периферийное устройство CRC в микроконтроллерах

STM32F0/F3/F7/L0/L4

Впредыдущем параграфе мы видели, что периферийное устройство STM32, предоставляемое некоторыми микроконтроллерами STM32, ограничено вычислением CRC с использованием полинома CRC-32 Ethernet. Более того, размер обрабатываемых данных для каждого вычисления составляет 32 бита.

Вболее поздних сериях STM32 это ограничение было заменено. Фактически, микроконтроллеры STM32F0/F3/F7/L0/L4 предоставляют более совершенное периферийное устройство CRC, как показано в таблице 1.

Таблица 1: Реализация периферийного устройства CRC в микроконтроллерах STM32

В этих микроконтроллерах периферийное устройство CRC по умолчанию совместимо с более простым периферийным устройством CRC, предоставляемым микроконтроллерами STM32F1/F2/F4/L1. Это означает, что без явно заданной конфигурации код,

7 Это важное отличие по сравнению с алгоритмами, реализованными в нескольких библиотеках и онлайнкалькуляторах, которые обычно выполняют вычисления CRC, разбивая слово на составляющие его байты.

См. этот пост (https://community.st.com/s/question/0D50X00009XkbNMSAZ/crc-computation) и этот другой пост (https://community.st.com/s/question/0D50X00009XkgXtSAJ/programmable-crc-peripheral-in-newer-stm32- devices) пользователя clive1 на официальном форуме ST (самый активный и опытный пользователь на форуме STM32, посвященном данной тематике).