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);
}