Aktuelle Zeit: 07.09.2010, 03:54:54

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 17.02.2009, 18:51:20 
Offline

Registriert: 01.02.2006, 01:42:32
Beiträge: 37
Hallo liebe Bastelfreunde, lieber Ulrich( Klasse Projekte! Mach Weiter so )

ich hab mehrere Webserver im Einsatz.. Eigentlich nur die ISA Variante.
Jetzt hab ich einen an die Heizung gebastelt, um die Temperaturen im Griff zu haben auch um die Pumpen zu schalten.. geht soweit ganz gut.
Ich rufe alle 30sec. einmal die Temperatur vom Webserver ab. Und da kann es passieren, das ich keine Rückmeldung mehr bekomme.(Webserver hängt sich auf) Pingen geht noch.. Mehr aber nicht.
Da ich die Werte grafisch erfasse, kann ich ganz gut überblicken was passiert.(Wann Werte kommen und wann nicht.) Nach ungefähr einer Stunde.. kommen dann plötzlich die Werte wieder ohne ein eingreifen... wie von Geisterhand.
Wenn der Webserver mal hängt, Hilft auch ein Reset und die Werte kommen auch sofort wieder.

Ich möchte nicht ausschließen, das ein Fehler im Source-Code von mir Implatiniert wurde...blabla

Nun meine Frage, gibt es im AVR einen Watchdog. Kann ich den vielleicht auf 2Minuten oder so setzen?
Ist eventuell ein Watchdog schon aktiv.. weils ja nach 1STD Laufzeit von alleine wieder kommt?

Wie oft das vorkommt? Alle paar Tage einmal. (Webserver läuft tag und n8 durch.)


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 17.02.2009, 22:34:34 
Offline
Site Admin
Benutzeravatar

Registriert: 29.02.2004, 19:12:19
Beiträge: 1197
Wohnort: Siegen
Welche Version vom Stack wird benutzt und welcher Stack? Neu oder Alt?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 17.02.2009, 23:13:15 
Offline

Registriert: 01.02.2006, 01:42:32
Beiträge: 37
Hallo Ulrich,

Ich würde dir gerne deine Frage beantworten. Aber ich versteh nicht was du wissen möchtest.
Ist dein Sourcecode V1.39(hoffe ich irre mich nicht). Ich nehme an du vermutest das der Stack überläuft?
Wo kann ich da schauen welche Version das ist bzw. alt oder neu.

Sri..

Gruß


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 18.02.2009, 21:02:23 
Offline
Site Admin
Benutzeravatar

Registriert: 29.02.2004, 19:12:19
Beiträge: 1197
Wohnort: Siegen
Hallo,

das ist noch der alte Stack! Es gibt einen neuen Stack zu finden bei dem ETH_M32_EX Projekt. Dieser Stack ist wesentlich stabiler! Funktioniert aber nur mit RTL8019 Karten nicht mit 3Com Karten. Des weiteren ist auch keine MMC/SD Karten Unterstützung dabei. Dafür läuft dieser wesentlich Stabiler.

Gruß
Ulrich


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 19.02.2009, 01:24:06 
Offline

Registriert: 01.02.2006, 01:42:32
Beiträge: 37
Hallo Ulrich.

Ja leider hab ich eine 3Com am laufen.
Nochmal zum Thema Watchdog. Ich hätte keine Probleme wenn der Server bei absturzt Resetet. Könnte man da was einrichten? Das er nach 20Sekunden oder so Resetet.
Oder kann das der Atmega32 nicht?

Es ist auch die Frage warum er von alleine nach einer Stunde wieder weiterrennt.

Gruß


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 20.02.2009, 21:45:17 
Offline

Registriert: 01.02.2006, 01:42:32
Beiträge: 37
Hallo Ulrich .. nicht mehr da?


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 21.02.2009, 00:23:01 
Offline

Registriert: 17.02.2008, 13:18:39
Beiträge: 298
Hi,

schau mal im aktuellen Stack nach da ist eine Überwachung der Netzaktivität drinnen das sollte funktionieren auch mit einer 3com. Der AVR-Watchdog hilft eher nicht, wenn nur die Netzwerkkarte abstürzt.

mfg
Klaus




//Timer Interrupt
#if EXTCLOCK==1
#if defined (__AVR_ATmega644__)
ISR (TIMER2_COMPA_vect)
#else
ISR (TIMER2_COMP_vect)
#endif
#else
ISR (TIMER1_COMPA_vect)
#endif
{
//tick 1 second
time++;
**** hier der Systemreset *****
if((stack_watchdog++) > WTT) //emergency reset of the stack
{
RESET();
}
eth.timer = 1;
#if USE_NTP
ntp_timer--;
#endif //USE_NTP
#if USE_DHCP
if ( dhcp_lease > 0 ) dhcp_lease--;
if ( gp_timer > 0 ) gp_timer--;
#endif //USE_DHCP
}



und zurückgesetzt wird das ganze hier:
//----------------------------------------------------------------------------
//Interrupt von der Netzwerkkarte
ISR (ETH_INTERRUPT)
{
eth.data_present = 1;
stack_watchdog = 0;
ETH_INT_DISABLE;
}

//----------------------------------------------------------------------------


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 21.02.2009, 18:43:53 
Offline

Registriert: 01.02.2006, 01:42:32
Beiträge: 37
Hallo Klaus,

Danke für dein Schreiben. Jetzt versteh ich was er mit alter und neuer Stack meinte. Ich benützte ja noch dir UR-Software V1.39 da gibt noch nicht mal ein timer.c

In meinem nächsten Projekt werd ich den neuen Quellcode verwenden. Ulrich schreibt ja, dass er soweit auch wieder verwendbar sei.

Leider hab ich an dem "alten" Source nun schon soviel geschraubt daß ich nicht so ohne weiteres davon abkommen möchte.
Ich will hier keine 100% Lösung selbst wenn er alle 5minuten Resetet wäre es mir egal. Hauptsache er bleibt nicht einfach stehen.
Aber ich glaube nicht daß ich das so ohne weiteres Einbinden kann. :?:

Und wenn doch wo?

interrupt4.c sieht ja so aus.

Code:
#include "main.h"
#include "ethernet.h"
#include "socket.h"
#include "interrupt4.h"

SIGNAL (Network_Card_INT)
{
   //printf ("interrupt\n");
   //Globale Interrupts Ausschalten
   cli ();
   
   char ByteH = 0;
   char ByteL = 1;      

   //if the receive buffer has been overrun
   if ( (ReadRTL(ISR)&(1<<OVW)) != 0)
      {
      printf ("Overrun!\n");
      }
      
   //gehe zu Routine GET wenn ein Packet empfangen wurde
   if ( (ReadRTL(ISR) & (1<<PRX)) != 0)
      {
      //NIC FIFO noch nicht leer
      //gehe zu Routine GET und lese ein weiteres Packet
      while (ByteL != ByteH) //(!= bedeutet ungleich)
         {
         get ();
         
         //auslesen des Empfangsbuffer BNRY = CURR
         ByteL = ReadRTL(BNRY); //auslesen NIC Register bnry
         WriteRTL ( CR ,(1<<STA|1<<RD2|1<<PS0));

         ByteH = ReadRTL(CURR); //auslesen NIC Register curr
         WriteRTL ( CR ,(1<<STA|1<<RD2));
         }
      }
      
   //Zurücksetzen der Interrupt Bits des NIC
   WriteRTL (ISR, (1<<PRX|1<<PTX|1<<RXE|1<<TXE|1<<OVW|1<<CNT|1<<RDC|1<<RST));
   
   //startet die Network Card
   Networkcard_Start();
   
   //Globale wieder Interrupts Einschalten
   sei ();
}

//############################################################################
//Hier werden daten empfangen und geprüft was empfangen wurde
int get (void)
//############################################################################
{
   //länge des Ethernetpacketes
   unsigned int packetlen;

   //Array für zu empfangene Daten und zu sendene Daten
   unsigned char packet[MTU_SIZE];
   
   //Pointer auf Ethernet_Header
   struct Ethernet_Header *ethernet;
   ethernet = (struct Ethernet_Header *)&packet[ETHER_OFFSET];
   //Pointer auf IP_Header
   struct IP_Header *ip;
   ip = (struct IP_Header *)&packet[IP_OFFSET];
   //Pointer auf TCP_Header
   struct TCP_Header *tcp;
   tcp = (struct TCP_Header *)&packet[TCP_OFFSET];

   //Lese daten aus NIC FIFO ins Array packet() sowie packetheader()
   Read_Ethernet_Frame (packet,&packetlen);   
   
   //wurde ein ARP packet empfangen?
   //2 Byte für Nutzlastbereich (0806 für ARP)
   if(Ethernet_ARP_Datagramm)
      {
      //Erzeugt ein ARP Reply Packet
      ARP_Reply(packet,&packetlen);
      }
   
   //wurde ein ICMP, UDP oder TCP packet empfangen?
   //2 Byte für Nutzlastbereich (0800 für IP)
   //Ist das IP Packet für meine IP Addresse bestimmt
   else
   {   
      if(Ethernet_IP_Datagramm && MyIP){
      //Ist protokoll Byte = 1 dann ist es ein ICMP Packet
      if(IP_ICMP_Packet)
         {
         //Erzeugt ein ICMP Reply Packet (PING Echo)
         ICMP_Reply(packet,packetlen);
         }
      
      //Ist protokoll Byte = 17 dann ist es ein UDP Packet
      else if(IP_UDP_Packet)
         {
         printf("udp() \n");
         }
      //Ist protokoll Byte = 6 dann ist es ein TCP Packet
      else if(IP_TCP_Packet)
         {
         //printf("tcp() \n");
         if (tcp->TCP_DestPort == SOCKET_HTTP)
            {
            httpd (packet,&packetlen);
            }
            
         #if USE_FTPD
         if (tcp->TCP_DestPort == SOCKET_FTPD)
            {
            ftpd (packet,&packetlen);
            }
         #endif //USE_FTPD
         
         #if USE_TELNET
         if (tcp->TCP_DestPort == SOCKET_TELNET)
            {
            telnet (packet,&packetlen);
            }
         #endif //USE_TELNET
         }
      }
   }
return (0);
}


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Webserver schläft ein. Watchdog die Lösung?
BeitragVerfasst: 22.02.2009, 00:47:39 
Offline

Registriert: 17.02.2008, 13:18:39
Beiträge: 298
Hi,
schau mal hier:
SIGNAL (Network_Card_INT)
{
//printf ("interrupt\n"); <== aktivieren und schauen ob die noch ausgefüfrt werden wenn sich das ding aufhängt

wenn nein einen Zähler zB ResCnt hier zurücksetzen.


In der Hauptschleife einfach

ResCnt++;
if (ResCnt > [wie lang es ca dauern soll]) Reset;

einfügen. Und unsigned long ResCnt; zu definieren nicht vergessen.


mfg
Klaus


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de