Hi,
Ich finde den Fehler nicht:
Ich benutze einen WDT zum resetten des Mega328.
Das funktioniert soweit.
Allerdings funktioniert das zurücksetzen des WDT am Systemstart nicht.
(WinAVR 20090313)
1
/** deactivates the watch dog timer as soon as possible in Program flow */
wenn man ins Mapfile schaut, ist das init1-segment leer.
Auch ist der Code gleich groß, egal, ob das ding drin ist, oder nicht.
Hat jemand einen vorschlag?
Danke im Voraus
holger schrieb:> Setz deinen Kram an den Anfang von main() ?
naja, der Code soll ja vor den ganze inits der CRT ausgeführt werden.
EDIT:
ich hab das genau so auch schon in anderen Projekten benutzt.
>> Warum?>damits keine endlosresetschleife gibt, wenn der initcode länger dauert>als ein wdt-Zyklus
Hä?
Was hast du denn noch so alles in deinem initcode?
> __attribute__((section(".init1")));
^^^^^^
Wenn ich das richtig seh dann nutzt wdt_disable() das __zero_reg__,
selbiges wird aber erst in .init2 gesetzt. Verschieb den Köter doch mal
in .init3 zum testen.
HTH
ARGHHHH
Ich geh kaputt.
die whole-program-optimization optimiert das weg!!!
schalte ich die ab, liegts im spezifiziertem segment.
nur ist der Code jetzt auch ein ganzes Stück größer.
hat jemand eine Idee, wie man der Optimierung verbieten kann, die
Funktion zu entfernen?
>whole-program-optimization optimiert das weg!
Knabberst du schon an den letzen zwei Bytes Flash rum?
-O2 oder -Os tuts bei mir eigentlich immer ganz brav.
wieviel Flash spart dir denn die Optimierung?
Wenn ich das richtig verstehe, kann es doch nur darum gehen, nicht
verwendete Funktionen zu entfernen.
Das kann man ja immer auch per #ifdef erreichen.
Wenn das aber zu viel Arbeit sein sollte, könnte man auch den Optimizer
überlisten, indem man einen Aufruf der gewünschten Funktion in eine
if-Abfrage schreibt, die zur Laufzeit nie TRUE wird (aber so, dass der
Compiler das zur Compile-Zeit noch nicht wissen kann); kostet aber
natürlich auch ein paar Byte.
Josef D. schrieb:> Wenn ich das richtig verstehe, kann es doch nur darum gehen, nicht> verwendete Funktionen zu entfernen.> Das kann man ja immer auch per #ifdef erreichen.
naja, die whole-program-optimization macht noch mehr.
funktionen, die nur einmal genutzt werden oder sehr klein sind, werden
geinlined, obwohl sie nicht im selben c-File oder im header stehen.
bei stark modularisierten Projekten mit strikter
Deklaration/Code-Trennung, kann das schon ein paar kB ausmachen. und
geschwindigkeit bringts natürlich auch, wenn der Compiler kleine
funktionen inlined, anstatt erst zu callen und register zu retten
Momentan störts im aktuellen Projekt nicht. drauf gestoßen bin ich nur,
da ich ein Makefile wiederverwertet habe.
deswegen werde ich das jetzt erst mal nicht weiterverfolgen.
Hallo,
Josef D. schrieb:> ich glaube mal gelesen zu haben, dass es dafür eine Link-Option gibt.> Ich finde es aber momentan nicht.
ja gibt es, ich habe für eine ein Optimum der C- und Linkflags gefunden:
Vlad Tepesch schrieb:> damits keine endlosresetschleife gibt, wenn der initcode länger dauert> als ein wdt-Zyklus
Dazu muß man aber schon sehr großen SRAM initialisieren und ne kleine
F_CPU setzen.
Die 2kB des 328 sind schnell genug geladen, da kann man den Wachhund
ruhig erst im Main resetten.
Peter
Uwe S. schrieb:> a richtig,> da ich auch mit C Modulen programmiere
genau hier mach die whole-program-optimization ja Sinn.
> und nicht wie hier beschrieben>> http://www.tty1.net/blog/2008-04-29-avr-gcc-optimi...
wo soll das denn da stehen?
>> eine großen "C" Datei benutze in die alle Programmteile (c)#include(/c)> wird.
hier brauchst die wpo nicht, da es ja nur noch ein zu compilierendes
File gibt.