Forum: Compiler & IDEs Warning beim Kompilieren mit .noinit Section


von Stefan T. (stefan90)


Lesenswert?

Hallo,
ich habe im Makefile für WinAVR eine .noinit Section definiert (diese 
ist im externen RAM)
NOINITOPTIONS = -Wl,--section-start,.noinit=0x801100

Bei der Version WinAVR-20080610 kommt eine Warnung, die ich nicht 
verstehe (bei der älteren Version WinAVR-20070525 kam diese nicht)
c:/programme/winavr-20080610/bin/../lib/gcc/avr/4.3.0/../../../../avr/bi 
n/ld.exe:  warning: dot moved backwards before `.noinit'

Wodurch kommt es zu dieser Warnung bzw. was bedeutet sie?

mfg Stefan

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nie gesehen.  Die Frage lässt sich wohl nur beantworten, wenn man mehr
als das Schnipsel hat, denn das allein ist nicht die Ursache:
1
$ cat foo.c
2
#include <avr/io.h>
3
#include <avr/wdt.h>
4
5
volatile int foo __attribute__((section(".noinit")));
6
int bar;
7
8
int
9
main(void)
10
{
11
        if (MCUCSR & _BV(PORF)) {
12
                foo = 42;
13
        }
14
        MCUCSR = 0;
15
16
        bar = foo;
17
18
        wdt_enable(WDTO_1S);
19
20
        for (;;) { foo++; }
21
22
        return 21;
23
}
24
$ avr-gcc -mmcu=atmega128 -Os -o foo.elf foo.c -Wl,--section-start=.noinit=0x801100
25
$ avr-objdump -h foo.elf                                             
26
27
foo.elf:     file format elf32-avr
28
29
Sections:
30
Idx Name          Size      VMA       LMA       File off  Algn
31
  0 .text         0000011a  00000000  00000000  00000094  2**1
32
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
33
  1 .noinit       00000002  00801100  0000111a  000001ae  2**0
34
                  ALLOC
35
  2 .bss          00000002  00800100  0000011a  000001ae  2**0
36
                  ALLOC
37
  3 .stab         00000750  00000000  00000000  000001b0  2**2
38
                  CONTENTS, READONLY, DEBUGGING
39
  4 .stabstr      00000059  00000000  00000000  00000900  2**0
40
                  CONTENTS, READONLY, DEBUGGING

von Stefan E. (sternst)


Lesenswert?

> NOINITOPTIONS = -Wl,--section-start,.noinit=0x801100

Könnte es vielleicht an dem ',' (statt '=') liegen?

von Stefan T. (stefan90)


Angehängte Dateien:

Lesenswert?

Hallo,
nein daran liegt es nicht.

Im Anhang ist ein AVR-Studio Projekt, wo dieselbe Warning auftritt.
Das Programm gehört zum Artikel Avr Webserver mit Wiznet WIZ810MJ, 
der teilweise auch von mir ist.

Was mir auch noch aufgefallen ist: der Code (ist für einen Bootloader) 
ist bei der neueren WinAvr-Version um 300 Bytes größer (2092 Byte) 
wodurch ich gerade nicht 1024 words für den Bootloader verwenden kann. 
Kannst du mir sagen warum das so ist?

mfg Stefan

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Tschiggerl wrote:

> nein daran liegt es nicht.

Komma und Gleichheitszeichen dürfen in diesem Kontext beide stehen.

> Im Anhang ist ein AVR-Studio Projekt, wo dieselbe Warning auftritt.

Ursache ist, dass der Linker entsprechend der Anweisungen im
Linkerscript alle anderen Teile, die in der Ausgabe zu .data führen,
vor denen für .noinit abarbeitet (welches auch zu .data im Endergebnis
beiträgt, da es sich ja trotzdem noch um SRAM handelt).

Damit wandert der interne Adress-Zuweisungszähler (``dot'') vor der
Verarbeitung von .noinit auf kleinere Werte, was normalerweise nicht
passieren würde.

Einzige praktische Relevanz, die ich mir vorstellen kann ist, dass auf
diese Weise ein section overlap nicht mehr feststellbar wäre: wenn
dein .noinit über die Adresse 0x801500 hinaus schießt, wirst du
möglicherweise keine zusätzliche Warnung erhalten.  Ansonsten ist die
Warnung unkritisch.

Du könntest nun also entweder .data und .noinit in der Adresse
tauschen, oder du musst dir den Linkerscript kopieren und mit
-Wl,-T,... lokal direkt angeben.  Im kopierten Script kannst du dann
die Verarbeitung von .noinit vor .data und .bss ziehen.

von Stefan T. (stefan90)


Lesenswert?

Ok vielen Dank. Normalerweise ist .noinit immer kleiner als die 
Startadresse von .data

Hast du noch eine Erklärung warum der Code beim neueren Compiler um 300 
Byte größer ist?

mfg Stefan

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Tschiggerl wrote:

> Hast du noch eine Erklärung warum der Code beim neueren Compiler um 300
> Byte größer ist?

Weil im Compiler viel umgebaut worden ist.  Da die GCC-Entwickler
nicht über einen Simulator verfügen, mit dem sie die negativen
Effekte ihrer Optimierungsänderungen für den AVR bemerken können,
bekommen sie die Informationen darüber erst durch die Nutzer selbst.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

hmmm wäre es hier nicht sinnvoller, ne andere Section als .noinit zu 
nehmen?

.noinit ist ein Teil von .data, was sich aber nicht so prickelnd anhört, 
wenn .noinit extern und .data intern zu liegen kommen soll.

D.h. eigene (Input- und Output-)Sections für das externe NOINIT-Zeug 
definieren und separat lokatieren lassen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. wrote:

> .noinit ist ein Teil von .data, was sich aber nicht so prickelnd anhört,
> wenn .noinit extern und .data intern zu liegen kommen soll.

.data ist auch extern, daher ja der Kuddelmuddel.  Offenbar soll die
.noinit-Variable am Anfang des externen Speichers als Kommunikation
zwischen dem Bootloader und der Applikation dienen, während der
Speicher auf höheren Adressen einfach "scratch memory" für den
Bootloader darstellt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.