Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Привязка переменных к регистрам в GCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kopa
Для оптимизации проги необходимо
привязать переменную-указатель к индексному регистру.

Не понимаю как это сделать в GCC для AVR
haker_fox
Я конечно ламер, но может доверить оптимизацию компилятору? Прошу не пинать если я что-то не допонял.

Или вооружиться асмом?
Kopa
Цитата(haker_fox @ Oct 26 2005, 07:58)
может доверить оптимизацию компилятору?
*


Для оптимизатора все переменные равноправны и поэтому он не
знает какую из них использовать для расположения в регистре.
В си языке есть регистровые переменные объявленные с использованием
ключевого слова register
{
register int y;
...
}
" Регистровые переменные являются временными, их значения сохраняются в
регистрах, если последние доступны. В регистрах можно сохранить любые переменные, если размер занимаемой ими памяти не превышает разрядности регистра. Если компилятор не может сохранить переменные в регистрах, он трактует их как автоматические. Областью действия является блок. Операция
получения адреса & не применима к регистровым переменным."
М.И. Болски "Язык программирования Си"

В моем случае создание глобального указателя в индексном регистре
сократит существенно размер кода.

Цитата(haker_fox @ Oct 26 2005, 07:58)
Или вооружиться асмом?
*

Может быть, возможно через асм это легко делается.
Это путь я еще не опробовал.
Виктория
А что Вам мешает использовать тот же модификатор register?

Вроде этого
register int *y;

или вопрос сформулируйте точнее.
Kopa
Цитата(Vic1 @ Oct 26 2005, 10:23)
А что Вам мешает использовать тот же модификатор register?

Вроде этого
register int *y;

*

Компилятор ругается на register( может руки кривыеsmile.gif и где гарантия что данный регистр не понадобится в другом месте компилятора и повторяю переменная должна попасть в индексный регистр и жить вечноsmile.gif. Если я правильно понимаю
register переменные распологаются внутри блока.
haker_fox
Интересно, мой IAR EWAVR 4.11A указатели кладет в XH:XL & ZH:ZL
И действительно, любому компилятору логичнее вроде бы размещать указатели на память данных в регистровых парах X, Y, Z. Или я что-то не допонял опять. Не ругайте только, самому интересно разобратьтся.
Kopa
Цитата(haker_fox @ Oct 26 2005, 10:35)
Или я что-то не допонял опять. Не ругайте только, самому интересно разобратьтся.
*

Вопрос был задан для AVR GCC smile.gif и остальное см. выше.
Виктория
Регистровые переменные внутри блока - естественно. Компилятору -больше свободы для маневров. Не вижу в этом проблем и для программиста.
Например у Вас есть глобальный указатель

int *y;

Работа с памятью через этот указатель осуществляется в функции

void func()
{register int *yy=y;
...
}

Т.е при входе в функцию индексный регистр занимается, а при выходе освобождается. Это общий принцип. Не знаю, может быть в конкретизации к AVR есть еще какие то дополнительные возможности.
haker_fox
Цитата
Т.е при входе в функцию индексный регистр занимается, а при выходе освобождается. Это общий принцип. Не знаю, может быть в конкретизации к AVR есть еще какие то дополнительные возможности.

Ну вот и IAR EWAVR так же делает. И действительно, индексных регистра всего три и было бы слишком расточительно занимать один из них постоянно под указатель. Просматривая дизассемблированный текст функции, я обнаружил, что при входе в нее индексная пара инициализируется адресом. Т.е. происходит инициализация указателя.
Kopa
Цитата(Vic1 @ Oct 26 2005, 10:43)
Т.е при входе в функцию индексный регистр занимается, а при выходе освобождается. Это общий принцип.
*

Имеет смысл в чатстных задачах в ручную управлять регистрами процессора.
Со 100% гарантией, что нигде они не будут использованы. т.к. программа
пишется для встроенного оборудования и ресурсов контроллера может
не хватить.
haker_fox
Цитата
Имеет смысл в чатстных задачах в ручную управлять регистрами процессора.
Со 100% гарантией, что нигде они не будут использованы. т.к. программа
пишется для встроенного оборудования и ресурсов контроллера может
не хватить.

Может для этого и служит ассемблер?
Kopa
[quote=haker_fox,Oct 26 2005, 11:01]
[quote]
Может для этого и служит ассемблер?
*

[/quote]
А как же тогда куча всяких классификаторов Сиsmile.gif
Это должно делаться легко и непринужденно на языке Си, если процессор
позволяет.

P.S. Кто подскажет решение обозначенное в заданом вопросе????
Виктория
То есть вопрос состоит в том, если для GNU C определение глобальных регистровых переменных типа такого, как это есть в GNU C для ARM и других процессоров

register int *foo asm (“a5”);
Виктория
Кора, а документации на компилятор у Вас нет? Ведь этот раздел можно там найти быстрее, чем здесь ответят (нечто такое Defining Global Register Variables).
Kopa
Цитата(Vic1 @ Oct 26 2005, 11:12)
register int *foo asm (“a5”);
*

Возможно это сработает. Буду пробовать что получится.

Спасибо за первый совет.
Наверное будет так: register int *foo asm (“r28”);

Но, чтобы компилятор больше не использовал индексный регистр для других целей, думаю что не получится!!!

P.S. По документации не все еще изучил, а FAQ в данной ветке нету.
oll
Я делал типа
register unsigned char tyty asm("r4");
- работает - есть в описании- avr-libc-user-manual-1.2.3.pdf
xyzzy
Цитата(Vic1 @ Oct 26 2005, 01:12)
register int *foo asm (“a5”);
*


Только аккуратно надо с этим быть.
Если слишком много регистров явно отдано под переменные, то компилятору становится сложнее (а иногда и невозможно) сгенерировать корректный код.

Особенно это заметно, если регистровые переменные 16-битные. и под них отданы регистровые пары X,Y,Z

Компилятор после этого регулярно разваливается со внутренней ошибкой. blink.gif
Виктория
Цитата(xyzzy @ Oct 28 2005, 11:33)
Цитата(Vic1 @ Oct 26 2005, 01:12)
register int *foo asm (“a5”);
*


Только аккуратно надо с этим быть.
Если слишком много регистров явно отдано под переменные, то компилятору становится сложнее (а иногда и невозможно) сгенерировать корректный код.
...
*



Вообще то, я тоже против явного использования регистров, в большинстве случаев (99.9% excl.gif ) достаточен мой первый совет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.