avr-libc-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-libc-dev] broken code generation


From: avr-libc-devel
Subject: [avr-libc-dev] broken code generation
Date: Tue, 29 Jan 2019 13:30:05 +0500
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0

Hello friends.
A long time ago, more than 10 years ago, I used avr-gcc + avr-binutils + avr-libc on Linux. Today I had to compile a test project with a modern installation of avr-gcc, avr-binutils, avr-libc. And I noticed a strange assembler code in the listing: there is no initialization of the stack, interrupt handlers are in an abnormal place, the transition to the main function is missing ..
Can anyone comment on what is going on?

Command line to compile the project:
$ avr-gcc -iquote . -Os -pipe -mmcu=attiny2313 -mint8 -g -c -o blink.o blink.c
$ avr-gcc blink.o -o blink.elf

Listing avr-objdump -h -S blink.elf:

---skip---
Disassembly of section .text:

00000000 <__do_clear_bss>:
   0:   20 e0           ldi     r18, 0x00       ; 0
   2:   a0 e6           ldi     r26, 0x60       ; 96
   4:   b0 e0           ldi     r27, 0x00       ; 0
   6:   01 c0           rjmp    .+2             ; 0xa <.do_clear_bss_start>

00000008 <.do_clear_bss_loop>:
   8:   1d 92           st      X+, r1

0000000a <.do_clear_bss_start>:
   a:   a1 36           cpi     r26, 0x61       ; 97
   c:   b2 07           cpc     r27, r18
   e:   e1 f7           brne    .-8             ; 0x8 <.do_clear_bss_loop>

00000010 <__vector_2>:
}

#endif


ISR(INT1_vect, ISR_BLOCK){
  10:   1f 92           push    r1
  12:   0f 92           push    r0
  14:   0f b6           in      r0, 0x3f        ; 63
  16:   0f 92           push    r0
  18:   11 24           eor     r1, r1
  1a:   8f 93           push    r24
  1c:   9f 93           push    r25
        PORTD ^= _BV(PORT5);
  1e:   92 b3           in      r25, 0x12       ; 18
  20:   80 e2           ldi     r24, 0x20       ; 32
  22:   89 27           eor     r24, r25
  24:   82 bb           out     0x12, r24       ; 18
}
  26:   9f 91           pop     r25
  28:   8f 91           pop     r24
  2a:   0f 90           pop     r0
  2c:   0f be           out     0x3f, r0        ; 63
  2e:   0f 90           pop     r0
  30:   1f 90           pop     r1
  32:   18 95           reti

00000034 <main>:
//        TIMSK = OCIE0A; //enable interrupt on compare match

        /*enable and tune INT1 */
--- skip ---

At the same time, I still have a listing from the project compilation more than 10 years ago (the processor is not attiny2313):

---- skip ----
00000000 <__vectors>:
   0:   0c 94 2a 00     jmp     0x54
   4:   0c 94 45 00     jmp     0x8a
   8:   0c 94 45 00     jmp     0x8a
   c:   0c 94 45 00     jmp     0x8a
  10:   0c 94 45 00     jmp     0x8a
  14:   0c 94 45 00     jmp     0x8a
  18:   0c 94 45 00     jmp     0x8a
  1c:   0c 94 45 00     jmp     0x8a
  20:   0c 94 45 00     jmp     0x8a
  24:   0c 94 45 00     jmp     0x8a
  28:   0c 94 45 00     jmp     0x8a
  2c:   0c 94 45 00     jmp     0x8a
  30:   0c 94 45 00     jmp     0x8a
  34:   0c 94 45 00     jmp     0x8a
  38:   0c 94 45 00     jmp     0x8a
  3c:   0c 94 45 00     jmp     0x8a
  40:   0c 94 45 00     jmp     0x8a
  44:   0c 94 45 00     jmp     0x8a
  48:   0c 94 45 00     jmp     0x8a
  4c:   0c 94 45 00     jmp     0x8a
  50:   0c 94 45 00     jmp     0x8a

00000054 <__ctors_end>:
  54:   11 24           eor     r1, r1
  56:   1f be           out     0x3f, r1        ; 63
  58:   cf e5           ldi     r28, 0x5F       ; 95
  5a:   d8 e0           ldi     r29, 0x08       ; 8
  5c:   de bf           out     0x3e, r29       ; 62
  5e:   cd bf           out     0x3d, r28       ; 61

00000060 <__do_copy_data>:
  60:   10 e0           ldi     r17, 0x00       ; 0
  62:   a0 e6           ldi     r26, 0x60       ; 96
  64:   b0 e0           ldi     r27, 0x00       ; 0
  66:   e2 ea           ldi     r30, 0xA2       ; 162
  68:   f0 e0           ldi     r31, 0x00       ; 0
  6a:   02 c0           rjmp    .+4             ; 0x70

0000006c <.do_copy_data_loop>:
  6c:   05 90           lpm     r0, Z+
  6e:   0d 92           st      X+, r0

00000070 <.do_copy_data_start>:
  70:   a0 36           cpi     r26, 0x60       ; 96
  72:   b1 07           cpc     r27, r17
  74:   d9 f7           brne    .-10            ; 0x6c

00000076 <__do_clear_bss>:
  76:   10 e0           ldi     r17, 0x00       ; 0
  78:   a0 e6           ldi     r26, 0x60       ; 96
  7a:   b0 e0           ldi     r27, 0x00       ; 0
  7c:   01 c0           rjmp    .+2             ; 0x80

0000007e <.do_clear_bss_loop>:
  7e:   1d 92           st      X+, r1

00000080 <.do_clear_bss_start>:
  80:   a0 36           cpi     r26, 0x60       ; 96
  82:   b1 07           cpc     r27, r17
  84:   e1 f7           brne    .-8             ; 0x7e
  86:   0c 94 47 00     jmp     0x8e

0000008a <__bad_interrupt>:
  8a:   0c 94 00 00     jmp     0x0

0000008e <main>:
#include <avr/io.h>
int main (void){
  8e:   cf e5           ldi     r28, 0x5F       ; 95
---- skip ----

It looks right: interrupt vectors, stack initialization and everything else.

Friends, what am I doing wrong?

Thank you.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]