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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Привязка переменных к регистрам в GCC, как это делается?
Kopa
сообщение Oct 26 2005, 04:48
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



Для оптимизации проги необходимо
привязать переменную-указатель к индексному регистру.

Не понимаю как это сделать в GCC для AVR
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 26 2005, 04:58
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Или вооружиться асмом?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Oct 26 2005, 07:15
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



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


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

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

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

Может быть, возможно через асм это легко делается.
Это путь я еще не опробовал.
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 26 2005, 07:23
Сообщение #4


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



А что Вам мешает использовать тот же модификатор register?

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

или вопрос сформулируйте точнее.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Oct 26 2005, 07:28
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



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

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

*

Компилятор ругается на register( может руки кривыеsmile.gif и где гарантия что данный регистр не понадобится в другом месте компилятора и повторяю переменная должна попасть в индексный регистр и жить вечноsmile.gif. Если я правильно понимаю
register переменные распологаются внутри блока.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 26 2005, 07:35
Сообщение #6


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Интересно, мой IAR EWAVR 4.11A указатели кладет в XH:XL & ZH:ZL
И действительно, любому компилятору логичнее вроде бы размещать указатели на память данных в регистровых парах X, Y, Z. Или я что-то не допонял опять. Не ругайте только, самому интересно разобратьтся.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Oct 26 2005, 07:37
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



Цитата(haker_fox @ Oct 26 2005, 10:35)
Или я что-то не допонял опять. Не ругайте только, самому интересно разобратьтся.
*

Вопрос был задан для AVR GCC smile.gif и остальное см. выше.
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 26 2005, 07:43
Сообщение #8


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



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

int *y;

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

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

Т.е при входе в функцию индексный регистр занимается, а при выходе освобождается. Это общий принцип. Не знаю, может быть в конкретизации к AVR есть еще какие то дополнительные возможности.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 26 2005, 07:53
Сообщение #9


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Ну вот и IAR EWAVR так же делает. И действительно, индексных регистра всего три и было бы слишком расточительно занимать один из них постоянно под указатель. Просматривая дизассемблированный текст функции, я обнаружил, что при входе в нее индексная пара инициализируется адресом. Т.е. происходит инициализация указателя.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Oct 26 2005, 07:54
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



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

Имеет смысл в чатстных задачах в ручную управлять регистрами процессора.
Со 100% гарантией, что нигде они не будут использованы. т.к. программа
пишется для встроенного оборудования и ресурсов контроллера может
не хватить.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Oct 26 2005, 08:01
Сообщение #11


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Может для этого и служит ассемблер?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Kopa
сообщение Oct 26 2005, 08:06
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



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

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

P.S. Кто подскажет решение обозначенное в заданом вопросе????
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 26 2005, 08:12
Сообщение #13


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



То есть вопрос состоит в том, если для GNU C определение глобальных регистровых переменных типа такого, как это есть в GNU C для ARM и других процессоров

register int *foo asm (“a5”);
Go to the top of the page
 
+Quote Post
Виктория
сообщение Oct 26 2005, 08:15
Сообщение #14


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Кора, а документации на компилятор у Вас нет? Ведь этот раздел можно там найти быстрее, чем здесь ответят (нечто такое Defining Global Register Variables).
Go to the top of the page
 
+Quote Post
Kopa
сообщение Oct 26 2005, 08:22
Сообщение #15


Знающий
****

Группа: Участник
Сообщений: 598
Регистрация: 22-08-05
Пользователь №: 7 861



Цитата(Vic1 @ Oct 26 2005, 11:12)
register int *foo asm (“a5”);
*

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

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

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

P.S. По документации не все еще изучил, а FAQ в данной ветке нету.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 17th June 2025 - 10:12
Рейтинг@Mail.ru


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