mikrocontroller.net

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


Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
$ cat foo.c
#include <avr/io.h>
#include <avr/wdt.h>

volatile int foo __attribute__((section(".noinit")));
int bar;

int
main(void)
{
        if (MCUCSR & _BV(PORF)) {
                foo = 42;
        }
        MCUCSR = 0;

        bar = foo;

        wdt_enable(WDTO_1S);

        for (;;) { foo++; }

        return 21;
}
$ avr-gcc -mmcu=atmega128 -Os -o foo.elf foo.c -Wl,--section-start=.noinit=0x801100
$ avr-objdump -h foo.elf                                             

foo.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000011a  00000000  00000000  00000094  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .noinit       00000002  00801100  0000111a  000001ae  2**0
                  ALLOC
  2 .bss          00000002  00800100  0000011a  000001ae  2**0
                  ALLOC
  3 .stab         00000750  00000000  00000000  000001b0  2**2
                  CONTENTS, READONLY, DEBUGGING
  4 .stabstr      00000059  00000000  00000000  00000900  2**0
                  CONTENTS, READONLY, DEBUGGING

Autor: Stefan Ernst (sternst)
Datum:

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

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

Autor: Stefan Tschiggerl (stefan90)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Tschiggerl (stefan90)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.