вторник, 30 мая 2017 г.

продолжение кулстори Arduino and Eclipse and so on

Покушав «прелестей» Опенсорса всласть я сжал сфинктер и скачал 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 г.в.

Комментариев нет: