logo
Welcome, Guest. Please Login or Register.
27. April 2024, 20:28:30


Home Help Search Login RegisterWIKIUHSDR Download

Amateurfunk Sulingen
Diskussions- und Newsboard des DARC-Ortsverbandes I40  |  allgemeine Kategorie  |  mcHF Projekt Deutsch / English (here you can discuss everything related to mcHF) (Moderators: DF8OE, DL1PQ)  |  Topic: STM32F4 debugging mit ST-Link-V2? <- zurück vorwärts ->
Pages: [1] Go Down Print
   Author  Topic: STM32F4 debugging mit ST-Link-V2?  (Read 2318 times)
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
STM32F4 debugging mit ST-Link-V2?
« on: 25. November 2015, 09:47:36 »

Jetzt ist es soweit: ich denke, ich brauche eine Debuggingmöglichkeit.

Der EEPROM-Code ist fertig, aber er funktioniert nicht vollständig. Ich habe auch schon ein paar Stellen in Verdacht - könnte das relativ leicht feststellen, wenn ich an den entsprechenden Stellen einen Breakpoint setzen könnte und dort mal den Inhalt einiger Variablen anschauen könnte.

Der Code ist *grausam". Aber es geht aus Kompatibilitätsgründen nicht anders...

Es funktioniert bereits alles (umkopieren des virtuellen EEPROMs in den seriellen,, Lesen aus dem seriellen). Nur beim Schreiben der Daten in den seriellen EEPROM hapert es noch.

Wer möchte, kann sich ja mal die Funktion UiDriverSaveEepromValuesPowerDown() anschauen. In dieser stattlichen Funktion lädt Clint jedes Word einzeln aus dem PROM und schreibt entweder einen Defaultwert oder den aktuellen Wert zurück. Das sind 383 Word-Schreibvorgänge!!! Wenn man die "einzeln" in den seriellen EEPROM machen würde, dauert as Ausschalten ca. 60 Sekunden  Also habe ich folgenden "Trick" benutzt:
Ich reserviere am Anfang genug RAM, um die gesamte Konfiguration aufzunehmen. Dann lade ich den kompletten Inhalt es seriellen EEPROMs in diesen RAM und lasse die schreib/lesewütigen Aufrufe von Clint in diesem RAM durchführen. Und wenn alle seine Änderungen durch sind, dann schreibe ich den nun modifizierten RAM in einem einzigen sequentiellen Write zurück in den seriellen EEPROM.

Die Schreib/Lesefunktionen aus dem EEPROM sind fertig und funktionieren. Sonst würde das Umkopieren ja nicht klappen.

Ich denke, dass das Problem in der Reservierung des RAMs liegen wird. Da RAM nicht gerade üppig vorhanden ist, lege ich den Bereich am Anfang der UiDriverSaveEepromValuesPowerDown() mit

static uint8_t puffer[MAX_VAR_ADDR];

an (wobei MAX_VAR_ADDR die Menge der zu verarbeitenden Bytes ist). Innerhalb der Funktion werden die jetzigen Lese/Schreibvorgänge in jeweils eine neue von mir kreierte Funktion umgelenkt, in der entschieden wird, ob in den virtuellen EEPROM geschrieben werden soll (also "alten Code benutzen") oder ob die Vorgänge in den RAM laufen sollen. Dazu greife ich in meinen neuen Codeblöcken auf einen auch dort gültigen Pointer zu, in dem ich in der UiDriverSaveEepromValuesPowerDown() den reservierten "puffer" geschrieben habe.

Nicht schlagen: Ich würde das alles ganz anders machen, wenn ich nicht kompatibel bleiben müsste!!!

Jemandem diesen Code zum "Querlesen" zu geben, wäre eine glatte Zumutung. Deswegen möchte ich wissen, ob es möglich ist, mit dem ST-Link V2 hier ein Debugging durchzuführen. Wie gesagt: ich habe ein paar Stellen in Vermutung, kann das aber nicht ohne weiteres überprüfen...

Mit dem STM32F4 arbeite ich seit 4 Monaten und habe keine weiteren Erfehrungen damit...

vy 73
Andreas
Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #1 on: 25. November 2015, 11:20:06 »

