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

 
 
> Локалные переменные в регистры
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
Ответов
MALLOY2
сообщение Oct 27 2009, 05:34
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
ключевое слово register


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

Цитата
В итоге это одна инструкция больше!



Какая риазница ?
Код
LDI R0,  15;  // установка значения
LDI R1,  61;
LDI R2,  45;
LDI R3,  1;  

OUT DDRA,  R0;
OUT PORTC, R1;
OUT DDRA,  R2;
OUT DDRB,  R3;


или

Код
LDI R0,  15;  
OUT DDRA,  R0;
LDI R0,  61;  
OUT PORTC, R0;
LDI R0,  45;  
OUT DDRA,  R0;
LDI R0,  1;  
OUT DDRB,  R0;
Go to the top of the page
 
+Quote Post
Student2
сообщение Oct 27 2009, 05:59
Сообщение #3


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

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



Цитата
Какая риазница ?


Если установка PORTA DDRA произходить в цикле разница получается доволно большая и заметная.

Код
LDI R0,  15;  // установка значения
LDI R1,  61;
LDI R2,  45;
LDI R3,  1;  

....
for (uint16_t ii = 0; ii < 1000; ii++)
{
OUT DDRA,  R0;
OUT PORTC, R1;
OUT DDRA,  R2;
OUT DDRB,  R3;
}


намного быстрее (1000 clocks!!!!) чем :

Код
for (uint16_t ii = 0; ii < 1000; ii++)
{
LDI R0,  15;  
OUT DDRA,  R0;
LDI R0,  61;  
OUT PORTC, R0;
LDI R0,  45;  
OUT DDRA,  R0;
LDI R0,  1;  
OUT DDRB,  R0;
}


Сообщение отредактировал Student2 - Oct 27 2009, 06:00
Go to the top of the page
 
+Quote Post

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


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

 


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


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