|
stm32f407 хранение настроек |
|
|
|
May 5 2015, 20:59
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Dr.Alex @ May 5 2015, 23:30)  Вообще делать контроллер без еепрома это свинство (не могу опять не пнуть СТМ) Дык, эстешники вам в ответ апликуху - "эмуляция eeprom". Если питание пропало и какая-то настройка не сохранилась остается ее предыдущее значение. Я правда, эмулирую eeprom по-своему (не как ST предлагают), но за много лет использования косяков не заметил. Даже циклический журнал событий держу в контроллере. Кста, с записью событий "появилось питание", "пропало питание" - по сработке PVD, времени сохранить запись хватает.
|
|
|
|
|
May 5 2015, 21:06
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Я тоже изменяемые данные сохраняю во флеш. Правда, в отличие от, скажем, STM8, STM32 не позволяют перезаписывать области произвольного размера — только кратные размеру страницы. На STM32F103 о 100 ногах мне пришлось пойти на хитрость: выравнять не только размер структуры на 2кБ, но и ее начало (чтобы четко 1 страницу заняла). И вот так из-за десятка новых байт приходится 2кБ перезаписывать. Благо, нечасто. Кстати, для обозначения конца структуры (а также выравнивания) мне подсказали интересную штуку, которую я и использовал: "массив нулевого размера".
|
|
|
|
|
May 5 2015, 21:16
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Эдди @ May 6 2015, 00:06)  приходится 2кБ перезаписывать В F407 страница вообще по 16кБ, а настройки у меня 64 байта занимают (степень 2). Страниц минимум две (больше - лучше). Находим первое пустое место после записей. Пишем туда. Если при этом запись попадает на новую страницу, то предыдущую стираем. Все разумеется в терминах "кольца". Надежность (10к перезаписей страницы) * (16к размер страницы / 64 байта размер структуры) * (2 число страниц) > 5М перезаписей.
|
|
|
|
|
May 7 2015, 09:46
|

Местный
  
Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021