Hallo Andreas,

wo setzt Du

ts.ser_eeprom_in_use auf 0xFF ?

Grüsse,
René
Logged
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #2 on: 25. November 2015, 11:36:08 »

Ich nehme an, Du hast den Code aus dem GitHub devel-DF8OE...

Ich lade gleich mal den aktuellen Code hoch.

Die ts.ser_eeprom_in_use wird in der main.c nach dem Umkopieren des virtuellen in den seriellen EEPROM auf 0x00 gesetzt. Ebenfalls in der main.c wird sie vor Beginn der Identifikation des EEPROMS zunächst auf 0xFF gesetzt.

FF = not in use
00 = in use

vy 73
Andreas
Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #3 on: 25. November 2015, 11:46:15 »

> Ich nehme an, Du hast den Code aus dem GitHub devel-DF8OE...

Natürlich :-)
Logged
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #4 on: 25. November 2015, 12:49:40 »

Ich habe mal kurz reingeschaut. Irgendwie scheint mir, dass es noch etwas "durchgängiger" sein könnte.

Also, in copy_serv2virt(void) wird wie folgt gezählt:

for(count=1; count < 381; count++)

Beim Vergleich aber, werden alle 382 verglichen:

for(count=1; count < MAX_VAR_ADDR; count++)

Aber in UiDriverSaveEepromValuesPowerDown() werden 768 reserviert aber nur 383 geschrieben:

for(i=1; i<=MAX_VAR_ADDR; i++)

irgenwie verstehe ich das jetzt nicht.

vy 73 de René



Logged
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #5 on: 25. November 2015, 13:14:48 »

Im Moment werden nur Variable n unterhalb von 150 genutzt. Diese "Zahlen" sind im aktuellen Code alle durch eine Konstante ersetzt worden (MAX_VAR_ADDR). Die steht zur Zeit auf 383: das ist die definierte EEPROMlänge dess virtuellen EEPROMs.

Die verify-Rputine habe ich nur zum Debuggen gebraucht, die ist jetzt obsolet.

Kann sein, dass ich irgendwo beim letzten Wort (die MAX_VAR_ADDR sind ja WORDS, als 2 Bytes) geschlampt habe. Das ist aber unbedeutend, da die definierte Länge *deutlich* über der genutzten liegt.

Da die copy, Lese und sequentiellen Schreibroutinen alle funktionieren, kann  der Fehler nur in der Denkweise zum power-off-speichern liegen.

Entweder, ds Reservieren des RAM ist falsch, oder der RAM ist nicht mehr gültig, wenn die Schreib/Lesefunktionen daraus aufgerufen werden. Ich setze die ts.ser_eeprom_in_use bei Beginn der power-off-save-Funktion auf 0xAA und in den aufgerufenen Funktionen wird, wenn ts.ser_eeprom_in_use 0xAA ist, auf den RAM zugegriffen...

vy 73
Andreas
Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #6 on: 25. November 2015, 13:20:48 »

Versuch mal den Speicher global zu allozieren. Also nicht in der Funktion.

73, René
Logged
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #7 on: 25. November 2015, 13:45:48 »

Hatte ich auch schon vermutet und durch deine Bestärkung ausprobiert. Leider kein Unterschied. Der serielle EPROM wird definitiv mit irgendwas beschrieben: aber das ist "totaler Müll".

Das erste Wort wird im virtuellen EEPROM nicht genutzt, weil es "unzuverlässig ist", so Clint). Da das aber nicht für den seriellen EEPROM gilt, verwende ich diese beiden Bytes im seriellen EEPROM für:
ts.ser_eeprom_type (verwendeter serieller EEPROM)
ts.ser_eeprom_in_use

...und sogar diese beiden Bytes sind nach dem Ausschalten geschreddert - auf die greift die "Vermuddelungsroutine" von Clitnt aber gar nicht zu - die beginnt erst ab Word1 (== Byte 3)

Zumindest dieser Fehler muss folglich in diesen Teilen der power-off-Funktion liegen:

- auslesen des seriellen EEPROMS in den Buffer
- zurückschreiben desselben

...ich werde mal einen grossen Teil von Clints Routinen komplett übergehen und einfach nur auslesen und zurückschreiben...

