PDA

Просмотр полной версии : retain память в СПК



arlyn
21.12.2013, 15:55
Здравствуйте!
Подскажите пожалуйста как СПК работает с retain памятью:
1. Это особая энергонезависимая память или все данные записываются на туже флеш память(отдельным файлом) что и программа спк?
2. СПК постоянно считывает и записывает retain данные (если программа ссылается на них). Если да то это сказывается на скорости работы программы, и на количестве записей?
Или СПК вначале считывает retain в ОЗУ и работает с ними, а при выключении записывает обратно в файл или особую память.
Если верно последнее то при зависании СПК retain данные не обновятся.
Или может есть вообще особые правила работы с retain данными?
3. Недавно столкнулся с ограничением размера масива в 4000(бит или байт непомню) сохраняеммый в retain. Чем это вызвано?

Александр Приходько
22.12.2013, 17:34
Здравствуйте!
Подскажите пожалуйста как СПК работает с retain памятью:
1. Это особая энергонезависимая память или все данные записываются на туже флеш память(отдельным файлом) что и программа спк?
2. СПК постоянно считывает и записывает retain данные (если программа ссылается на них). Если да то это сказывается на скорости работы программы, и на количестве записей?
Или СПК вначале считывает retain в ОЗУ и работает с ними, а при выключении записывает обратно в файл или особую память.
Если верно последнее то при зависании СПК retain данные не обновятся.
Или может есть вообще особые правила работы с retain данными?
3. Недавно столкнулся с ограничением размера масива в 4000(бит или байт непомню) сохраняеммый в retain. Чем это вызвано?


Вопрос и простой и сложный одновременно.
Постараюсь разжевать.

1. В разных приборах по разному. В СПК1хх это точно файл во внутренней Flash памяти. В СПК2хх на старом железе это просто энергонезависимая память. А в новых СПК2хх (быстрых) механизм по моему аналогичен СПК1хх.
В СПК1хх данные анализируются на изменение если они изменились, то они пишутся на Flash. Интервал записи не чаще чем раз в секунду. Это отдельный фоновый процесс.
В СПК2хх на старом железе любое изменение данных фиксируется сразу.

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

2. Retain считывается из памяти/файла только один раз в момент загрузки. Если эти данные из энергонезависимой памяти, то при изменении они просто пишутся в нее.
Если эти данные хранятся в Flash в файле Retain, то этот файл читается в ОЗУ, еси в ОЗУ эти данные изменились, то они запишутся в файл. Минимальный интервал записи 1 секунда.
Если нужно чаще, пишите свой код. Но уверен, что вы быстее убъете свою Flash.

3. Все верно. Retain ограничен в СПК 4Кб. Поэтому, Retain должен быть объявлен как глобальные переменные.
Если Retain данные объявлены внутри ФБ или Программы, то весь этот программный компонент объявляется как Retain со всем набором его переменных и прочими компонентами.

Лично я для себя выработал такой подход при работе с Retain.
Я делаю новый тип данных - структуру.
Потом делаю экземпляр этих данных в GVL (Global Variable List), с пометкой, что это Retain.
А далее во фсе программы или ФБ передаю указатель на эту структуру.

Так и переменных меньше прописывать и Retain проще передавать.
Но! надо учитывать, что та же структура немного больше данных занимает в памяти, чем те же переменные, но объявленные по отдельности.

arlyn
19.02.2014, 14:37
Если есть необходимость считать общее время работы системы, как лучше подсчитать его?

Записывать раз в минуту число в retain не очень хорошо , т.к. это быстро накроет флеш память.
Записывать с большей переодичностью вызовет большую погрешность. (при пропажи питания данные не обновятся)

Есть ли способы получше подсчитать общее время наработки. Может есть способ задать условие пропажи питания СПК для записи в retain.

Мурат Ахриев
19.02.2014, 16:38
Есть вариант писать общее время наработки на SD карту либо USB флешку(необходимы неплохие навыки программирования).

arlyn
20.02.2014, 11:04
Есть вариант писать общее время наработки на SD карту либо USB флешку(необходимы неплохие навыки программирования).

Есть ещё один вопрос:
Скажем я записываю один байт на флеш, Будет перезаписываться 1 байт на флеш или 4кб(т.к. в файловой системе fat32 размер кластера 4кб)?
Т.е Будет уменьшаться ресурс флеш 1 перезаписываемого байта или всего кластера 4кб?

Александр Приходько
20.02.2014, 21:40
Есть ещё один вопрос:
Скажем я записываю один байт на флеш, Будет перезаписываться 1 байт на флеш или 4кб(т.к. в файловой системе fat32 размер кластера 4кб)?
Т.е Будет уменьшаться ресурс флеш 1 перезаписываемого байта или всего кластера 4кб?
Думаю Вам стоит почитать о файловых системах. Это собственно даже не к СПК вопрос а к организации FAT.
Писаться будет то число байт, которое вы пишите в фаайл. Но файл в файловой системе минимум будут занимать размер кластера. Меньше просто в файловой системе вписать нельзя.

Это равносильно адресу жительства. Город, улицу и дом и квартиру Вы указываете, но свое положение в квартире это уже Ваше личное дело. С файловой системой по аналогии.

http://ru.wikipedia.org/wiki/%D0%9A%D0%BB%D0%B0%D1%81%D1%82%D0%B5%D1%80_(%D0%B5 %D0%B4%D0%B8%D0%BD%D0%B8%D1%86%D0%B0_%D1%85%D1%80% D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B4%D0%B0%D 0%BD%D0%BD%D1%8B%D1%85)