|
|
  |
Определение целосности данных |
|
|
|
Oct 30 2005, 10:22
|

Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480

|
Цитата(Vic1 @ Oct 30 2005, 12:07) To Pat - применимы все методы контроля, используемые при передаче по каналу связи (бит паритета, CRC и т.п.). Есть и корректирующие коды (исправляюшие n-кратную ошибку) - вот тут хорошо бы знать модель ошибок. Я, конечно, извиняюсь, ибо в этой области я серый, как штаны пожарника. Наверное, я сильно переживаю за данные в EEPROM, так как там модель ошибки очень случайная. Просто в народе бытует мнение о том, что данные в EEPROM могут иногда повреждаться. Многие причины этого повреждения известны и они учтены в самой конструкции и софте, но все равно хочется сделать некоторую избыточность так на всякий случай. А случаи как говорится разные бывают  .
|
|
|
|
|
Oct 30 2005, 10:34
|

инженер
   
Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701

|
Это все понятно (относительно EEPROM и ошибки, а не штанов пожарника  ) . Исходя из этого и был мой совет. Если не хотите лезть в книжки по системам связи, то возьмите самый известный CRC16 (используемый, например, в протоколе ModBus), посчитайте циклический код над байтами калибровочного коэфф-та и используйте его в Вашей операции сравнения. Этот подход оправдывается в тех случаях, когда калибровочные коэфф-ты занимают достаточно большую область памяти. Если же коэфф-т занимает 1-2 байта, то более целесообразен Ваш первоначальный алгоритм. Тут на местном ftp - книжка старинная есть. Уильямс "Отладка микропроцессорных систем" 1988 г. Там, в частности, должен и этот вопрос рассматриваться. Сама уже заглянула в книгу - там только предлагается расчет контрольной суммы области памяти, запись байта контрольной суммы и сравнение его с рассчитанным в программе. Контрольная сумма в книге - это сумма всех байт области без учета переполнения. Использование CRC16 - все точно также, но алгоритм вычисления контрольной суммы (CRC16) чуть-чуть посложнее. Если что, свистните  , выложу исходник на Си.
|
|
|
|
|
Oct 31 2005, 07:46
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Еще вариант: записать само значение и его инверсию. Минимум накладных расходов. Также, если в EEPROM достаточно свободного места, можно организовать что-то типа отказоустойчивой системы с транзакциями  : кольцевой буфер, в "голову" которого пишется пакетик данных, затирая "хвост". Преимущество: если последняя "транзакция" не удалась (например, питание ушло), можно вернуться к предыдущему значению (если это калибровочный коэффициент, то он обычно между калибровками уплывает ненамного, и со старым его значением прибор будет хоть как-то работать).
--------------------
Gray©at
|
|
|
|
|
Oct 31 2005, 14:43
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 26-09-05
Пользователь №: 8 955

|
Самый тривиальный алгоритм подсчета контрольной суммы CRC16: Код WORD calc_crc16(WORD *ar,int num) { WORD i,j,val,val1;
val=ar[0]; for(i=1;i<num;i++) { val1=ar[i]; for(j=0;j<16;j++) { if(val&0x8000) { val=val^0x8005; } val=(val<<1); if(val1&0x8000) { val++; } val1=(val1<<1); } } ar[i-1]=val;
return(val); } Последний элемент массива - значение CRC16 массива при проверке (возвращается 0 при правильной CRC16), 0 - при подсчете. Оптимизируйте при необходимости - я написал в свое время за 15 минут, совершенно не думая о производительности.
|
|
|
|
|
Jan 25 2006, 11:30
|
Участник

Группа: Свой
Сообщений: 61
Регистрация: 24-01-06
Пользователь №: 13 541

|
записывай на бумажку)))
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|