vy 73
Andreas

EDIT:
Wenn ich den gesamten Block von Clint in der power-off-save-Funktion ausdokumentiere, dann wird der Speicher nicht geschreddert. Also liegt das Problem im Zusammenspiel von Clints Code und meinen "getrickten" Teilen, in dem ich die Routinen von Clint auf den Speicher arbeiten lasse...

EDITEDIT:
Danke, René. Durch Deinen Anstoß habe ich diesen Fehler gefixt:

die Adressierung im virtuellen EEPROM geschieht WORD-weise, im RAM aber BYTE-weise. Also muss die übergene Adresse vor der Verwendung mit 2 multipliziert werden

Jetz geht auch das Abspeichern, aber bei jedem Einschalten kommt die Meldung "new firmware found - preparing EEPROM". Das ist jetzt eine andere und vermutlich wesentlich harmlosere Baustelle. Hier habe ich vermutlich wirklich irgendwo it den von Dir angesprochenen "Zahlen" geschlampt...
« Last Edit: 25. November 2015, 14:05:02 by DF8OE » Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #8 on: 25. November 2015, 14:46:28 »

Hallo Andreas,

super!!!! :-)

Sag mal, inwieweit musst Du kompatibel bleiben?
Ich würde gerne den Code etwas überarbeiten, damit die Wartbarkeit etwas mehr gegeben ist. Die Warnings rausfriemeln, an der einen und anderen Stelle ein Enum rein etc.

vy 73 de René

PS: ich habe leider noch kein Board zum testen, aber da ich seit 25 Jahren vollamtlich in C und C++ Code, den STM kenne, trau ich mir das im Blindflug zu.
Logged
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #9 on: 25. November 2015, 15:35:20 »

Hallo René,

die Sache mit der Kompatibilität sehe ich so:

Man kann/soll/darf alles verändern, solange es mit dem EEPROM-Format und der "Standard-Hardware" des mcHF läuft. Insofern muss ich jetzt darauf achten, dass die seriellen EEPROM-Erweiterungen nicht stören, wenn jemand (und weite Teile der Yahoo-NG-Mitglieder werden das tun) die serielle EEPROM-Mod ignoriert. Wenn das ein paar KB Flash schluckt, ist das nicht weiter schlimm. Und wenn weitere Erweiterungen irgendwann mal die Flash-Kapazität von 512KB sprengen - dann stört mich das auch nicht. In diesen Dingen bin ich "knallhart". Seit Anfang Mai habe ich gepredigt, dass man den 50 Cent teureren STM mit 1MB Flash nehmen sollte - wer sich dessen verweigert hat, der hat selbst Schuld.

Mit den Codebereinigungen ist das so eine Sache - ich war da auch schon mal dran und habe nach einigen "Stirnrunzelereignissen" die Aktion zunächst vertagt.

1) Im Code sind RAM-Alloziierungen der art test_a[1000] etc. Diese Variablen werden zwar deklariert - aber niemals benutzt. Der GCC warnt natürlich. Du kannst diese Zeilen auch einfach auskommentieren - die Warnings sind dann weg. Aber das Binary ist dann nicht mehr lauffähig (darauf ist Clint bei seinen letzten Bereinigungsversuchen reingefallen). Ich habe davon noch einige Stellen gefunden. Man kann sie ausdokumentieren - die Warnings sind dann weg - aber das bin ist nicht mehr lauffähig. Clint schiebt das auf "buggy gcc" - ich vermute eher unbedachte Programmierung dahinter. Aber die Sache pilzt derart auf, dass ich zur Zeit lieber "mit fassbarem Ergebnis" programmiere, als bereinige...

2) Wenn Du auch nur irgendeine Codeoptimierung aktivierst, ist das bin ebenfalls nicht mehr lauffähig. Auch das ist mitnichten ein Fehler des gcc - auch das liegt mit 99,999% Sicherheit an der Programmiertechnik.

Deswegen bin ich am Zweifeln, ob Dir deine Erfahrung da hilft oder ob Du nicht doch einen mcHF zum Verifizieren deiner Arbeit brauchst. Da liegt noch einiges im Argen - und wenn wir das gelöst haben, dann wird ALLES gehen, was ein Amateur mit dem Gerät machen will.

Wenn Du solange schon mit dem STM arbeitest, lass mich bitte neugierig sein:

- arbeitest Du unter Windows oder unter Linux?
- ist es mit dem ST-Link V2 möglich, ein Debugging, so wie ich es im ersten Post geschrieben habe, möglich?

Ich werde jetzt erstmal schauen, wo die restlichen Kinken liegen - salût

vy 73
Andreas
Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #10 on: 25. November 2015, 15:56:28 »

Hallo Andreas,

ich sehe, dann muss mein mchf erstmal fertig sein. Das muss noch warten, weil ich vorerst ein anderes Projekt fertigstellen möchte.

Zu 1)

Das der GCC in dem Bereich buggie ist, schliesse ich fast aus. Die von Dir beschriebenen Probleme deuten auf schlechtes Memory Management hin. Ich habe dazu auch schon einige Stellen gesehen beim durch den Code "surfen"
Allerdings macht mich sowas auch etwas nachdenklich, das ist wie wenn man auf das Fundament der Pfahlbauten einen Hochhaus baut. Früher oder später bricht das komplett zusammen.

Zu 2) dasselbe. Da fehlen zum Beispiel einige volatiles. Der Stack ist schon nach den ersten paar Calls versaut. Das kann funktionieren, aber stabil ist es so nie.

Zu Deinen Fragen: entwickeln tu ich auf Linux. Ich habe aber auch ein Windows und Mac zum testen (ich arbeite oft an OpenSource Software).

Wegen dem debuggen, ja das geht, ist allerdings sehr träge.

Vy 73 de René

Edit:

>Wenn Du solange schon mit dem STM arbeitest, lass mich bitte neugierig sein

Mit dem STM bin ich erst vier Jahre unterwegs, privat. Beruflich entwickle ich in einem anderen Bereich auf Solaris und Linux.
« Last Edit: 25. November 2015, 16:27:02 by hb9frh » Logged
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #11 on: 25. November 2015, 16:43:12 »

Super.

Ich arbeite ausschließlich unter Linux, am liebsten auf der Konsole (was das Programmieren angeht).

Kannst Du mir einen Link schicken bezügl. Debuggen STM mit STLINKV2 unter Linux?

Mit dem Beispiel "Pfahlbauten" gehe ich voll konform. Ich denke, hier müssen wir strukturiert worgehen und einzelne Punkte angehen und erst wenn diese Baustellen sauber sind an den nächsten gehen. Ich würde gefühlt mit dem Memory-Management anfangen. Dann wären die beiden "sinnlosen Variablen" überflüssig und vermutlich würden dann auch schon Optimierungen klappen. Dann geht es den volatiles und den Stacküberlaufgefahren an den Kragen. Und dann müssen wir das Ganze dringend auf eine vernünftige Interruptsteuerung umbauen anstatt von Zeitschleifen  .

Nichts jagt uns - und ich hoffe, Clint bleibt auch bei der Stange.

Clint hat einen im wesentlichen funktionierenden aber drastisch einfacheren Stand von Chris übernommen und dann damit weitergemacht. Der Mist ist also folglich "gewachsen" - eine Schuld hat niemand. Aber wir sollten dem Ganzen Einhalt bieten solange man das noch kann...

vy 73
Andreas
Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
hb9frh
schon länger dabei
**

Offline

Posts: 57



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #12 on: 25. November 2015, 16:55:13 »

Hallo Andreas,

dieser Link dürfte Dir helfen:

https://www.mikrocontroller.net/articles/STM32F4-Discovery#stlink

Das mit dem Optimizer klappt nicht ohne volatiles. Das ist ja das Problem. Arbeiten tu ich auch nur mit Konsole (vi, ctags, cmake, git [-flow]). Eclipse ist mir zu "schwer".

Das Problem wird sein, umso mehr Code, umso mehr Aufwand.

Vy 73 de René
Logged
DF8OE
Administrator
*****

Offline

Posts: 6268



Stellvertr. OVV I40, Jugend / Nachwuchsreferent

