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

 
 
> Локальные переменные и регистры
_Артём_
сообщение Mar 26 2007, 18:54
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Как заставить IAR расположить переменную вида
Код
union TADCResult {
    int adc_result_us;
    unsigned char adc_result_uc[2];
};

в регистры.

Пробовал в функции объявить ёё так:

register union TADCResult adc_fast;

не получилось - adc_fast всё равно в SRAM-е.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Mar 26 2007, 20:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А зачем вам это нужно? Компиляторы Си чаще всего "кладут" на квалификатор register . Если вам нужно "блох ловить" в виде отдельных тактов (быстродействие процедуры обеспечить) , то пишите всю функцию на ассемблере и прилинковывайте ее к СИшному исходнику.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 26 2007, 20:59
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(rezident @ Mar 26 2007, 21:08) *
А зачем вам это нужно? Компиляторы Си чаще всего "кладут" на квалификатор register . Если вам нужно "блох ловить" в виде отдельных тактов (быстродействие процедуры обеспечить) , то пишите всю функцию на ассемблере и прилинковывайте ее к СИшному исходнику.

Ну для этого не обязательно асемблером пользоваться
можно например так (в IAR)
__regvar __no_init TADCResult adc_fast @ 14;

разместит Ваш union в регистрах R15:R14

P.S. только проверьте, я для union никогда не пользовался этим
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 26 2007, 23:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(singlskv @ Mar 26 2007, 20:59) *
Ну для этого не обязательно асемблером пользоваться
можно например так (в IAR)
__regvar __no_init TADCResult adc_fast @ 14;

разместит Ваш union в регистрах R15:R14


Не проходит IAR выдаёт ошибку:

Error[Pa043]: the keyword "__regvar" is not available with the current settings. Registers must be locked
with --lock_regs before __regvar can be used
Error[Be012]: location address not allowed (object must have static storage duration and be const or
__no_init)

Если вместо union-а написать так
__regvar __no_init unsigned char adc_fast @ 14;
то результат тот же...
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 26 2007, 23:13
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(_Артём_ @ Mar 27 2007, 02:08) *
Не проходит IAR выдаёт ошибку:

Error[Pa043]: the keyword "__regvar" is not available with the current settings. Registers must be locked
with --lock_regs before __regvar can be used

Правильно. Компилятор уведомляет вас о том, что если вы хотите использовать указанные регистры как регистровые переменные, то перед этим в настройках вы должны зарезервировать их для своих нужд. Потому что при установках по-умолчанию компилятор использует все регистры так, как ему удобнее.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 26 2007, 23:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(rezident @ Mar 26 2007, 23:13) *
Правильно. Компилятор уведомляет вас о том, что если вы хотите использовать указанные регистры как регистровые переменные, то перед этим в настройках вы должны зарезервировать их для своих нужд. Потому что при установках по-умолчанию компилятор использует все регистры так, как ему удобнее.

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



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:38
Рейтинг@Mail.ru


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