AVR-GCC.
Код не покажу - я стёр нахер это УГ, перекопировав предварительно каменты, шоб 2 раза не набирать, и переписал на ассемблере.
Вот сделал мелкую прогу и скомпилил в ГЦЦ. Что здесь не так?
Исходник:
#include<avr/io.h>
#include<avr/interrupt.h>
char a;
ISR(INT2_vect , ISR_NAKED)
{
a++;
reti();
}
int main()
{
a= 0;
while(1)
{
PORTB = a;
//do something
}
return 0;
}
Результат:
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 ; 0x54 <__ctors_end>
4: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
8: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
c: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
10: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
14: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
18: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
1c: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
20: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
24: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
28: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
2c: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
30: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
34: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
38: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
3c: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
40: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
44: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
48: 0c 94 3e 00 jmp 0x7c ; 0x7c <__vector_18>
4c: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
50: 0c 94 3c 00 jmp 0x78 ; 0x78 <__bad_interrupt>
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d4 e0 ldi r29, 0x04 ; 4
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_clear_bss>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: 01 c0 rjmp .+2 ; 0x6a <.do_clear_bss_start>
00000068 <.do_clear_bss_loop>:
68: 1d 92 st X+, r1
0000006a <.do_clear_bss_start>:
6a: a1 36 cpi r26, 0x61 ; 97
6c: b1 07 cpc r27, r17
6e: e1 f7 brne .-8 ; 0x68 <.do_clear_bss_loop>
70: 0e 94 44 00 call 0x88 ; 0x88 <main>
74: 0c 94 48 00 jmp 0x90 ; 0x90 <_exit>
00000078 <__bad_interrupt>:
78: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
0000007c <__vector_18>:
7c: 80 91 60 00 lds r24, 0x0060
80: 8f 5f subi r24, 0xFF ; 255
82: 80 93 60 00 sts 0x0060, r24
86: 18 95 reti
00000088 <main>:
88: 10 92 60 00 sts 0x0060, r1
8c: 18 ba out 0x18, r1 ; 24
8e: fe cf rjmp .-4 ; 0x8c <main+0x4>
00000090 <_exit>:
90: f8 94 cli
00000092 <__stop_program>:
92: ff cf rjmp .-2 ; 0x92 <__stop_program>
......... ерунда ...... ерунда..... ерунда....
...для таких дел в асме обычно оставляют нетронутый регистр, спецом для того, чтобы не думать что прятать, а что нет. А лучше - 2-3 регистра, что почти всегда возможно.
Да уж. В ГЦЦ для этого потребуется неимоверно сложная конструкция:
register unsigned char counter asm("r3");
И после этого (о боже!) компилятор гарантированно нигде не тронет этот регистр. То ли дело асм - как же забавно в середине проекта лопатить всю прогу и искать незадействованные регистры.
(Говномётыыыыы... ПЛИ!!!)
Ну где же вы, сеятели разумного доброго вечного?
