www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik problem mit wdt zurücksetzen


Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)
/** deactivates the watch dog timer as soon as possible in Program flow */
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
void wdt_init(void)
{
    MCUSR = 0;
    wdt_disable();
    return;
}


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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hat jemand einen vorschlag?

Setz deinen Kram an den Anfang von main() ?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>naja, der Code soll ja vor den ganze inits der CRT ausgeführt werden.

Warum?

Autor: Josef D. (jogedua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Warum?

damits keine endlosresetschleife gibt, wenn der initcode länger dauert 
als ein wdt-Zyklus

Autor: Josef D. (jogedua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so habe ich's bei mir am laufen

static void WDT_off(void){
  cli();               // __disable_interrupt();
  wdt_reset();          //__watchdog_reset();
  /* Clear WDRF in MCUSR */
  MCUSR &= ~(1<<WDRF);
  /* Write logical one to WDCE and WDE */
  /* Keep old prescaler setting to prevent unintentional time-out */
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  /* Turn off WDT */
  WDTCSR = 0x00;
  // sei();             //__enable_interrupt();
}

// s. http://www.rn-wissen.de/index.php/Avr-gcc/Interna#Frühe_Codeausführung_vor_main.28.29
/* Kopie daraus:
.init2
    Initialisieren von R1 mit 0 und setzen des Stackpointers
.init4
    Kopieren der Daten vom Flash ins SRAM (.data) und löschen von .bss
.init6
    C++ Konstruktoren
.init9
    Sprung zu main
*/
void code_init3() __attribute__ ((naked, section (".init3")));
// !!! never call this function !!!
void code_init3 (void){
  WDT_off();
  // Code...
}

Autor: holger (Gast)
Datum:

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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Josef D. schrieb:
> ist hier gut beschrieben:
>
> "http://www.rn-wissen.de/index.php/Avr-gcc/Interna#...

danke für den Link.

es funktioniert mit keiner der verschiedenen Varianten:
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
void wdt_init(void) __attribute__((naked, section(".init1")));

void __attribute__((naked, section(".init1"))) wdt_init(void);

Autor: Josef D. (jogedua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
init3 ?

Autor: g457 (Gast)
Datum:

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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Josef D. schrieb:
> init3 ?

an dem segment selbst kanns ja nicht liegen, dann würde es 
möglicherweise in init1 liegen, aber nicht funktioniernen.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: Josef D. (jogedua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube mal gelesen zu haben, dass es dafür eine Link-Option gibt.
Ich finde es aber momentan nicht.

Autor: holger (Gast)
Datum:

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

Autor: Josef D. (jogedua)
Datum:

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

Autor: Josef D. (jogedua)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit der gewünschten Funktion meine ich die wdt_init(), die nicht 
wegoptimiert werden soll.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vlad Tepesch schrieb:
> hat jemand eine Idee, wie man der Optimierung verbieten kann, die
> Funktion zu entfernen?

Attribut "used".

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

Autor: Uwe S. (de0508)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
CFLAGS += -Os
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS += -Wall -Wstrict-prototypes
## Zusatz Flags
CFLAGS += -fno-split-wide-types 
CFLAGS += -fno-tree-scev-cprop
CFLAGS += -fno-move-loop-invariants
CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
CFLAGS += -Wl,--relax
## -- ende --
CFLAGS += -std=gnu99

Für C++ bedarf es nur einer kleinen Anpassung.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da is doch die wpo auch nicht dabei

--combine -fwhole-program

Autor: Uwe S. (de0508)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Vlad!

ja richtig,
da ich auch mit C Modulen programmiere und nicht wie hier beschrieben

http://www.tty1.net/blog/2008-04-29-avr-gcc-optimi...

eine großen "C" Datei benutze in die alle Programmteile (c)#include(/c) 
wird.

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

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

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.