Прямой доступ к секторам
В этом разделе рассматривается: fd.buffernum, fd.getbuffer, fd.setbuffer, fd.getsector, fd.setsector, fd.checksum, fd.copyfirmware. fd.copyfirmwarelzo.
Прямой доступ к секторам позволяет работать с секторами области данных флеш-памяти устройства напрямую, без создания и ведения файлов. Работа с секторами идёт через два одинаковых буфера в ОЗУ по 264 байта (зависит от платформы) с номерами 0 и 1. Свойство fd.buffernum выбирает, какой из буферов служит источником или приёмником данных (см. рисунок ниже).
Все файловые операции флеш-диска также используют буферы в ОЗУ, и выбранный номер буфера в результате их выполнения может измениться. Если прямой и файловый доступ используются одновременно, переключайтесь на буфер ОЗУ №0 каждый раз перед прямым доступом к секторам - это гарантирует, что вы не повредите файлы и/или файловую систему и не вызовете размонтирование диска (fd.ready станет равным 0 - NO). Подробнее об этом - в разделе Совместное использование файлового и прямого доступа.

Чтение данных из сектора выполняется в два этапа. Сначала fd.getsector загружает все 264 байта нужного сектора в выбранный в данный момент буфер ОЗУ. Затем fd.getbuffer считывает данные из выбранного буфера. Этот метод позволяет прочитать до 255 байт начиная с любого смещения в буфере (смещения отсчитываются с 0):
Dim s As String
...
'we want bytes 20-29 from sector #3
fd.buffernum=0 'select RAM buffer #0
If fd.getsector(3)<>PL_FD_STATUS_OK Then
'flash failure
End If
s=fd.getbuffer(20,10) 'now s contains the desired data
Поскольку размер сектора (и буфера ОЗУ) превышает 255 байт (максимальную длину строковых переменных), прочитать всё содержимое сектора за один раз не получится. Для этого нужно как минимум два чтения fd.getbuffer.
Чтобы изменить данные в выбранном буфере ОЗУ, используйте метод fd.setbuffer, который позволяет записать новые данные по любому смещению выбранного буфера. Чтобы сохранить содержимое буфера ОЗУ обратно во флеш-память, используйте fd.setsector:
Dim s As String
...
'modify first 3 bytes of sector #5
If fd.getsector(3)<>PL_FD_STATUS_OK Then
'flash failure
End If
fd.setbuffer("ABC",0) 'write "ABC" to the buffer at offset 0
If fd.setsector(3)<>PL_FD_STATUS_OK Then
'flash failure
End If
Поскольку буферов ОЗУ два и они одинаковы, можно загрузить содержимое двух разных секторов и работать с данными одновременно, переключаясь между буферами.
Как описано в разделе Совместное использование флеш-памяти приложением и данными, логические номера секторов для fd.getsector и fd.setsector не равны реальным номерам физических секторов флеш-микросхемы. Логический сектор №0 соответствует самому верхнему физическому сектору микросхемы, поэтому логическая нумерация идёт «в обратную сторону».
Записывать можно только в секторы, лежащие в области данных флеш-микросхемы (то есть с логическими номерами от 0 до fd.availableflashspace - 1). В устройствах с общей флеш-памятью это не позволяет приложению случайно повредить собственный код или прошивку. Выход за границу области данных приводит к коду состояния 4 - PL_FD_STATUS_INV_PARAM. Если нужно изменить данные в области прошивки и приложения, см. раздел Самообновление прошивки и приложения.
Если вы одновременно используете прямой доступ к секторам и файловый доступ, обязательно прочитайте о том, как обеспечить их корректное сосуществование.
Учтите также, что fd.getsector и fd.setsector всегда обращаются именно к указанному сектору, а не к его кэшированной копии, даже если выполняется дисковая транзакция (fd.transactionstarted = 1 - YES) и целевой сектор уже кэширован.