Покушав «прелестей» Опенсорса всласть я сжал сфинктер и скачал AVR Studio 4.18 SP3, затем побугуртил ещё недельку с вылетами Eclips’овского AVR плагина и установил её
1. Мощнейший отладчик
2. Прозрачная работа и нацеленность на результат
3. Поддержка JTAG итд
Это тот минимум, который сразу включил мощнейший вовлекатор и позволил скоренько позабыть Эклипс и прочие недоразумения.
НО
AVR Studio хочет установленный WINAVR. a) Можно указать тот, что стоит в дебрях Arduino 1.0.6:
\hardware\tools\avr
b) Можно скачать последний с сайта Microchip (новый владелец Atmel)
http://www.microchip.com/development-tools/atmel-studio-7/avr-and-arm-toolchains-(c-compilers)
или с сайта Atmel
http://www.atmel.com/tools/atmelavrtoolchainforwindows.aspx
И здесь надо отметить 2 момента:
1. Код который генерируют тулчейны а) и b) с одним и тем же набором ключей разный:
Пример:
avr-gcc -mmcu=attiny13 -Wall -Os -o blink13.elf blink13.c
avr-objcopy -O ihex blink13.elf blink13.hex
Это Led Blink для ATTiny13:
Собираем с помощью WINAVR из Arduino 1.0.6
blink13.elf: file format elf32-avr
Disassembly of section .text:
00000000 <__vectors>:
0: 09 c0 rjmp .+18 ; 0x14 <__ctors_end>
2: 21 c0 rjmp .+66 ; 0x46 <__bad_interrupt>
4: 20 c0 rjmp .+64 ; 0x46 <__bad_interrupt>
6: 1f c0 rjmp .+62 ; 0x46 <__bad_interrupt>
8: 1e c0 rjmp .+60 ; 0x46 <__bad_interrupt>
a: 1d c0 rjmp .+58 ; 0x46 <__bad_interrupt>
c: 1c c0 rjmp .+56 ; 0x46 <__bad_interrupt>
e: 1b c0 rjmp .+54 ; 0x46 <__bad_interrupt>
10: 1a c0 rjmp .+52 ; 0x46 <__bad_interrupt>
12: 19 c0 rjmp .+50 ; 0x46 <__bad_interrupt>
00000014 <__ctors_end>:
14: 11 24 eor r1, r1
16: 1f be out 0x3f, r1 ; 63
18: cf e9 ldi r28, 0x9F ; 159
1a: cd bf out 0x3d, r28 ; 61
0000001c <__do_copy_data>:
1c: 10 e0 ldi r17, 0x00 ; 0
1e: a0 e6 ldi r26, 0x60 ; 96
20: b0 e0 ldi r27, 0x00 ; 0
22: ea e6 ldi r30, 0x6A ; 106
24: f0 e0 ldi r31, 0x00 ; 0
26: 02 c0 rjmp .+4 ; 0x2c <.do_copy_data_start>
00000028 <.do_copy_data_loop>:
28: 05 90 lpm r0, Z+
2a: 0d 92 st X+, r0
0000002c <.do_copy_data_start>:
2c: a0 36 cpi r26, 0x60 ; 96
2e: b1 07 cpc r27, r17
30: d9 f7 brne .-10 ; 0x28 <.do_copy_data_loop>
00000032 <__do_clear_bss>:
32: 10 e0 ldi r17, 0x00 ; 0
34: a0 e6 ldi r26, 0x60 ; 96
36: b0 e0 ldi r27, 0x00 ; 0
38: 01 c0 rjmp .+2 ; 0x3c <.do_clear_bss_start>
0000003a <.do_clear_bss_loop>:
3a: 1d 92 st X+, r1
0000003c <.do_clear_bss_start>:
3c: a0 36 cpi r26, 0x60 ; 96
3e: b1 07 cpc r27, r17
40: e1 f7 brne .-8 ; 0x3a <.do_clear_bss_loop>
42: 02 d0 rcall .+4 ; 0x48 <main>
44: 10 c0 rjmp .+32 ; 0x66 <_exit>
00000046 <__bad_interrupt>:
46: dc cf rjmp .-72 ; 0x0 <__vectors>
00000048 <main>:
48: b8 9a sbi 0x17, 0 ; 23
4a: 41 e0 ldi r20, 0x01 ; 1
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
4c: 29 e1 ldi r18, 0x19 ; 25
4e: 30 e0 ldi r19, 0x00 ; 0
50: 88 b3 in r24, 0x18 ; 24
52: 84 27 eor r24, r20
54: 88 bb out 0x18, r24 ; 24
56: 80 e1 ldi r24, 0x10 ; 16
58: 97 e2 ldi r25, 0x27 ; 39
5a: f9 01 movw r30, r18
5c: 31 97 sbiw r30, 0x01 ; 1
5e: f1 f7 brne .-4 ; 0x5c <main+0x14>
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
60: 01 97 sbiw r24, 0x01 ; 1
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
62: d9 f7 brne .-10 ; 0x5a <main+0x12>
64: f5 cf rjmp .-22 ; 0x50 <main+0x8>
00000066 <_exit>:
66: f8 94 cli
00000068 <__stop_program>:
68: ff cf rjmp .-2 ; 0x68 <__stop_program>
толстоватенько для простого "блинка" , нес па?
А вот что выдаёт свежий WINAVR:
blink13.elf: file format elf32-avr
Disassembly of section .text:
00000000 <__vectors>:
0: 09 c0 rjmp .+18 ; 0x14 <__ctors_end>
2: 0e c0 rjmp .+28 ; 0x20 <__bad_interrupt>
4: 0d c0 rjmp .+26 ; 0x20 <__bad_interrupt>
6: 0c c0 rjmp .+24 ; 0x20 <__bad_interrupt>
8: 0b c0 rjmp .+22 ; 0x20 <__bad_interrupt>
a: 0a c0 rjmp .+20 ; 0x20 <__bad_interrupt>
c: 09 c0 rjmp .+18 ; 0x20 <__bad_interrupt>
e: 08 c0 rjmp .+16 ; 0x20 <__bad_interrupt>
10: 07 c0 rjmp .+14 ; 0x20 <__bad_interrupt>
12: 06 c0 rjmp .+12 ; 0x20 <__bad_interrupt>
00000014 <__ctors_end>:
14: 11 24 eor r1, r1
16: 1f be out 0x3f, r1 ; 63
18: cf e9 ldi r28, 0x9F ; 159
1a: cd bf out 0x3d, r28 ; 61
1c: 02 d0 rcall .+4 ; 0x22 <main>
1e: 10 c0 rjmp .+32 ; 0x40 <_exit>
00000020 <__bad_interrupt>:
20: ef cf rjmp .-34 ; 0x0 <__vectors>
00000022 <main>:
#include <avr/io.h>
#define F_CPU 1000000UL // ??????? ?????????? 1???
#include <util/delay.h>
int main(void) {
// ?????? _BV(?????) ???????? ??????????? (1 << ?????)
DDRB |= _BV(PB0); // ?????? pinMode(PB0,OUTPUT); ? Wiring
22: b8 9a sbi 0x17, 0 ; 23
for (;;) {
PORTB ^= _BV(PB0); // ??????????? ????????? ????? PB0
24: 91 e0 ldi r25, 0x01 ; 1
26: 88 b3 in r24, 0x18 ; 24
28: 89 27 eor r24, r25
2a: 88 bb out 0x18, r24 ; 24
#else
//round up by default
__ticks_dc = (uint32_t)(ceil(fabs(__tmp)));
#endif
__builtin_avr_delay_cycles(__ticks_dc);
2c: 2f e3 ldi r18, 0x3F ; 63
2e: 3d e0 ldi r19, 0x0D ; 13
30: 83 e0 ldi r24, 0x03 ; 3
32: 21 50 subi r18, 0x01 ; 1
34: 30 40 sbci r19, 0x00 ; 0
36: 80 40 sbci r24, 0x00 ; 0
38: e1 f7 brne .-8 ; 0x32 <main+0x10>
3a: 00 c0 rjmp .+0 ; 0x3c <main+0x1a>
3c: 00 00 nop
3e: f3 cf rjmp .-26 ; 0x26 <main+0x4>
00000040 <_exit>:
40: f8 94 cli
00000042 <__stop_program>:
42: ff cf rjmp .-2 ; 0x42 <__stop_program>
казалось бы Маємо те що маємо, но когда пишешь для контроллера у
которого 1к памяти всё это играет очень ярко. И здесь мы переходим к пункту 2
2. Пошаговая отладка в AVR Studio 4 работает только с проектами собранными WINAVR из Arduino 1.0.6.
Скорей всего это из-за того что Studio слегка несовместима с кодом который генерирует тулчейн 2016 г.в.