Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сохранение переменных после сброса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kollega
Доброе время суток!
Как компилятору CodeVision запретить начальную инициализацию некоторых переменных?
Я так понимаю, что это аналог опции __no_init для IAR'а, но в кодевижине такого не нашёл sad.gif

Сохранение в EEPROM, контроль питания и пр. не предлагать - мне нужно просто сохранённое значение некоторых переменных в ОЗУ именно после сброса.
aahardsoft
не знаю как там в С это делаеться но вообще есть флаги которые указывают на то что был именно сброс и какой сброс после чего и т.д.,думаю нужно посмотреть на них и принять решение инициализировать переменные или нет.
zorromen
А я непонял а зачем это нада вам?
Dog Pawlowa
Цитата(zorromen @ Nov 29 2006, 19:10) *
А я непонял а зачем это нада вам?


Чтобы контроллер продолжал работу после сброса без потери данных. Обычно это используется в случае действия помех. Во всяком случае для этого использую я smile.gif
WHALE
Confugure Project->C Compiler-поставьте галочку Us an external startup initialization file.В качестве инициализационного файла возмите его-же старт-ап файл и грохните там обнуление интересующих вас
переменных.
Тока наверное вначале нуна будет сделать анализ причины рестарта и действовать в соответствии с этим.
kollega
Цитата
не знаю как там в С это делаеться но вообще есть флаги которые указывают на то что был именно сброс и какой сброс после чего и т.д.,думаю нужно посмотреть на них и принять решение инициализировать переменные или нет.

Немного не по теме Ваш ответ - с источником сброса и необходимостью инициализации я разбираюсь отдельно. Мне нужно именно ЗАПРЕТИТЬ компилятору обнулять некоторые, указанные мною, переменные.

Цитата
А я непонял а зачем это нада вам?

Ну НАДА мне. НАДА!!! wink.gif


Цитата
Confugure Project->C Compiler-поставьте галочку Us an external startup initialization file.В качестве инициализационного файла возмите его-же старт-ап файл и грохните там обнуление интересующих вас
переменных.

В файле startup.asm обнуляются не конкретные переменные, а область ОЗУ (в цикле) - т.е. конкретные переменные не выловишь. Можно вообще запретить полностью обнуление, а в Си-шном исходнике напрямую присваивать первоначальные значения переменным. А те, которые нужно сохранять после сброса, не инициализировать... Но, согласитесь, это вульгарно - возвращаемся к методам работы на ассме sad.gif
Abell
Интересный вопрос... В курсе, что после сброса в памяти может оказаться не совсем то, что ранее туда записали? Ну, а если есть желание попробовать... Выясните, какая область памяти содержит интересующие вас переменные, и в начале программы (до инициализации и разрешения прерываний) вставьте кусок ассемблерного кода, читающий этот блок одним большим куском в другую, допустим, область. После этого можно объявлять переменные и инициализировать их значениями из прочитанного блока. Если непонятно, предъявите вашу программку для более детального изучения.
_Bill
Цитата(kollega @ Nov 30 2006, 09:17) *
В файле startup.asm обнуляются не конкретные переменные, а область ОЗУ (в цикле) - т.е. конкретные переменные не выловишь. Можно вообще запретить полностью обнуление, а в Си-шном исходнике напрямую присваивать первоначальные значения переменным. А те, которые нужно сохранять после сброса, не инициализировать... Но, согласитесь, это вульгарно - возвращаемся к методам работы на ассме sad.gif

Отредактируйте startup.asm соответствующим образом. Какие проблемы?
Второй вариант - сохранять нужные переменные в EEPROM.
Семён
ИМХО: Если фирма изготовитель не регламентирует сохранность памяти после сброса, то в разработку нельзя вкладывать возможность сохранения в ОЗУ промежуточных данных, требующихся для работы системы, в противном случаи надежность работы Вашей системы напрямую будет зависеть от внешних факторов. Сам сталкивался с такой проблемой. Лучше переработайте алгоритм и храните эти данные в EEPROM. Если есть внешняя память, то лучше в ней.
Dog Pawlowa
Цитата(Семён @ Nov 30 2006, 11:15) *
ИМХО: Если фирма изготовитель не регламентирует сохранность памяти после сброса, то в разработку нельзя вкладывать возможность сохранения в ОЗУ промежуточных данных, требующихся для работы системы, в противном случаи надежность работы Вашей системы напрямую будет зависеть от внешних факторов. Сам сталкивался с такой проблемой. Лучше переработайте алгоритм и храните эти данные в EEPROM. Если есть внешняя память, то лучше в ней.

