Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Локальные переменные и регистры
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
_Артём_
Как заставить IAR расположить переменную вида
Код
union TADCResult {
    int adc_result_us;
    unsigned char adc_result_uc[2];
};

в регистры.

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

register union TADCResult adc_fast;

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

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

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

P.S. только проверьте, я для union никогда не пользовался этим
_Артём_
Цитата(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;
то результат тот же...
rezident
Цитата(_Артём_ @ 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

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

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


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