Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAvr, секция noinit
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Qwertty
Понадобилось, на случай сбоя, сохранить данные для следующего запуска программы. Показалось, что все просто - объявить переменную в секции noinit и проверять ее значение после сброса. Но ни тут то было, в переменной все что угодно, только не то, что я туда записал. Проверялось так:
Код
uint8_t old_data __attribute__ ((section (".noinit")));

int main(void)
{
   if(old_data==0xAB) LED_ON;
   old_data=0xAB;
   while(1)
     {
     }
}

Тут не все, не описан макрос вкл. светодиод и нет инициализации порта, которая выполняется до проверки переменной. В общем подаю питание, замыкаю ресет на землю... светодиод не горит crying.gif
Может я в корне ошибаюсь и эта методика не подходит для сохранения данных?
WinAvr20060421.
aesok
Прогнал тестовый пимер в симуляторе:
Код
#include <avr/io.h>

unsigned char old_data __attribute__ ((section (".noinit")));

int main(void)
{
   if(old_data==0xAB)
       PORTD = 0;
   old_data=0xAB;
   while(1)
     {
     }
}


Работает. Первый раз идет инициализация переменной 'old_data', во второй раз, посте сброса, идет запись в порт D.

Высылайте неработающий пример полностью, со всеми макросами.

Анатолий.
ReAl
Цитата(Qwertty @ Jul 30 2007, 00:02) *
Понадобилось, на случай сбоя, сохранить данные для следующего запуска программы.

noinit - это указание компилятору не инициализировать, а не контроллеру сохранить.
После сброса при наличии питания без перерывов (кнопка, WDT) данные сохранятся, как сказал уже aesok.
А вот после передёрга питания - только если секция noinit положена в энергонезависимую память, что совершенно другая история.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.