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
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
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.
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
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.
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.
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.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.