Использование контрольных сумм

При работе с флеш-памятью очень часто нужно убедиться, что данные в секторах не повреждены. Один из способов - вычислить контрольную сумму данных сектора и хранить её вместе с данными. В каждом секторе флеш-памяти для этого предусмотрено 8 дополнительных байт сверх «обычных» 256, в которых хранятся сами данные.

Объект fd. использует два байта по смещениям 262 и 263 для хранения контрольной суммы первых 262 байт данных того же сектора. Контрольная сумма - 16-разрядное значение. Если контрольная сумма верна, сумма по модулю 16 всех данных сектора равна нулю.

16-разрядные значения для этих вычислений представлены в формате little-endian. То есть считается, что смещение 0 сектора - старший байт первого 16-разрядного значения, смещение 1 - младший байт первого 16-разрядного значения, смещение 2 - старший байт второго 16-разрядного значения, и так далее.

При файловом доступе объект fd. автоматически вычисляет и/или проверяет контрольную сумму всех секторов, к которым обращается. Если в каком-либо секторе контрольная сумма окажется неверной, выдаётся код состояния 2 - PL_FD_STATUS_CHECKSUM_ERR.

Прямой доступ к секторам более примитивен, и поддерживать и проверять целостность данных, хранящихся во флеш-памяти, нужно самостоятельно. В этом поможет метод fd.checksum: он умеет проверять контрольную сумму или вычислять её и записывать в выбранный буфер ОЗУ (в который данные сектора уже должны быть загружены):

'Load sector #10, verify its checksum, alter some data, recalculate the checksum, and save new data
Dim i As word
...
'load the sector
If fd.getsector(10)<>PL_FD_STATUS_OK Then
   'flash failure
End If
'verify the checksum
If fd.checksum(PL_FD_CSUM_MODE_VERIFY,i)<>OK Then
   'checksum error detected
End If
fd.setbuffer("ABC",20) 'alter data at offset 20
fd.checksum(PL_FD_CSUM_MODE_CALCULATE,i) 'recalculate the checksum, save it back into the RAM buffer
'save back
If fd.setsector(10)<>PL_FD_STATUS_OK Then
   'flash failure
End If
Исходный материал Tibbo обновлён 28 июля 2022Оригинал на docs.tibbo.com · Сообщить об ошибке