Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Способы защиты от сбоев в коммуникационном канале в других ситуациях мы сейчас рассмотрим.

Приемы защиты от сбоев при коммуникации
Заметим, что в большинстве практических случаев все описанные далее меры не требуются. Их следует применять, когда линия связи ненадежна (например, очень длинная, или действует в условиях повышенных помех — в производственном цехе) или обмен очень интенсивный, и даже при исчезающе малой вероятности сбоев в каждом отдельном случае общая вероятность ошибки становится достаточно заметной. Заметим, что при повышенных требованиях к надежности применение всех этих методов не исключает (и даже предполагает) специальные интерфейсы для связи удаленных устройств (RS-422 и RS-485), описанные в следующем разделе этой главы.

Проверка на четность
Один из самых простых и часто употребляемых методов— проверка на четность для каждого отдельного байта. Для этого служит старший бит в 9-битовом режиме обмена, который хранится в разрядах RXBS (при приеме) и тхв8 (при передаче) регистров UCR ДЛЯ UART или UCSRB ДЛЯ USART. Если нужно организовать 9-битовую посылку, то для "чистого" UART следует установить бит CHR9 в регистре UCR. ДЛЯ USART этот бит находится в регистре UCSRB и называется ucsz2, но одной его установки недостаточно: кроме этого бита необходимо установить в единицы значения ucszo и ucszi в регистре UCSRC (СМ. процедуру задания 8-битового режима в разделе "Инициализация UART" этой главы). Отметим, что читать значение бита RXBS В USART (если это требуется — в ряде случаев это необязательно, как мы увидим далее) при приеме следует до обращения к регистру данных. В UART девятый бит можно читать независимо от данных.

Рассмотрим проверку на четность подробнее. Тем, кто позабыл основы информатики, напоминаю, что под четностью/нечетностью посылки понимается не четность/нечетность числа в арифметическом смысле (кратно оно двойке или не кратно), а четность/нечетность количества битов, равных единице. Проверка байта на четность даст результат 0 (true), когда число единиц в байте четно, и 1 (false) — когда нечетно. Добавление 9-го бита при этом делается так, чтобы общее количество битов, равных 1, было бы всегда четным (отметим, что можно устанавливать и обратную проверку — на нечетность). Общая формула, позволяющая вычислить значение бита четности Л,ет, выглядит так:
Рчет=Ь7@ b6® ...®b\® bo, где bj — разряды байта, а © — операция "исключающее ИЛИ". Обычно такая проверка рассчитана на аппаратную реализацию, и в USART имеется соответствующий режим, который включается установкой бита UPMI в регистре UCSRC. Ошибку четности тогда можно обнаружить до чтения данных, если проверить бит UPE регистра UCSRA— при обнаруженной ошибке он устанавливается в 1. Организовать повторный обмен несложно, если "договориться" с источником данных о специальных ответных кодах подтверждения/неподтверждения приема.

В UART аппаратного контроля четности нет, но его можно реализовать программно. Листинг 13.10 содержит код, который позволяет сформировать в бите переноса с нужное значение 9-го бита. Он основан на последовательной комбинации операцией "исключающее ИЛИ" сначала двух половин байта (старшей и младшей тетрады между собой), затем двухбитовых половин результата, затем каждого из битов результата уже этой операции. В регистре temp содержится исходный байт, который помещается в стек для того, чтобы его не "испортить", а регистр tempi используется для манипуляций.

Листинг 13.10
push temp
mov tempi,temp /создаем вторую копию swap tempi ;старшая тетрада — в младшую еог temp,tempi ;в младшей тетраде temp результат еог тетрад mov tempi,temp /копируем lsr tempi
lsr tempi /сдвинули на два бита вправо
еог temp,tempi /в младших 2-х битах temp результат еог 2-х бит
mov tempi,temp /копируем
lsr tempi /сдвинули на один бит
еог temp,tempi /в младшем бите temp результат еог младших бит
lsr temp ;значение 9-го бита во флаге переноса С pop temp /восстанавливаем исходное значение

При передаче можно записать значение этого флага в бит тхв8, выполнив операции листинга 13.11.

Листинг 13.11 cbi UCR,TXB8 brcc continue sbi UCR,TXB8 continue:

При приеме можно поступить аналогично: сначала вычислить значение 9-го бита, как и при передаче, а потом сравнить значения бита переноса и бита RXB9. Последнее можно сделать самыми различными способами, например так, как показано в листинге 13.12.

. Листинг 13.12
clr tempi
lsl tempi ;бит С — в бит 0 tempi .
in temp,UCR /загрузка UCR в temp
lsr temp /бит RXB8 — в бит 0 temp
andi temp,$00000001 /обнуляем остальные биты
tst temp,tempi
breq continue /нет ошибки — продолжаем /иначе ошибка обрабатываем ошибку> continue:

При проверке на четность остается вероятность того, что ошибки возникнут одновременно в двух разрядах девятибитового числа и скомпенсируют друг друга. Поэтому метод не обнаруживает примерно половину двойных ошибок в битах, однако эта вероятность гораздо меньше, чем у однократной ошибки. Если это все же критично, то применяют различные методы вычисления контрольных сумм (CRC), о чем мы уже говорили в главах 5 и 11.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru