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

 
 
> Локалные переменные в регистры
Student2
сообщение Oct 27 2009, 03:37
Сообщение #1


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Не тайна что через использование ключевое слово register можно указать компилятору поставит переменную в регистр. В проекте можно тоже указать компилятору не использовать определенные регистры и потом создать глобальные регистровые переменные.

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

Например:
Код


register uint8_t var1, var2, var3, var4; // переменные в регистры

var1 = 15; // установка значения
var2 = 61;
var3 = 45;
var4 = 1;

DDRA = var1;
PORTC = var2;
DDRA = var3;
DDRB = var4;


После компиляции часто можно увидеть что в листинге находиться что то вроде:

Код

// DDRA = var1;
0000017A E07F       LDI   R23, 15    // load R23 with 15
0000017C B97D       OUT   0x0D, R23 // out to DDRA


вместо ожидаемого:


Код

// DDRA = var1;
0000017C B97D       OUT   0x0D, R21 // out directly var1 to DDRA


Как можно обмануть компилятору и поставить локальные переменные воистину в регистры (без использование глобальных переменных в регистров).

Сообщение отредактировал Student2 - Oct 27 2009, 03:38
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Bill
сообщение Nov 9 2009, 20:10
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Student2 @ Oct 27 2009, 07:37) *
Не тайна...

Компилятор вообще игнорирует ключевое слово register. Если хорошенько подумаете, то поймете почему.
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
sKWO
сообщение Nov 14 2009, 10:23
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Интерессно, а переменную типа флоат компилятор используя соглашения предлагает разместить поочерёдно в регистрах с 16- го по 19й при инициализ. ф-ции fooxx.
В fooxx_stage2 при попытке доступа к регистрам они сначала размещаются на стеке а потом меняются местами тоесть обратно перегружаются в обратном порядке (19 равен 16му и тд).
Почему компилятор поступает так с рабочими регистрами остаётся загадкой. Пробовал с максимальной оптимизацией по скорости.
Если в цикле например увеличивать её значение (переменной) то порядок проинициализированных рабочих регистров в ф-ции fooxx в fooxx_stage2 не изменяется.
Ето нужно учитывать при написании асм функций.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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