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

 
 
 
Reply to this topicStart new topic
> Локальные переменные и регистры
_Артём_
сообщение 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
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
Rst7
сообщение Mar 27 2007, 08:00
Сообщение #7


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(_Артём_ @ Mar 26 2007, 18:54) *
Как заставить IAR расположить переменную вида
Код
union TADCResult {
    int adc_result_us;
    unsigned char adc_result_uc[2];
};

в регистры.


Ставим вопрос по другому? Нафига этот код? Я так понимаю, для создания результата в виде int'a? Иар вполе справляется с int adc_result_us=ADC, при этом все работает как надо (порядок чтения соблюдается). Где-то это даже в доке указано, что специально гарантируется...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Mar 27 2007, 15:12
Сообщение #8


Гуру
******

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



Цитата(Rst7 @ Mar 27 2007, 08:00) *
Ставим вопрос по другому? Нафига этот код? Я так понимаю, для создания результата в виде int'a? Иар вполе справляется с int adc_result_us=ADC, при этом все работает как надо (порядок чтения соблюдается). Где-то это даже в доке указано, что специально гарантируется...


Этот код для использования результата ADC(и не только) в виде байт или слов в зависимости от ситуации.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 27 2007, 15:46
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_Артём_ @ Mar 27 2007, 14:12) *
Этот код для использования результата ADC(и не только) в виде байт или слов в зависимости от ситуации.
Это как раз тот случай, когда компилятор адекватно реагирует на нашии желания, выраженные "в лоб". При включении любой оптимизации ИАР прекрасно оптимизирует такие конструкции:
Код
uint16_t word = (((uint16_t)ByteHi) << 8) | ByteLo;
uint8_t LoByte = word;
uint8_t HiByte = word >> 8;
Аналогично и для 32-битных переменных.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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