|
Цитата(jcxz @ May 7 2015, 11:04)  Это не довод. Вероятность низкая, но всё равно не годится если нужна надёжность. 1000раз не случилось в 1001й раз попадёт сбой во время записи. Если не проблема переконфигурить устройство при таком случае - то тогда на страшно. Но если ответственная область, где важна надёжность работы и трудно будет переконфигурить заново - не годится. Ну в таком случае, конечно хорошо бы иметь резервную копию последних настроек, запись основных и запись копии происходит соответственно в разное время. Я такое делал, но правда не с целью защитить от потери, а с целью защитить пользователя от неумелых действий. Настроил что-то не то, откатил назад, на предыдущую конфигурацию.
|
|
|
|
|
May 8 2015, 08:42
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(mantech @ May 8 2015, 11:34)  Если произойдет сбой при записи в память, то потеряете байт или 4 байта, а в случае флеши - всю страницу. Забавная выдумка. Не обманывайте неокрепшие умы. Флеш стирается постранично. А запись происходит гораздо меньшими порциями. У тех же STM32 в зависимости от подсемейства может быть и побайтовая запись, и запись 16-битными словами. Это очень удобно для эмуляции EEPROM, реализации всяческих журналов и т.п. Это только убогие флеши типа как у LPC требуют записывать гораздо более крупными пачками, потому что каждая пачка защищается кодом коррекции ошибок.
|
|
|
|
|
May 8 2015, 08:59
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(mantech @ May 8 2015, 14:34)  Это запись в обычную память, вероятность сбоя не больше, чем запись в любую ячейку памяти и уж куда меньше, чем процедура записи во флеш, т.к. там пишет не байтами, а страницами. Если произойдет сбой при записи в память, то потеряете байт или 4 байта, а в случае флеши - всю страницу. Под "сбоем" я имел в виду сбой питания (или перезагрузку по иной причине: помеха и т.п.). И вообще это относилось к Вашему подужать до 4кб, и используете встроенные часы с батарейкой, то можно просто писать в backup RAMЕсли так сделать, то при любом прерывании записи потеряется вся структура хранения (так как резерва по ёмкости нет). Будут потеряны все настройки и устройство возможно перестанет функционировать. Если использовать журнал, с несколькими записями и несколькими минимальными элементами стирания (>=2), то потеряется только последняя структура хранения. Но всегда будет валидная предыдущая. И при сбое питания не портится вся страница, только записываемая часть её.
|
|
|
|
|
May 8 2015, 09:53
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(aaarrr @ May 8 2015, 11:50)  О как! Оказывается, наличие ECC свидетельствует об убогости. Именно так. Приблизительно как калека легко распознаётся по наличию костылей. А здоровый человек и без костылей может передвигаться. Цитата(adnega @ May 8 2015, 11:59)  Ирония в том, что при эмуляции EEPROM в STM32 я это тоже делаю, но своими ручками. Что, прямо настоящий код, исправляющий ошибки? Или банальная контрольная сумма, как у всех?
|
|
|
|
|
May 8 2015, 09:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(aaarrr @ May 8 2015, 11:50)  Пачка 16 байт всего. Не сказал бы, что это сильно мешает эмулировать EEPROM. LPC177x, 178x вроде достаточно свежий? Упоминания про 16 байт в руководстве пользователя не нашел. Цитата Param2: Number of bytes to be written. Should be 256 | 512 | 1024 | 4096. Нет, я помню про раскрученный много лет назад встроенный загрузчик, и тем не менее 16 байт можно записать только недокументированными методами. Или я что-то неправильно понял?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 8 2015, 10:06
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Сергей Борщ @ May 8 2015, 12:54)  LPC177x, 178x вроде достаточно свежий? Упоминания про 16 байт в руководстве пользователя не нашел. Действительно, у них такого нет. Для LPC11, LPC13 написано явно. Цитата(scifi @ May 8 2015, 13:02)  Конечно, калека может внушить себе, что его костыли - вовсе не костыли, и вообще это классно и модно. Но это его личные проблемы :-) То есть серверную технику и всякие поделия на Cortex-R4 с ECC всего и вся записываем в калеки автоматом? Тут уж надо или представлять данные о (не)надежности флеш NXP, или не заниматься домыслами.
|
|
|
|
|
May 8 2015, 10:32
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(scifi @ May 8 2015, 12:53)  Что, прямо настоящий код, исправляющий ошибки? Или банальная контрольная сумма, как у всех? Банальная сумма, т.к. модель сбоев flash в STM32 мне неизвестна, и шансы скорректировать отдельные битые биты ничтожны. Я готовлю запись, считаю сумму, записываю во flash, считываю. Если считанные данные совпали с записанными, то возвращаю "успех", иначе "ошибка". Смысл в том, что без контроля нельзя использовать ни одну flash.
|
|
|
|
|
May 8 2015, 12:27
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Сергей Борщ @ May 8 2015, 15:54)  LPC177x, 178x вроде достаточно свежий? Упоминания про 16 байт в руководстве пользователя не нашел. И тем не менее - так и есть. При попытке дописать к 16 байтам ранее записанным, получите мусор. Так что писать только кратно 16. Цитата(Сергей Борщ @ May 8 2015, 15:54)  Нет, я помню про раскрученный много лет назад встроенный загрузчик, и тем не менее 16 байт можно записать только недокументированными методами. Или я что-то неправильно понял? Прочитать эти самые 256 | 512 | 1024 | 4096, модифицировать в них требуемый участок, выровненный на 16 и записать. Только документированные методы.
|
|
|
|
|
May 11 2015, 08:01
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Господа, не отвлекаемся от темы: LPC, а уж тем более страны к сути топика не имеют никакого отношения.
Напомню исходный вопрос: есть stm32f407, где хранить настройки? во внутренней flash или во внешней. Большинством голосов пришли к выводу, что во внутренней можно. Страницы, ECC и т.п. большой роли не играют, т.к. при грамотной реализации у людей, использующих эмуляцию eeprom в stm32, нет проблем с надежностью.
Из тонких моментов можно обсудить: "большие" страницы у некоторых МК; задержка(?) доступа к flash при стирании/записи.
|
|
|
|
|
May 12 2015, 08:01
|
Знающий
   
Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231

|
Цитата(adnega @ May 11 2015, 12:58)  И соответствующий пункт в ES (правда, для f42x, f43x): Интересно, такое проявлялось только в f42x, f43x. Т.к. использовал Эмуляцию eeprom от ST, изменив её выбором через дефайны какой тип данные используется для записи/чтения 8/16/32 бит. А также изменил оптимизировал некоторые ф-ции при вкл./выкл. блокировки флешь. Отладил, всё заработало, но в устройствах на 405 и аккумуляторном питании, периодически наблюдается сброс всех настроек и перезапись непонятными данными по 2-м используемым страницам флеша. Использовались 2-ая и 3-ая страницы. Вычитывал их ST-Link(ом) после сбоя. И стационарное устройство на 407 на нём всё в порядке. На 405 ножка PA12 используется, на 407 ножка PA12 не используется. На аккумуляторном устройстве (тот что на 405) стал думать, что в момент разряда аккумулятора (такое может быть хоть каждый день) мк часто перезапускается внешним супервизором (хотя задержка такого запуска ~ 1 сек.) и я, где-то, что-то в программе не учёл, и поэтому портятся данные. Но при включении записи нет есть только чтение, откуда берется перезапись 2-х страниц флеша мне не понятно. Пока эксперименты были отставлены из-за других дел. Но как вернусь к ним обязательно буду смотреть в сторону ножки PA12 в том числе.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|