Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/27: Рейтинг темы: голосов - 27, средняя оценка - 4.81
DySprozym
0 / 0 / 0
Регистрация: 20.05.2016
Сообщений: 23
1

Защита от потери информации

31.08.2016, 19:17. Просмотров 4952. Ответов 23
Метки нет (Все метки)

Мои мысли:

Есть STM32, у него есть флеш-память (кто бы мог подумать!). Туда можно писать.

И вот положим у нас есть страница с важной инфой, решили туда дописать 1 байт.

Для этого считали страницу в буфер, удалили ее, в буфер добавили нужный байт и начали этот буфер заново записывать на флеш. В это время отрубилось питание — данные потеряны, грусть-печаль.

Решение "в лоб":
1) Выделяем под хранение 3 страницы (в конце флеша, разумеется, чтобы не потереть прошивку)
1.1) 1-я страница под сами данные (оттуда будем читать при необходимости)
1.2) 2-я страница — backup первой страницы
1.3) 3-я страница — флаг (по умолчанию там "0")

Теперь процесс записи:

1) Читаем 1-ю страницу в буфер
2) На 3й странице выставляем "1" (т.е. "начинаем бекап")
3) Записываем буфер во вторую страницу (которая резервная)
4) на 3й странице выставляем "2" (т.е. "бекап завершен")
5) Добавляем нужные данные к буферу и записываем полученный буфер на первую страницу
6) на 3й странице выставляем "0" (т.е. "запись успешна")
7) Profit!

Как работает: При запуске программы проверяем флаг на 3-й странице:

1) Если там "0", то ошибок никаких не было. Результат: данные актуальные
2) Если там "1", то питание вырубилось во время бекапа. Результат: нужно заново сделать бекап 1-й страницы, данные не актуальны (но не потеряны!)
3) Если там "2", то питание вырубилось во время записи на 1ю страницу. Результат: на первой странице скорее всего мусор, нужно восстановить ее из бекапа (скопировать страницу 2 на страницу 1). Динные не актуальны, потеряны, но возможно восстановить последнюю копию.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2016, 19:17
Ответы с готовыми решениями:

Разделение жесткого диска без потери информации
купил ноут с виндовс 7 хоум базик 64битка. и столкнулся с проблемой , винда стоит заводская и мне...

Объединение 2х разделов одного HDD без потери информации
Это возможно?

Как правильно обновить Opera 10 53 без потери всей информации на ней?
Подскажите как правильно обновить Opera 10 53 я у меня без потери всей информации на ней, чтобы...

защита информации
всем доброго дня! вот допустим задача: сделать склад конфиденциальной информации, которую бы...

Защита информации
Здравствуйте, помогите, пожалуйста, разобраться... У меня на Windows 8 установлен локальный сервер...

23
shibtym
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
31.08.2016, 19:57 2
микроконтроллер не сварочный аппарат, ему совершенно не сложно организовать ИБП на время достаточное для завершения всех критических операций и плавного шатдауна...

и горе Вам если вы это не предусматриваете...

как?

питание на контроллер подается через через диод ... далее

либо обычная, мелкая, часовая, литевая батарейка,
либо накопительный конденсатор, ёмкость которого достаточна, далее понижающий стабилизатор-преобразователь...

микроконтроллер обнаружив пропадание напряжения питания до диода делает всё, что предусмотренно...

лично я тяготею к литевой батарейке, на практике её хватает на годы...
0
otixsom
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
31.08.2016, 20:09 3
В отдельных случаях можно даже ионистором обойтись.
А вообще, если набор данных маленький, например конфиг, то я пишу так:
- очищаю страницу или сектор, смотря какой мк (если нужно)
ИЛИ
- ищу конец предыдущего блока (см ниже)
- записываю данные (если хватает до концасектора/страницы), если нет, то стираю.
- записываю длину данных (1 или 2 байта)
- в конце дописываю специальную метку - несколько байт, которые не могут повторится в конфиге

при чтении
- в цикле пробегаюсь до последнего найденого флага (перед тем как не начнутся сплошные 0xFF )
- читаю длину данных
- возвращаюсь на этот размер и считываю данные.

не быстро, но из плюсов
- флеш расходуется более-менее адекватно,
- не нужно парится за то, что данные пропадут, всегда (кром первого случая записи на страницу) есть предыдущая версия
- можно проверить на корректность
- во флеше равномерно "протирается" дырка :)
0
shibtym
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 268
31.08.2016, 20:15 4
Цитата Сообщение от otixsom
не быстро, но
можно, но зачем???

фиксируется факт аварийного отключения, и часто, возобновление питания после авариного останова, не тоже самое, что обычное включение.
0
31.08.2016, 20:15
otixsom
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,183
31.08.2016, 20:24 5
Цитата Сообщение от shibtym
Цитата Сообщение от otixsom
не быстро, но
можно, но зачем???

После этой фразы дальше-то прочитал?
0
div
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
01.09.2016, 00:07 6
Цитата Сообщение от DySprozym
1) Выделяем под хранение 3 страницы (в конце флеша, разумеется, чтобы не потереть прошивку)
Хинт: достаточно двух страниц.

Но это имеет смысл только если данных много. Если данных мало, то надо тоже две страницы, но писать надо мелкими кусочками.
0
pitrpts
0 / 0 / 0
Регистрация: 30.04.2015
Сообщений: 721
01.09.2016, 01:38 7
Многое зависит от количества циклов записи... если записи в одно место делать часто, то за небольшое время можно погубить всю флеш...
напарник сварил флеш в приборе на Атмеге за 2 недели...

Сименс S7-300 идёт обманным путём - берёт ММС карту объёмом 16... 64 МБайт и форматирует как 64 Кбайт и более... то есть реально там очень много пустого места для сохраняемых данных.
При выключении питания все изменения в блоках данных записаны на флешку. Как это процедура делается никто не знает... может на заряде конденсатора внутреннего блока питания или на запасённом ионистором.
0
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
01.09.2016, 08:28 8
Я применял принцип голографии. Делается примерно так. При включении питания ксорил всю память, у меня получался адрес актуального блока чтения и адрес следующего блока записи. При пропадании питания уходил в процедуру записи, для этого хватает заряда питающего конденсатора 1000 мкф. Здесь самым интересным является то, как записать всего один блок, но так, чтобы при чтении сумма всех байтов памяти дала нужный адрес. Это делается такими же операциями XOR всей памяти и новых записываемых данных. В итоге у меня делается одна запись, и всегда в новое место, ресурс тратится равномерно. Нет необходимости хранить адрес последнего блока, ибо для этого пришлось бы хранить его в фиксированном месте, что равносильно первоначальной задаче. И нет ограничений на содержимое записи, т.к. нет поиска по маркеру.
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
01.09.2016, 10:20 9
по subj. Алгоритм крайне деструктивный, ресурс flash убивается слишком быстро. Используйте матчасть, тогда износ не будет столь диким. Для этого:
- выделяется не менее 2х страниц flash.
- при записи блока надо найти место, куда писать, для этого _от_конца_ всей зоны начинается поиск слова, отличного от "стерто" (0xFFFF). При обнаружении конца свободной зоны туда дописываются наш блок информации и всё. Если места нет (не хватает), то:
- надо стереть 0 страницу зоны flash, записать блок данных, (опция = проверить корректность записи), стереть все остальные страницы зоны flash.
В результате, количество издевательства над flash минимально, скорость записи максимальна и гарантируется наличие хотя-бы одной последней корректной записи.

