Цитата(Сергей Борщ @ Feb 22 2012, 02:53)

Я никогда не использовал регистровые переменные, но часто читал о магическом ключике компилятора -ffixed-reg.
Проблема не в Си коде , а данный ключик я так понимаю относится именно к Си.
Воодщемполностью заголовочный файл:
Код
#ifdef __ASSEMBLER__
# define sreg_save r2
# define LedTne r4
# define GenCnt r18
# define Cnt_Dl_low r16
# define Cnt_Dl_hi r17
#else /* !ASSEMBLER */
register uint8_t sreg_save asm("r2");
register uint8_t LedTne asm("r4");
register uint8_t GenCnt asm("r18");
volatile register uint16_t Cnt_Dl asm("r16");
#endif /* ASSEMBLER */
Часть листинга с кодами включающий ассемблерную вставку:
Код
000000a2 <__vector_6>:
;_____________________________________________________
;_______ Прерывание по сопадению каждые 64 такта
.global TIM0_COMPA_vect
TIM0_COMPA_vect:
in sreg_save, _SFR_IO_ADDR(SREG)
a2: 2f b6 in r2, 0x3f; 63
tst LedTne
a4: 44 20 and r4, r4
brne tca1
a6: 11 f4 brne .+4 ; 0xac <tca1>
cbi _SFR_IO_ADDR(PORTB),Led
a8: c0 98 cbi 0x18, 0; 24
rjmp tca2
aa: 01 c0 rjmp .+2 ; 0xae <tca2>
000000ac <tca1>:
tca1:
dec LedTne
ac: 4a 94 dec r4
000000ae <tca2>:
tca2:
inc GenCnt; увеличение глав.счетчика
ae: 03 95 inc r16
cpi GenCnt,0xff
b0: 0f 3f cpi r16, 0xFF; 255
brne tca3; продолжение ...
b2: 41 f4 brne .+16 ; 0xc4 <tca3>
ldi GenCnt , 0;
b4: 00 e0 ldi r16, 0x00; 0
lds LedTne,BufLed;обновление буфера яркости св.ди.
b6: 40 90 60 00 lds r4, 0x0060
tst LedTne; проверка на 0 !
ba: 44 20 and r4, r4
breq tca4
bc: 09 f0 breq .+2 ; 0xc0 <tca4>
sbi _SFR_IO_ADDR(PORTB),Led
be: c0 9a sbi 0x18, 0; 24
000000c0 <tca4>:
;___ Фоновые счетчики:
tca4:
subi Cnt_Dl_low,1
c0: 01 50 subi r16, 0x01; 1
sbci Cnt_Dl_hi,0; уменьшение на 1.
c2: 10 40 sbci r17, 0x00; 0
000000c4 <tca3>:
tca3:
out _SFR_IO_ADDR(SREG), sreg_save
c4: 2f be out 0x3f, r2; 63
reti
c6: 18 95 reti
Если внимательно посмотреть на команды с регистром GenCnt , вместо обьявленного r18 везде стоит r16.
Рег. перем. sreg_save, LedTne, GenCnt в Си-программе никак не используются и регистры им соответствующие незадействованы.
Так понимаю подмена регистра может происходить из за какихто настроек Ассемблера, в чем может быть дело ?
Сообщение отредактировал MaxiMuz - Feb 22 2012, 07:57