Ошибка в компиляторе IAR EW430 V2.20A... ;(((
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SOIC 23 июня 2003 г. 16:50


extern "C" void lcd_scroll(void)
{
unsigned int x,y,plus;
unsigned char s;
for(y=1; y < 4; y++)
for(x=0; x < 20; x++)
{
if(y&0x02) plus=20;
else plus=0;
if(y&0x01) lcd_cmd(0xC0+plus+x);
else lcd_cmd(0x80+plus+x);
s = lcd_read_dat();
if((y-1)&0x02) plus=20;

//
// Результат компиляции:
//
// MOV.B R10, R14 ; y -> R14
// ADD.B #0xff, R14 ; OK
// BIT.B #0x2, R14 ; OK
// JEQ $else... ; OK
// $plus = 20
//

else plus=0;
if((y-1)&0x01) lcd_cmd(0xC0+plus+x);

//
// Результат компиляции:
//
// mov.b R10,R14 ; y -> R14
// and.b #0x1,R14 ; BUG! почему??? (неправильный порядок инструкций???)
// add.b #0x1,R14 ; BUG!
// tst.b R14 ; BUG! почему??? (может быть "bit.b #0x01,R14" ???)
// jeq $else... ; result - incorrect jump!!!
// $lcd_cmd(...
//

else lcd_cmd(0x80+plus+x);
lcd_dat(s);
}
lcd_cmd(0xC0+20); // at line 3

for(x=0; x < 20; x++) lcd_dat(' ');
lcd_cmd(0xC0+20); // at line 3
}

error situation:


y = 1

mov.b R10,R14 ; R14 = 1
and.b #0x1,R14 ; R14 = R14 & 0x01 = 1 & 0x01 = 1
add.b #0x1,R14 ; R14 = R14 + 0x01 = 1 + 0x01 = 2
tst.b R14 ; R14=2 ==>NOT ZERO! (а правильно ZERO!)
jeq $else... ; jump не происходит (а должен произойти!)


вероятно компилятор ошибочно переставляет местами инструкции "and.b #0x1,R14" и "add.b #0x1,R14"???

Очевидно ошибка парсера выражений в ПОЛИЗ... ;(((


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru