Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Всем привет! Как заставить IAR...

Отправлено P_Andrey 07 декабря 2006 г. 14:13


Имеется небольшой текст

void main (void)
{
unsigned int frame;
register unsigned char ck1=0x08,ck2=0x20;
DDRC = 0xff;
while (1)
{
PORTC=ck1;
PORTC|=(1< <2);
PORTC|=(1< <4);
PORTC=ck1;

PORTC=ck2;
PORTC|=(1< <4);
PORTC&=~(1< <4);

frame=1050;
while (frame)
{
PORTC=ck1;
PORTC|=(1< <4);
PORTC&=~(1< <4);

PORTC=ck2;
PORTC|=(1< <4);
PORTC&=~(1< <4);
frame--;
}
}
}


и листинг......

21 while (1)
22 {
23 PORTC=ck1;
\ ??main_0:
\ 00000016 E008 LDI R16,8
\ 00000018 BB05 OUT 0x15,R16
24 PORTC|=(1<<2);
\ 0000001A 9AAA SBI 0x15,0x02
25 PORTC|=(1<<4);
\ 0000001C 9AAC SBI 0x15,0x04
26 PORTC=ck1;
\ 0000001E BB05 OUT 0x15,R16
27
28 PORTC=ck2;
\ 00000020 E200 LDI R16,32
\ 00000022 BB05 OUT 0x15,R16
29 PORTC|=(1<<4);
\ 00000024 9AAC SBI 0x15,0x04
30 PORTC&=~(1<<4);
\ 00000026 98AC CBI 0x15,0x04
31
32 frame=1050;
\ 00000028 E1EA LDI R30,26
\ 0000002A E0F4 LDI R31,4
33 while (frame)
34 {
35 PORTC=ck1;
\ ??main_1:
\ 0000002C E008 LDI R16,8
\ 0000002E BB05 OUT 0x15,R16
36 PORTC|=(1<<4);
\ 00000030 9AAC SBI 0x15,0x04
37 PORTC&=~(1<<4);
\ 00000032 98AC CBI 0x15,0x04
38
39 PORTC=ck2;
\ 00000034 E200 LDI R16,32
\ 00000036 BB05 OUT 0x15,R16
40 PORTC|=(1<<4);
\ 00000038 9AAC SBI 0x15,0x04
41 PORTC&=~(1<<4);
\ 0000003A 98AC CBI 0x15,0x04
42 frame--;
\ 0000003C 9731 SBIW R31 : R30,1
43 }
\ 0000003E 2F0E MOV R16,R30
\ 00000040 2B0F OR R16,R31
\ 00000042 F7A1 BRNE ??main_1
\ 00000044 CFE8 RJMP ??main_0
44 }
45 }

Так вот, на строчки PORTC=ck1 генерится пара инструкций: LDI R16,8; OUT 0x15,R16;
Теперь вопрос - как заставить IAR один раз разместьть константу 8 в каком то неиспользуемом регистре, допустим R1, и на строчку PORTC=ck1 генерить только OUT 0x15,R1 ?
И еще вопрос: 42-я срочка листинга - после SBIW R31 : R30,1 зачем идут команды MOV R16,R30 и OR R16,R31? Разве команда SBIW не выставляет флаг Z ???


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа

Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите шесть пополам:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru