avr-gcc-list
[Top][All Lists]
Advanced

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

Re: [avr-gcc-list] Add 'OS_main' and 'OS_task' attributes in avr-gcc 4.2


From: Ruud Vlaming
Subject: Re: [avr-gcc-list] Add 'OS_main' and 'OS_task' attributes in avr-gcc 4.2.1
Date: Tue, 9 Dec 2008 15:43:54 +0100
User-agent: KMail/1.9.1

On Tuesday 09 December 2008 14:39, Bob Paddock wrote:

> I had hoped that using OS_main would get rid of the call to main,
> wastes stack space, and all of the dead _exit code, which is not allowed
> under some design guidelines (as well as taking space), that will
> never be executed, but it doesn't.
> Is there an attribute that would?

I am aware of two "solutions". 

First, and most rigorous, is writing your own startup code and link with option 
-nostartfiles. Please note this requires that you generate a vector table 
yourself, 
and has other drawbacks. (for example no .data section possible)

Second, and this trick works in some situations:
  http://www.mail-archive.com/address@hidden/msg02390.html

For me the latter was not reliable enough, so i use the first option most of the
time.  If you exactly know which interrupts to expect, you may even utilize 
part of
the vector table for code.

But the most beautiful would be to have a compiler option like -embedded
or so, which gets rid of all junk. 

I would be more that happy to hear how others solved this.

Below three examples (gcc 4.3.2 with patches):
1) Standard compile
2) Overwriting __methodes (Bjoern's trick)
3) with -nostartfiles + custom startup code
Note that, since the data section was empty in this example the
whole data copy loop is wasted space two.

Btw, if you compile with -Wno-main then you can use:
void main(void) __attribute__ (( OS_main ))
which reduces code somewhat more


1) Standard compile ======================================= 

00000000 <__vectors>:
   0:   12 c0           rjmp    .+36            ; 0x26 <__ctors_end>
   2:   2c c0           rjmp    .+88            ; 0x5c <__bad_interrupt>
   4:   2b c0           rjmp    .+86            ; 0x5c <__bad_interrupt>
   6:   2a c0           rjmp    .+84            ; 0x5c <__bad_interrupt>
   8:   29 c0           rjmp    .+82            ; 0x5c <__bad_interrupt>
   a:   28 c0           rjmp    .+80            ; 0x5c <__bad_interrupt>
   c:   27 c0           rjmp    .+78            ; 0x5c <__bad_interrupt>
   e:   26 c0           rjmp    .+76            ; 0x5c <__bad_interrupt>
  10:   25 c0           rjmp    .+74            ; 0x5c <__bad_interrupt>
  12:   24 c0           rjmp    .+72            ; 0x5c <__bad_interrupt>
  14:   23 c0           rjmp    .+70            ; 0x5c <__bad_interrupt>
  16:   22 c0           rjmp    .+68            ; 0x5c <__bad_interrupt>
  18:   21 c0           rjmp    .+66            ; 0x5c <__bad_interrupt>
  1a:   20 c0           rjmp    .+64            ; 0x5c <__bad_interrupt>
  1c:   df c0           rjmp    .+446           ; 0x1dc <__vector_14>
  1e:   1e c0           rjmp    .+60            ; 0x5c <__bad_interrupt>
  20:   1d c0           rjmp    .+58            ; 0x5c <__bad_interrupt>
  22:   1c c0           rjmp    .+56            ; 0x5c <__bad_interrupt>
  24:   1b c0           rjmp    .+54            ; 0x5c <__bad_interrupt>

00000026 <__ctors_end>:
  26:   11 24           eor     r1, r1
  28:   1f be           out     0x3f, r1        ; 63
  2a:   cf e6           ldi     r28, 0x6F       ; 111
  2c:   d0 e0           ldi     r29, 0x00       ; 0
  2e:   de bf           out     0x3e, r29       ; 62
  30:   cd bf           out     0x3d, r28       ; 61

00000032 <__do_copy_data>:
  32:   10 e0           ldi     r17, 0x00       ; 0
  34:   a0 e6           ldi     r26, 0x60       ; 96
  36:   b0 e0           ldi     r27, 0x00       ; 0
  38:   e8 e3           ldi     r30, 0x38       ; 56
  3a:   f2 e0           ldi     r31, 0x02       ; 2
  3c:   02 c0           rjmp    .+4             ; 0x42 <.do_copy_data_start>

0000003e <.do_copy_data_loop>:
  3e:   05 90           lpm     r0, Z+
  40:   0d 92           st      X+, r0

00000042 <.do_copy_data_start>:
  42:   a0 36           cpi     r26, 0x60       ; 96
  44:   b1 07           cpc     r27, r17
  46:   d9 f7           brne    .-10            ; 0x3e <__SP_H__>

00000048 <__do_clear_bss>:
  48:   10 e0           ldi     r17, 0x00       ; 0
  4a:   a0 e6           ldi     r26, 0x60       ; 96
  4c:   b0 e0           ldi     r27, 0x00       ; 0
  4e:   01 c0           rjmp    .+2             ; 0x52 <.do_clear_bss_start>

00000050 <.do_clear_bss_loop>:
  50:   1d 92           st      X+, r1

00000052 <.do_clear_bss_start>:
  52:   a3 37           cpi     r26, 0x73       ; 115
  54:   b1 07           cpc     r27, r17
  56:   e1 f7           brne    .-8             ; 0x50 <.do_clear_bss_loop>
  58:   5c d0           rcall   .+184           ; 0x112 <main>
  5a:   ec c0           rjmp    .+472           ; 0x234 <_exit>

00000112 <main>:
 112:   0a d0           rcall   .+20            ; 0x128 <portInit>
 ....

00000234 <_exit>:
 234:   f8 94           cli

00000236 <__stop_program>:
 236:   ff cf           rjmp    .-2             ; 0x236 <__stop_program>

 
2) Overwriting __methodes (Bjoern's trick) ================

00000000 <__vectors>:
   0:   12 c0           rjmp    .+36            ; 0x26 <__ctors_end>
   2:   26 c0           rjmp    .+76            ; 0x50 <__bad_interrupt>
   4:   25 c0           rjmp    .+74            ; 0x50 <__bad_interrupt>
   6:   24 c0           rjmp    .+72            ; 0x50 <__bad_interrupt>
   8:   23 c0           rjmp    .+70            ; 0x50 <__bad_interrupt>
   a:   22 c0           rjmp    .+68            ; 0x50 <__bad_interrupt>
   c:   21 c0           rjmp    .+66            ; 0x50 <__bad_interrupt>
   e:   20 c0           rjmp    .+64            ; 0x50 <__bad_interrupt>
  10:   1f c0           rjmp    .+62            ; 0x50 <__bad_interrupt>
  12:   1e c0           rjmp    .+60            ; 0x50 <__bad_interrupt>
  14:   1d c0           rjmp    .+58            ; 0x50 <__bad_interrupt>
  16:   1c c0           rjmp    .+56            ; 0x50 <__bad_interrupt>
  18:   1b c0           rjmp    .+54            ; 0x50 <__bad_interrupt>
  1a:   1a c0           rjmp    .+52            ; 0x50 <__bad_interrupt>
  1c:   d9 c0           rjmp    .+434           ; 0x1d0 <__vector_14>
  1e:   18 c0           rjmp    .+48            ; 0x50 <__bad_interrupt>
  20:   17 c0           rjmp    .+46            ; 0x50 <__bad_interrupt>
  22:   16 c0           rjmp    .+44            ; 0x50 <__bad_interrupt>
  24:   15 c0           rjmp    .+42            ; 0x50 <__bad_interrupt>

00000026 <__ctors_end>:
  26:   11 24           eor     r1, r1

00000028 <__do_clear_bss>:
  28:   a0 e6           ldi     r26, 0x60       ; 96
  2a:   b2 e0           ldi     r27, 0x02       ; 2
  2c:   80 e0           ldi     r24, 0x00       ; 0

0000002e <__do_clear_bss_loop>:
  2e:   1e 92           st      -X, r1
  30:   a0 36           cpi     r26, 0x60       ; 96
  32:   b8 07           cpc     r27, r24
  34:   e1 f7           brne    .-8             ; 0x2e <__do_clear_bss_loop>

00000036 <__do_stack_def>:
  36:   af e6           ldi     r26, 0x6F       ; 111
  38:   b0 e0           ldi     r27, 0x00       ; 0
  3a:   ad bf           out     0x3d, r26       ; 61
  3c:   be bf           out     0x3e, r27       ; 62

0000003e <__do_copy_data>:
  3e:   63 c0           rjmp    .+198           ; 0x106 <main>
{ Below the junk which can never be reached starts ... }
  40:   11 24           eor     r1, r1
  42:   1f be           out     0x3f, r1        ; 63
  44:   cf e6           ldi     r28, 0x6F       ; 111
  46:   d0 e0           ldi     r29, 0x00       ; 0
  48:   de bf           out     0x3e, r29       ; 62
  4a:   cd bf           out     0x3d, r28       ; 61
  4c:   5c d0           rcall   .+184           ; 0x106 <main>
  4e:   ec c0           rjmp    .+472           ; 0x228 <_exit>

{ but at least the non modified methodes are gone ...}

00000106 <main>:
 106:   0a d0           rcall   .+20            ; 0x11c <portInit>
 ...

{ More junk which can never be reached ... }
00000228 <_exit>:
 228:   f8 94           cli

0000022a <__stop_program>:
 22a:   ff cf           rjmp    .-2             ; 0x22a <__stop_program>


3) with -nostartfiles + custom startup code ===============

{ squeeze your code in the vector table ... }

00000000 <__init>:
   0:   11 24           eor     r1, r1

00000002 <__do_watchdog_reset>:
   2:   14 be           out     0x34, r1        ; 52
   4:   88 e1           ldi     r24, 0x18       ; 24
   6:   81 bd           out     0x21, r24       ; 33
   8:   11 bc           out     0x21, r1        ; 33

0000000a <__do_clear_bss>:
   a:   a0 e6           ldi     r26, 0x60       ; 96
   c:   b2 e0           ldi     r27, 0x02       ; 2

0000000e <__do_clear_bss_loop>:
   e:   1e 92           st      -X, r1
  10:   a0 36           cpi     r26, 0x60       ; 96
  12:   b1 05           cpc     r27, r1
  14:   e1 f7           brne    .-8             ; 0xe <__do_clear_bss_loop>
  16:   03 c0           rjmp    .+6             ; 0x1e <__do_device_init>

00000018 <__interrupt_vector_definitions>:
  18:   68 94           set
  1a:   18 95           reti
  1c:   45 c0           rjmp    .+138           ; 0xa8 <privTickYield>

0000001e <__do_device_init>:
  1e:   80 e8           ldi     r24, 0x80       ; 128
  20:   88 bd           out     0x28, r24       ; 40
  22:   18 bc           out     0x28, r1        ; 40

00000024 <__do_stack_def>:
  24:   e8 e6           ldi     r30, 0x68       ; 104
  26:   f0 e0           ldi     r31, 0x00       ; 0
  28:   ed bf           out     0x3d, r30       ; 61
  2a:   fe bf           out     0x3e, r31       ; 62

0000002c <__do_copy_data>:
  2c:   39 c0           rjmp    .+114           ; 0xa0 <main>

000000a0 <main>:
{ portInit not needed anymore ... }
  a0:   47 d0           rcall   .+142           ; 0x130 <appBoot>

{ no junk ...}


Ruud.




reply via email to

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