реклама на сайте
подробности

 
 
> Инициализация структуры во Flash, Дублирование области flash
pokk
сообщение May 24 2016, 04:27
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Добрый день , подскажите как можно продублировать инициализированную структуры во flash.
Дело в том, что понадобилось сохранять настройки программы в flash, но для зашиты их решил сделать несколько дубликатов.
Делаю это примерно так:
Код
S_GlobalSettingAllVar DefaultGlobalSettingAllVar={ //Начальные настройки(устанавливаются после нажатия кнопки Reset)
   .NetSetting={
      .mac = {0x00, 0x08, 0xdc, 0xab, 0xc1, 0x11},   //6
      .ip = {192, 168, 1, 4},                     //4
      .sn = {255, 255, 0, 0},
      .gw = {192, 168, 0, 0},
   },
   .Password={"fghfgh"},
}
S_GlobalSettingAllVar GlobalSettingAllVar={ //рабочая структура
   .NetSetting={
      .mac = {0x00, 0x08, 0xdc, 0xab, 0xc1, 0x11},   //6
      .ip = {192, 168, 1, 4},                     //4
      .sn = {255, 255, 0, 0},
      .gw = {192, 168, 0, 0},
   },
   .Password={"fghfgh"},
}

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

Как заставить компилятор разместить структуры во flash даже если по коду они не используются?(по коду использую адрес)

Ps. компилятор IAR stm32, но думаю это не сильно принципиально.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pokk
сообщение May 25 2016, 09:13
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата
И какой же у Вас процесс модификации структуры? Вот изменилась она, что делаете? Все 3 переписываете? Или как?

Да все три по очереди, стереть первую копию записать, стереть вторую копию записать...
Код
void Write_SettingVAR_flash(void){
    //-------------------------------------------------
    FLASH->KEYR = FLASH_KEY1;
    FLASH->KEYR = FLASH_KEY2;
    //-----------------------------------------------------------------------------------------------------
    FLASH_ErasePage(ADDR_FLASH_CONST);
    FLASH_ProgramPage(ADDR_FLASH_CONST,(unsigned char*)&Global_Flash_SettingAllVar,Table_flash_Setting_len);
    //-----------------------------------------------------------------------------------------------------
    FLASH_ErasePage(ADDR_DUBLE1_FLASH_CONST);
    FLASH_ProgramPage(ADDR_DUBLE1_FLASH_CONST,(unsigned char*)&Global_Flash_SettingAllVar,Table_flash_Setting_len);
    //-----------------------------------------------------------------------------------------------------
    FLASH_ErasePage(ADDR_DUBLE2_FLASH_CONST);
    FLASH_ProgramPage(ADDR_DUBLE2_FLASH_CONST,(unsigned char*)&Global_Flash_SettingAllVar,Table_flash_Setting_len);
    //-----------------------------------------------------------------------------------------------------
    FLASH->CR |= FLASH_CR_LOCK; /* Lock the flash back */
    //-----------------------------------------------------------------------------------------------------
}

Цитата
Потому что подали команду стирания и в этот момент сбой питания произошёл.

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



Go to the top of the page
 
+Quote Post
ШСА
сообщение May 25 2016, 11:13
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Цитата(pokk @ May 25 2016, 12:13) *
Да все три по очереди, стереть первую копию записать, стереть вторую копию записать...

Кроме всего прочего, у Вас будет очень сильный износ флеши. Если размер структуры много меньше размера секции флеши и рабочая копия есть в ОЗУ, то выгоднее с точки зрения износа флеши (а, следовательно, достоверности данных в ней) и проще записывать каждую обновлённую структуру сразу же после предыдущей. По окончании записи, в предыдущей затирать первый байт (слово). При считывании определяем актуальную запись по первому слову.
Тогда флеш будет расходоваться максимально рационально, причём стираться будет только после использования всей свободной области, т.е. редко. А в случае сбоя просто актуальными окажутся предыдущие настройки.
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 25 2016, 11:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ШСА @ May 25 2016, 17:13) *
Кроме всего прочего, у Вас будет очень сильный износ флеши. Если размер структуры много меньше размера секции флеши и рабочая копия есть в ОЗУ, то выгоднее с точки зрения износа флеши (а, следовательно, достоверности данных в ней) и проще записывать каждую обновлённую структуру сразу же после предыдущей. По окончании записи, в предыдущей затирать первый байт (слово). При считывании определяем актуальную запись по первому слову.
Тогда флеш будет расходоваться максимально рационально, причём стираться будет только после использования всей свободной области, т.е. редко. А в случае сбоя просто актуальными окажутся предыдущие настройки.

Конечно, в этом случае лучше создать кольцевой буфер из N записей. Каждая запись - полная конфигурационная структура. Весь буфер должен занимать как минимум 2 блока стирания.
И стирать байты в предыдущей записи не нужно - кольцо надо поддерживать в таком состоянии, чтобы в нём был разрыв из N стёртых записей. При старте ПО должно находить место этой стёртой дырки,
и последняя записанная запись перед этой дыркой - это последняя актуальная конфигурация. Если же её CRC не совпадает (процесс её записи был прерван), валидной считается предыдущая (если её CRC верный).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pokk   Инициализация структуры во Flash   May 24 2016, 04:27
- - ViKo   Скопировать пословно. У меня есть структуры с теку...   May 24 2016, 04:42
- - jcxz   Цитата(pokk @ May 24 2016, 10:27) Дело в ...   May 24 2016, 04:51
- - Сергей Борщ   QUOTE (pokk @ May 24 2016, 07:27) В принц...   May 24 2016, 05:34
- - pokk   ЦитатаА какой сакральный смысл в нескольких копиях...   May 24 2016, 06:35
|- - MrYuran   Цитата(pokk @ May 24 2016, 09:35) По этом...   May 24 2016, 06:45
|- - jcxz   Цитата(pokk @ May 24 2016, 12:35) 1) посл...   May 24 2016, 08:40
|- - k155la3   Цитата(pokk @ May 24 2016, 09:35) . . . ....   May 25 2016, 06:01
- - MrYuran   А ещё лучше поставить сбоку FRAM и вообще больше н...   May 24 2016, 06:42
- - pokk   ЦитатаА с флешью я нынче работаю так: есть несколь...   May 24 2016, 06:45
- - ViKo   Да, у меня тоже есть CRC в структурах. Если она не...   May 24 2016, 06:48
- - Jenya7   я делал так Кодvoid LoadFlashParams(void) ...   May 24 2016, 10:27
- - pokk   ЦитатаЕсли был какой-то сбой, то скорей всего у Ва...   May 24 2016, 10:30
|- - jcxz   Цитата(pokk @ May 24 2016, 16:30) С чего ...   May 25 2016, 04:59
- - jcxz   Цитата(pokk @ May 25 2016, 15:13) Да все ...   May 25 2016, 09:21


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 16:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01368 секунд с 7
ELECTRONIX ©2004-2016