А на каком контроллере сталкивались?
Я оказался в безвыходной ситуации из-за ESD и за ночь переписал структуру софта. На испытаниях сбои происходили приблизительно раз в пять секунд, тест длился около получаса - на MSP430 работает. Что гарантируется - даже не искал. Валидность критических значений проверяю, но специальных мер типа контрольной суммы нет. С АВР не пробовал, хотелось бы знать help.gif
Сохранение данный в EEPROM существует, но это не может помочь в случае помехи - она слишком коротка, срабатывает внешний супервизор питания и ффсе.
Семён
Цитата(Dog Pawlowa @ Nov 30 2006, 12:09) *
А на каком контроллере сталкивались?

Сталкивался конкретно на ATTiny2313 и ATMega8 (софт один и тотже написанный на ассемблере). Также были проблемы с ATMega8515 (код на «С»). Сбой происходит не каждый раз, но на столе добиться можно, закономерность мне вывести не удалось, поэтому пришлось переписывать алгоритм, идя на компромисс. С другими пока подобных задач не было, поэтому не знаю.
muravei
Цитата(Dog Pawlowa @ Nov 30 2006, 12:09) *
она слишком коротка, срабатывает внешний супервизор питания и ффсе.

Так, может, убрать его , собаку, чтоб не срабатывал.smile.gif Настроить Brown-out Reset.
И фильтр по питанию.И ффсе.
А то так можно начать подстраивать программы под сглазsmile.gif
Dog Pawlowa
Цитата(muravei @ Nov 30 2006, 15:54) *
А то так можно начать подстраивать программы под сглазsmile.gif

Хорошее сравнение smile.gif
А убрать супервизор в MSP430F1XX (если помните, я о MSP говорил), нельзя, так как доказано неоднократно, что будет слетать флэш. Фильтр по питанию не помогал, система получилась с висящими антеннами, которые ловили включение света, например. Была поначалу версия без супервизора и WDT - залил больницу мыльным раствором w00t.gif
Поэтому меня AVR и интересует в этом плане. Но то, что говорит Семен, не радует unsure.gif
Остается только самому Мегу потерзать.
Семён
Если позволяет бюджет ставите Mega8515 c внешним ОЗУ и аварийным питанием, например ионистором.
muravei
Цитата(Dog Pawlowa @ Nov 30 2006, 16:36) *
система получилась с висящими антеннами, которые ловили включение света, например.

Надо навесить LC фильтры на длинные провода.
proba
я софт RTC в atmega128 использую, иногда происходит что прибор останется включенным, и аккумулятор сядет. когда подключаеш зарядку, время идет далше оттуда где остановился.
организовал так, что в lnk фаиле определил сегмент памяти , которого С не инициализирует.
singlskv
Цитата(kollega @ Nov 29 2006, 10:58) *
Доброе время суток!
Как компилятору CodeVision запретить начальную инициализацию некоторых переменных?
Я так понимаю, что это аналог опции __no_init для IAR'а, но в кодевижине такого не нашёл sad.gif

А как насчет разместить их просто в другом сегменте памяти ?
Не знаю как это делается в CodeVision,
а в GCC:
int MyData __attribute__ ((section (".myseg")));
ну и не забыть опцию линковщику -section-start=.myseg=0x80xxxx
Nanobyte
Может, всё-таки сохранять данные во внешней FRAM? Тогда и резервное питание не нужно.
WHALE
[quote]Confugure Project->C Compiler-поставьте галочку Us an external startup initialization file.В качестве инициализационного файла возмите его-же старт-ап файл и грохните там обнуление интересующих вас
переменных.[/quote]
В файле startup.asm обнуляются не конкретные переменные, а область ОЗУ (в цикле) - т.е. конкретные переменные не выловишь. Можно вообще запретить полностью обнуление, а в Си-шном исходнике напрямую присваивать первоначальные значения переменным. А те, которые нужно сохранять после сброса, не инициализировать... Но, согласитесь, это вульгарно - возвращаемся к методам работы на ассме sad.gif
[/quote]
а main.map лениво посмотреть?отмаплены все глобальные переменные-дальше ручками рихтуется старт-ап.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.