Если записи разнородны и пишутся "потоком", то алгоритм поиска свободного места придется усложнить и не делать полного стирания зоны сохранения (как написано выше), а стирать только одну страницу. Так-же надо гарантировать наличие незаписанного слова 0xFFFFFFFF в конце последней страницы записи - иначе нельзя будет найти конец. Ну и, понятно, в записываемых данных не может быть последних слов 0xFFFF/0xFFFF. Решается просто - в последнем слове (байте) писать кол-во байт блока. Т.е. блок записи д.б. вида [данные, кол-во][данные, кол-во][данные, кол-во]...
0
DySprozym
0 / 0 / 0
Регистрация: 20.05.2016
Сообщений: 23
01.09.2016, 10:46 10
shibtym
идея с аварийным питанием хорошая, но не всегда реализуема, да и простоты схеме не добавляет: контролировать пропадание напряжения, контролировать не села ли батарейка... А вот с конденсатором интересней, только ведь они сохнут заразы((

otixsom
да, метод с сигнатурами — тоже о нем думал :) но тут ведь как:

записываю данные (если хватает до концасектора/страницы).
штука в том, что прежде чем дописать данные на stm32, нужно стереть _всю_ страницу, а перед этим надо ее _всю_ удалить, а перед этим надо ее _всю_ забекапить.

div
маленькими кусочками писать не получится, перед записью на страницу, ее надо полностью удалить (а это 1-2 Кб!)

pytrpts
Сименс S7-300 идёт обманным путём - берёт ММС карту объёмом 16... 64 МБайт
Ну хоть не наоборот :)) А вообще да, идея интересная: "вот вам лимит, остальное для служебных целей и вам там делать нечего"

yiv91
при записи в новое место, мы теряем много старого места :) Ну положим: записали на 1ю страницу 10 байт. При записи на новое место, мы должны писать уже на вторую страницу. В результате, теряем почти 2 Кб (размер страницы) пустого места первой страницы. Если у нас sd-карта, то это не критично. А вот если на мк (в несколько десятков Кб) писать каждый раз в новое место, оно очень быстро закончится.
0
yiv91
0 / 0 / 0
Регистрация: 31.01.2013
Сообщений: 1,625
01.09.2016, 11:25 11
Цитата Сообщение от DySprozym
при записи в новое место, мы теряем много старого места :) Ну положим: записали на 1ю страницу 10 байт. При записи на новое место, мы должны писать уже на вторую страницу. В результате, теряем почти 2 Кб (размер страницы) пустого места первой страницы. Если у нас sd-карта, то это не критично. А вот если на мк (в несколько десятков Кб) писать каждый раз в новое место, оно очень быстро закончится.
Видимо, я забыл указать, что запись идет по кругу.
В моем конкретном случае было 128 байт флеша. Нужно было записывать каждый раз 2 байта, еще 1 байт адреса. Размер блока получается 4 байта (ближайшая степень 2-ки). Всего 32 страницы. По даташиту ресурс каждой ячейки 100 тыс, итого ресурс получается 3.2 млн записей.
0
Sovo
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
01.09.2016, 12:24 12
Мой велосипед таков:
Организуем структуру хранения данных. Первый байт - признак (например, 0x5D), в конце - контрольная сумма.
Страница флэш рассматривается как массив структур.
При запуске процессор ищет первую страницу с действительным признаком, потом считывает данные структуры и проверяет контрольную сумму. Совпадает - считываем данные.
При записи новых данных сначала записываем новую структуру в следующий элемент массива, после проверки стираем признак предыдущей структуры в нули (флэш позволяет обнулять биты).
Если добираемся до конца страницы, то только тогда стираем всю страницу и записываем первый элемент.
Количество стираний флеша минимально.
0
mShit
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 1,217
01.09.2016, 12:37 13
Цитата Сообщение от DySprozym
штука в том, что прежде чем дописать данные на stm32, нужно стереть _всю_ страницу, а перед этим надо ее _всю_ удалить, а перед этим надо ее _всю_ забекапить.
Не обязательно. Допустим пакет с настройками у нас минимум в два раза меньше страницы и выровнен по границе 4 байт. В пакете помимо настроек держим счётчик, инкрементирующийся при каждой новой записи, и CRC.

1. При первом включении страницы стёрты - во всех байтах 0xFF, пишем настройки по умолчанию в начало страницы.
Это можно на этапе прошивки сделать.

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

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

