Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как запретить компилятору IAR убирать переменные
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
DpInRock
Размещаю в __eeprom некоторое количество переменных. Потом копирую их в RAM просто по указателю. И далее так и использую.
Как заставить компилятор IAR не убирать эти переменные из епрома?

Ставить несколько вызовов для этих переменных - не хочется. Оптимизатор их может убрать, а вслед за этим и переменные грохнет.

volatile не помогает.
rezident
Не знаю поддерживает ли ваша версия эту прагму, но попробуйте
Код
#pragma required=<имя переменной или структуры>

Вставлять эту прагму после объявления переменной.
plombir
__root __eeprom ...
DpInRock
Спасибо большое. Оба способа работают, мог бы и сам догадаться, хотя бы про required. Видно пора прекращать программировать по ранним утрам.

Извинения за трабл.
Сергей Борщ
Цитата(DpInRock @ Dec 10 2008, 12:38) *
Спасибо большое. Оба способа работают, мог бы и сам догадаться, хотя бы про required.
Странно, что не работает volatile. Можно посмотреть кусочек исходника и листинг с volatile и с __root?
DpInRock
Исходник простой. До безобразия.

Код
#pragma location=0x00
__root __eeprom volatile int tab[83]=
{....};

Без root точно такой же, но без root.

В листинге с рут
Код
\                                 In segment EEPROM_AN, at 0x0, root
   \   int volatile __eeprom tab[83]
   \                     tab:
   \   00000000   03C603C203BE       DW 966, 962, 958, 954, 950, 945, 940, 935, 930, 925, 919, 913, 907, 901
   \              03BA03B603B1
   \              03AC03A703A2


Без рут - в листинге отсутствует всякое упоминание. Поэтому и примера листинга не будет.

Если всего три переменных и у каждой определить location, то переменные без рут будут просто пропущены. Т.е. как и не было. И обращение к тем местам в епром, где они как бы должны быть оканчивается чтением FF.
Если хоть раз упомянуть имя - переменная остается в памяти и все хорошо.

-- Если добавить в прогамму упоминание, чтобы сохранить переменную, то листинг выглядит абсолютно идентично, исключая слово root в строке In segment EEPROM_AN, at 0x0.
Сергей Борщ
Цитата(DpInRock @ Dec 10 2008, 15:40) *
Без рут - в листинге отсутствует всякое упоминание. Поэтому и примера листинга не будет.
А, так переменная в коде не используется? Тогда, конечно, __root. Вот если бы она использовалась и компилятор вместо чтения вставил бы загрузку константы - тогда другое дело. Без обращения все понятно, volatile не поможет.

Из вашего первого поста было непонятно, что вы указатель устанавливаете на одну переменную, а копируете через него и другие тоже. И эти другие как раз и исчезают. Вам надо было просто заключить все эти копируемые переменные в структуру. Тогда вы могли бы гарантировать и их взаимное расположение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.