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
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 |
> NOINITOPTIONS = -Wl,--section-start,.noinit=0x801100
Könnte es vielleicht an dem ',' (statt '=') liegen?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.