3. Если при записи дошли до конца второй страницы то сначала стираем первую страницу, пишем в её начало пакет с новыми настройками, проверяем его и стираем вторую страницу. Далее по пункту 2.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
01.09.2016, 18:16 14
Цитата Сообщение от mShit
проверяем корректность записи и только затем забиваем адреса текущего пакета нулями.
а зачем забивать? я просто дописывал новый пакет с увеличенным на 1 номером и все.
0
mShit
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 1,217
01.09.2016, 19:12 15
На самом деле я тоже забивал не весь пакет а только первое слово в младшем байте которого лежал счётчик. Счётчик от 1 до 254, 0 или 255 - значит стёрт, по этому признаку удобно быстро искать пакет.
0
Ymk
0 / 0 / 0
Регистрация: 18.03.2010
Сообщений: 2,233
02.09.2016, 12:40 16
по-моему без разницы, искать в цикле 0 или какое-то определенное значение.
а кроме того, я еще не уверен, что везде и всегда можно дотереть флеш до нуля. это вам не епром с побайтным доступом.
0
RusykOk
0 / 0 / 0
Регистрация: 03.02.2015
Сообщений: 56
10.10.2016, 04:09 17
вот почитал я почитал все это и решил спросить) а как же часто в Ваших проектах происходит запись во flash? сколько раз в сутки?
0
OVY-srok
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
10.10.2016, 04:47 18
Цитата Сообщение от RusykOk
а как же часто в Ваших проектах происходит запись во flash?
Один раз при падении напряжения и явном наличии новых изменённых пунктов настроек.
Текущие настройки делятся на два типа: часто меняющиеся - не столь важные, и очень важные - смена которых может привести к сбою рабочего состояния девайса.
Например для плеера - текущие настройки сохраняются в резервную sram с питанием от батарейки, в случае с чипами st - это часть внутренней периферии. Текущие - это например позиция плея в минутах/секундах , уровень громкости и так далее.

Важные настройки сохраняются во флеш, тоже при падении напряжения. Времени на запись достаточно, невозможно предугадать количество смены таких настроек, проще сделать потом. К настройкам добавляется текущая дата и контрольная сумма. К важным настройкам можно отнести регулировку экрана - ширина/высота, тип дисплея, тип кодека, настройки внешнего интерфейса связи... Всё что требует первоначального запуска девайса.

Есно можно один раз посчитать, и заливать новую прошивку в девайсы с небольшим физическим изменением. Однако даже автомобилестроении все подобные настройки выполняются после стандартной прошивки, это позволяет сохранять защиту от копирования.
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
10.10.2016, 09:32 19
Цитата Сообщение от DySprozym
...
штука в том, что прежде чем дописать данные на stm32, нужно стереть _всю_ страницу, а перед этим надо ее _всю_ удалить, а перед этим надо ее _всю_ забекапить.
Там вам выше посоветовали изучить вопрос поподробнее.
Чтобы дописать данные на STM32 достаточно ОДИН раз стереть страницу памяти, и потом дописывать в эту страницу по необходимости, пока она не закончится, БЕЗ повторных стираний всей страницы.

Стирание (во флешь, как правило всех типов и производителей, за некоторыми исключениями) - это установка всех битов в "1", и происходит постранично.

Запись же - это установка нужных битов в "0", и происходит побайтно!

Таким образом, как вам уже опять же советовали, достаточно двух страниц (см выше).
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
10.10.2016, 15:24 20
Есть файловая система yaffs - http://www.yaffs.net/documents
реализовывать ее 1-в-1 не стоит, но почитать принципы организации и работы с данными стоит
0
10.10.2016, 15:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2016, 15:24

Защита информации
Всем добрый вечер! Создал базу и встал вопрос о защите информации. Внутри сделал админку с...

Защита информации
Перебросьте, пожалуйста, в нужную тему. У меня такая задача. Многопользовательская база(...

защита информации
Каким образом подключить внешний криптопровайдер к лотусу?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru