problem mit wdt zurücksetzen

#2054379
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)
1
/** deactivates the watch dog timer as soon as possible in Program flow */
2
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
3
void wdt_init(void)
4
{
5
    MCUSR = 0;
6
    wdt_disable();
7
    return;
8
}

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
#2054433
Lesenswert?

so habe ich's bei mir am laufen

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

14
// s. http://www.rn-wissen.de/index.php/Avr-gcc/Interna#Frühe_Codeausführung_vor_main.28.29
15
/* Kopie daraus:
16
.init2
17
    Initialisieren von R1 mit 0 und setzen des Stackpointers
18
.init4
19
    Kopieren der Daten vom Flash ins SRAM (.data) und löschen von .bss
20
.init6
21
    C++ Konstruktoren
22
.init9
23
    Sprung zu main
24
*/
25
void code_init3() __attribute__ ((naked, section (".init3")));
26
// !!! never call this function !!!
27
void code_init3 (void){
28
  WDT_off();
29
  // Code...
30
}
#2054435
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:
1
void wdt_init(void) __attribute__((naked)) __attribute__((section(".init1")));
2
void wdt_init(void) __attribute__((naked, section(".init1")));
3

4
void __attribute__((naked, section(".init1"))) wdt_init(void);
#2054538
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.
#2054655
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.
#2054668
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:
1
CFLAGS += -Os
2
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
3
CFLAGS += -Wall -Wstrict-prototypes
4
## Zusatz Flags
5
CFLAGS += -fno-split-wide-types 
6
CFLAGS += -fno-tree-scev-cprop
7
CFLAGS += -fno-move-loop-invariants
8
CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
9
CFLAGS += -Wl,--relax
10
## -- ende --
11
CFLAGS += -std=gnu99

Für C++ bedarf es nur einer kleinen Anpassung.
#2054939
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren