Homepage

  • Projekte
  • Shop
  • Forum
Erweiterte Suche
  • Schnellzugriff
    • Unbeantwortete Themen
    • Aktive Themen
    • Suche
  • FAQ
  • Anmelden
  • Registrieren
  • Foren-Übersicht
  • Suche

Webserver schläft ein. Watchdog die Lösung?

Projekt aus Elektor 2007
Antworten
  • Druckansicht
Erweiterte Suche
9 Beiträge • Seite 1 von 1
dreamon
Beiträge: 47
Registriert: 01.02.2006, 00:42:32

Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von dreamon » 17.02.2009, 17:51:20

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

Benutzeravatar
Ulrich
Site Admin
Beiträge: 3036
Registriert: 29.02.2004, 18:12:19
Wohnort: Siegen
Kontaktdaten:
Kontaktdaten von Ulrich
Website

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von Ulrich » 17.02.2009, 21:34:34

Welche Version vom Stack wird benutzt und welcher Stack? Neu oder Alt?
Nach oben

dreamon
Beiträge: 47
Registriert: 01.02.2006, 00:42:32

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von dreamon » 17.02.2009, 22:13:15

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

Benutzeravatar
Ulrich
Site Admin
Beiträge: 3036
Registriert: 29.02.2004, 18:12:19
Wohnort: Siegen
Kontaktdaten:
Kontaktdaten von Ulrich
Website

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von Ulrich » 18.02.2009, 20:02:23

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

dreamon
Beiträge: 47
Registriert: 01.02.2006, 00:42:32

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von dreamon » 19.02.2009, 00:24:06

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

dreamon
Beiträge: 47
Registriert: 01.02.2006, 00:42:32

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von dreamon » 20.02.2009, 20:45:17

Hallo Ulrich .. nicht mehr da?
Nach oben

Klaus
Beiträge: 406
Registriert: 17.02.2008, 12:18:39

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von Klaus » 20.02.2009, 23:23:01

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

dreamon
Beiträge: 47
Registriert: 01.02.2006, 00:42:32

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von dreamon » 21.02.2009, 17:43:53

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: Alles auswählen

#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

Klaus
Beiträge: 406
Registriert: 17.02.2008, 12:18:39

Re: Webserver schläft ein. Watchdog die Lösung?

  • Zitieren

Beitrag von Klaus » 21.02.2009, 23:47:39

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

Antworten
  • Druckansicht

9 Beiträge • Seite 1 von 1

Zurück zu „AVR WebServer (alte Version)“



  • Foren-Übersicht
  • Alle Zeiten sind UTC+02:00
  • Alle Cookies löschen

Powered by phpBB® Forum Software © phpBB Limited

Deutsche Übersetzung durch phpBB.de

Datenschutz | Nutzungsbedingungen

 

 

sitemap  |    |  datenschutz   |  impressum