реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как запретить компилятору IAR убирать переменные
DpInRock
сообщение Dec 10 2008, 00:54
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Размещаю в __eeprom некоторое количество переменных. Потом копирую их в RAM просто по указателю. И далее так и использую.
Как заставить компилятор IAR не убирать эти переменные из епрома?

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

volatile не помогает.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 10 2008, 01:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Вставлять эту прагму после объявления переменной.
Go to the top of the page
 
+Quote Post
plombir
сообщение Dec 10 2008, 06:20
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191



__root __eeprom ...
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 10 2008, 10:38
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



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

Извинения за трабл.

Сообщение отредактировал DpInRock - Dec 10 2008, 10:44


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 10 2008, 10:50
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 10 2008, 13:40
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Исходник простой. До безобразия.

Код
#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, 14:03


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 10 2008, 14:24
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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

Из вашего первого поста было непонятно, что вы указатель устанавливаете на одну переменную, а копируете через него и другие тоже. И эти другие как раз и исчезают. Вам надо было просто заключить все эти копируемые переменные в структуру. Тогда вы могли бы гарантировать и их взаимное расположение.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 22:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.03472 секунд с 7
ELECTRONIX ©2004-2016