Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Что сказать компилятору, чтобы он не убирал переменную
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Karl
как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.
_Bill
Цитата(Karl @ Nov 15 2006, 13:49) *
как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

А тогда зачем она нужна вообще?
IgorKossak
Цитата(Karl @ Nov 15 2006, 12:49) *
как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

Добавьте перед её обьявлением __root
Karl
Цитата(IgorKossak @ Nov 15 2006, 16:09) *
Цитата(Karl @ Nov 15 2006, 12:49) *

как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

Добавьте перед её обьявлением __root


Не помогло... Наверное действует только на глобальные переменные
GetSmart
Для АРМов в IARе я делаю так:

#pragma required = Name

где Name => переменная или процедура. Насчёт локальных переменных не пробывал. Может сработает, а может и нет.
Сергей Борщ
Цитата(Karl @ Nov 15 2006, 13:20) *
Цитата(IgorKossak @ Nov 15 2006, 16:09) *

Цитата(Karl @ Nov 15 2006, 12:49) *

как отменить оптимизацию для определенных переменных? Мне необходимо, чтобы проинициализировалась переменная, которая не используется в последующем коде.

Добавьте перед её обьявлением __root


Не помогло... Наверное действует только на глобальные переменные

Если локальная, объявите ее как volatile.
IgorKossak
Для локальных переменных память выделяется в стеке.
И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю.
makc
Цитата(IgorKossak @ Nov 15 2006, 16:06) *
Для локальных переменных память выделяется в стеке.
И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю.


Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
dxp
Цитата(makc @ Nov 15 2006, 19:30) *
...сделать volatile, то по идее компилятор должен будет ее сохранить.

Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков.
makc
Цитата(dxp @ Nov 15 2006, 16:41) *
Цитата(makc @ Nov 15 2006, 19:30) *

...сделать volatile, то по идее компилятор должен будет ее сохранить.

Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков.


Простой эксперимент:
arm-elf-gcc --version :
Код
arm-elf-gcc (GCC) 4.1.0
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Два исходника:
Код
int f(int a, int b)
{
    static volatile int    c;
    return a+b;
}


и

Код
int f(int a, int b)
{
    int    c;
    return a+b;
}


arm-elf-objdump -x test1.o :
Цитата
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000024 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 00000000 00000000 00000058 2**2
ALLOC
3 .comment 00000012 00000000 00000000 00000058 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l df *ABS* 00000000 test.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l .bss 00000000 c.1237
00000000 l d .comment 00000000 .comment
00000000 g F .text 00000024 f


arm-elf-objdump -x test2.o :
Цитата
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000024 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000058 2**0
ALLOC
3 .comment 00000012 00000000 00000000 00000058 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l df *ABS* 00000000 test.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 g F .text 00000024 f


Вывод - static volatile int - выделяется не в стеке, а в .bss и сохраняется компилятором даже если не используется в функции. Что и требовалось. Хотя и просто static int тоже остается.
dxp
Цитата(makc @ Nov 15 2006, 20:24) *
Цитата(dxp @ Nov 15 2006, 16:41) *
Цитата(makc @ Nov 15 2006, 19:30) *

...сделать volatile, то по идее компилятор должен будет ее сохранить.

Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков.


Простой эксперимент:
arm-elf-gcc --version :

[...]

Вывод - static volatile int - выделяется не в стеке, а в .bss и сохраняется компилятором даже если не используется в функции. Что и требовалось. Хотя и просто static int тоже остается.

Да я ж разве спорю. Я вообще не про это. Я про то, что, если локальную нестатическую переменную объявить как volatile, то компилятор никуда ее не уберет, даже если она не используется. Т.е. никаких трюков не требуется для того, чтобы компилятор ее оставил.

А то, что статические объекты (как и глобальные) живут в static storage duration memory (которая в Вашем компиляторе называется .bss), так это бесспорно - это по Стандарту. Мой пост скорее был поддакиванием Вашему smile.gif и относился к фразе уважаемого IgorKossak:

Цитата
И если локальная переменная не используется, нет способа заставить компилятор выделять под неё память. Разве что какие-нибудь трюки, которых я не знаю.


Прошу прощения, что ввел в заблуждение.
Сергей Борщ
Цитата(makc @ Nov 15 2006, 15:30) *
Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
А сохранить же ее исходно и не требовалось. Требовалось проинициализировать. С этим справляется volatile и без static
Karl
Цитата(Сергей Борщ @ Nov 15 2006, 21:03) *
Цитата(makc @ Nov 15 2006, 15:30) *

Если локальная переменная объявлена как static, то память для нее будет выделяться либо в .data, либо в .bss, но никак ни в стеке. А если ее кроме того сделать volatile, то по идее компилятор должен будет ее сохранить.
А сохранить же ее исходно и не требовалось. Требовалось проинициализировать. С этим справляется volatile и без static

smile.gif
Уточню вопрос. volatile безусловно работает. Об этом я всегда знал. Но мне это не подходит. Мне необхо добиться максимальной скорости выполнения подпрограммы. Поэтому сохранение переменной в стеке крайне нежелательно. Дальше. Есть кусок кода, который компилируется неоптимально:
u32 summ;
s16 kan
....
kan-=(summ>>13);

Тут компилятор перед вычитанием делает сдвиг на 13 вправо. Гораздо быстрее было бы сделать сдвиг на 3 влево и взять два старших байта. Вот это я заставить компилятор сделать никак не могу. Хотел сделать асм вставку, но тогда просто не инициализируется переменная summ. Отключение оптимизации и тупое

u32 tmp = summ<<3;
kan-=tmp>>16;

тоже не помогает. Генерится тот же код, что и в первом случае. Вот в чем моя проблема.
IgorKossak
Тогда что мешает сделать переменную просто глобальной если под неё нужно выделять память не в стеке?
В этом случае она будет отличаться от статической с атрибутами static volatile разве что областью видимости.
Подозреваю, что проблема носит скорее академический, нежели прикладной интерес.
arttab
а если violates? или я что то путаю?
Karl
Цитата(IgorKossak @ Nov 16 2006, 18:34) *
Тогда что мешает сделать переменную просто глобальной если под неё нужно выделять память не в стеке?
В этом случае она будет отличаться от статической с атрибутами static volatile разве что областью видимости.
Подозреваю, что проблема носит скорее академический, нежели прикладной интерес.


Для максимального быстродействия необходимо, чтобы перемення располагалась в регистрах.

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