View Profile WWW
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #13 on: 25. November 2015, 17:32:32 »

Danke René, der Link sieht vielversprechend aus. Ich werd mich da mal reinknien...

Die Idee mit dem Eclipse kam mir nur, weil ich auch an die GUI-Freunde denken wollte. Und es ist immer noch wesentlich transparenter mit Linux und Eclipse zu arbeiten als mit Windows und CooCox. Da ist das gebaute Binary nur mit der älteren Version von CooCox lauffähig, und Du kannst auch nicht die neueren gcc nehmen, dann ist das Build auch ein Türstopper.

Also mit dem Eclipse (dem Mars und auch dem Luna) konnte ich mit jeweils drei verschiedenen gcc-Versionen auf Anhieb lauffähige Builds erzeugen. Ich denke, dass das mit dem Eclipse unter Windows nicht anders ist. Wenn ich mich auf mein Werkzeug (in dem Fall die IDE) nicht verlassen kann, dann brauche ich gar nicht anzufangen zu basteln...

vy 73
Andreas
Logged

Wenn der Wind des Wandels weht, nageln die einen Fenster und Türen zu und verbarrikadieren sich. Die anderen gehen nach draußen und bauen Windmühlen...
qrz.com-Seite von DF8OE
-----------------------------------------------------
>>>> Die Inhalte meiner Beiträge dürfen ohne meine explizite Erlaubnis in jedwedem Medium weiterverbreitet werden! <<<<
DC3AX
Interessent
noch länger dabei
***

Offline

Posts: 186



Ich liebe dieses Forum!

View Profile
Re:STM32F4 debugging mit ST-Link-V2?
« Reply #14 on: 26. November 2015, 09:57:48 »

Andreas,

wie Du schon von mir gehört hast, ist das mit Eclipse und gdb / ST-Link kein Problem. Ich muss mal sehen, wie ich das hier ordentlich beschreiben kann.

Klar ist, wenn man Debuggen will, müssen einige Compiler-Schalter passen und einige Optimierungen sind nicht möglich, wodurch der Code größer wird. Wenn den Release-Code debuggt, muss man damit leben, dass man hin und wieder "nur" Assembler Code zu sehen bekommt... Kann man aber beim ARM gut lesen.

Der arm-gcc-4.9.2 hat einen Bug im Linker und daher muss man unbedingt auf den 4.9.3 bzw. den gcc-arm-none-eabi-4_9-2015q1 oder neuer von linaro wechseln. Der Bug betrifft nicht nur den arm-none sondern auch den arm-linux- Zweig und darüber sind nicht nur wir, sondern auch OE und Angstroem gestolpert.
Es kann sein, dass es kein Defekt im Linker selbst ist, sondern dass geänderte default-flags dazu führen. Letztendlich ist es egal, da man das Problem mit einem einfach zu installierenden Paket auf allen Plattformen umschiffen kann.

vy 73
Ulrich
Logged

Es gibt drei binäre Zustände: Ein, Aus und Vielleicht. Je höher die Frequenz, desto Vielleicht...
Pages: [1] Go Up Print 
Diskussions- und Newsboard des DARC-Ortsverbandes I40  |  allgemeine Kategorie  |  mcHF Projekt Deutsch / English (here you can discuss everything related to mcHF) (Moderators: DF8OE, DL1PQ)  |  Topic: STM32F4 debugging mit ST-Link-V2? <- zurück vorwärts ->
Jump to: 


Login with username, password and session length

 Es wird die Verwendung von Browsern die auf der "Blink"-Engine basieren und mindestens
1024x768 Pixel Bildschirmauflösung für die beste Darstellung empfohlen
 
Amateurfunk Die Beiträge sind, sofern nicht anders vermerkt, unter der folgenden Lizenz veröffentlicht:
GNU Free Documentation License 1.3 GNU Free Documentation License 1.3
verbindet!
Powered by MySQL Powered by PHP Diskussions- und Newsboard des DARC-Ortsverbandes I40 | Powered by YaBB SE
© 2001-2004, YaBB SE Dev Team. All Rights Reserved.
- modified by Andreas Richter (DF8OE)
Impressum & Disclaimer
Valid XHTML 1.0! Valid CSS!