Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Освобождение ОЗУ от "условно глобальных" переменных
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
ibiza11
Доброго времени суток уважаемые форумчане!

По названию темы вряд ли можно понять, что мне требуется, объясню подробнее.
Есть устройство, которое работает в двух различных режимах. Оба режима очень требовательны к объему ОЗУ для размещения "условно глобальных" переменных, которые могут меняться и в прерывании и в основном цикле.
Устройство переходит из одного режима в другой по нажатию кнопки, по выставленному после нажатия флагу.
Получается, что есть два набора "условно глобальных" переменных никак не пересекающихся друг с другом, существующих только в пределах текущего режима. Каждый режим использует только свою группу переменных и не обращается ко второй группе.
Объема ОЗУ микроконтроллера не достаточно для одновременного хранения двух групп переменных.
Как реализовать на Си алгоритм при котором, при входе в один режим инициализировалась одна группа переменных, доступных как для основного цикла, так и для прерываний, а переходе во второй режим - освобождалась память, занятая предыдущей группой и инициализировалась вторая группа переменных, физически находящаяся по адресам первой группы переменных?
В программировании на Си новичек, пните пожалуйста в нужном направлении. Компилятор IAR AVR.
Непомнящий Евгений
Код
union
{
  struct
  {
    int a, b, c;
  } mode1;

  struct
  {
    int a;
    double b;
  } mode2;

} global;

void switchMode()
{
  memset(&global, 0, sizeof(global));
}

global.mode1.a = 10;

switchMode();

gloal.mode2.b = 10.5;
rezident
Цитата(ibiza11 @ Apr 7 2011, 15:04) *
программировании на Си новичек, пните пожалуйста в нужном направлении.
Вы указатели и структуры уже знаете или еще нет? Если нет, то ознакомьтесь. Очень полезные "фичи" языка Си wink.gif
ibiza11
стоило написать, что я новичек, так реально пнули. wacko.gif
rezident, для здешних гуру я вообще новичек, но не до такой степени... Про структуры и про указатели конечно же знаю, привык читать мануалы раньше чем вопросы задавать. Не верите, недавно я задавал вопрос про указатель на глобальную структуру в форуме Микроконтроллеры->AVR. Почитайте, если интересно. Может, что от Вас нового узнаю по той теме. Вы бы хоть вчитались в суть проблемы, прежде чем издевки писать...

Непомнящий Евгений, Спасибо. Не знал про функцию memset. Вопрос по вашему коду: разве при указании имени переменной данного типа (mode1, mode2) сразу после объявлении структуры, под эти переменные не выделяется память? Если да, то обе структуры будут одновременно храниться в памяти, но так они не поместятся в ОЗУ.
P.S. Все разобрался wink.gif union пропустил, оказывается полезняшка мне подходитsm.gif Непомнящий Евгений, огромное спасибо)

rezident, вот структуры и нипричем оказались, не с той ноги чтоли встали сегодня?
Палыч
Цитата(ibiza11 @ Apr 7 2011, 16:47) *
разве при указании имени переменной данного типа (mode1, mode2) сразу после объявлении структуры, под эти переменные не выделяется память?
Под объединение (union) выделяется память, достаточная, чтобы разместить наибольших из своих объектов (в Вашем случае - структур). Каждый из объектов (структур) будет занимать в памяти одно и то же место (начинаться с одного адреса).
ibiza11
Да, спасибо, Палыч, уже разобрался wink.gif
ViKo
bb-offtopic.gif
Извиняюсь за офтопик, но, натыкаясь на эту тему воспринимаю информацию как "Освобождение из СИЗО условно-досрочно!"
biggrin.gif

P.S. А почему последним писателем висит rezident?
С этим разобрался. Из-за переноса темы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.