Difference between revisions of "Developer Tips/de"
(Translated to German - Categorized) |
Blooper4912 (talk | contribs) m |
||
Line 98: | Line 98: | ||
*Wenn es eine Routine gibt die effizienter (schneller und/oder mit weniger Code) arbeitet, nutze diese. | *Wenn es eine Routine gibt die effizienter (schneller und/oder mit weniger Code) arbeitet, nutze diese. | ||
− | [[Category:German | + | [[Category:German Pages]] |
Revision as of 22:22, 1 June 2008
Quellcode Ausschnitte
Video-System-Autoerkennungs-Routine
Bitte binde eine automatische Erkennungsroutine ((VIDEO_GetCurrentTVMode()) ein um HDTV/EDTV zu erkennen und setze den dazugehörigen Video-Modus.
Die aktuelle automatische Erkennungsroutine arbeitet nicht mit PAL60 ((480i @ 60 Hz bei einer PAL Wii), die das offizielle Nintendo RGB-Kabel nutzt.
Hier ist die Video-Erkennungsroutine aus dem DivKitPro Wii-Beispiel.
switch(VIDEO_GetCurrentTvMode()) { case VI_NTSC: rmode = &TVNtsc480IntDf; break; case VI_PAL: rmode = &TVPal528IntDf; break; case VI_MPAL: rmode = &TVMpal480IntDf; break; default: rmode = &TVNtsc480IntDf; break; } VIDEO_Configure(rmode);
Wii Neustarten
Es wäre eine gute Idee in jeder Homebrew die Möglichkeit einzubauen die Wii neuzustartn. Hier ist der Quellcode dafür.
void Reboot()
{
// Thanks to hell_hibou
int fd = IOS_Open("/dev/stm/immediate", 0);
IOS_Ioctl(fd, 0x2001, NULL, 0, NULL, 0);
IOS_Close(fd);
}
Zurückspringen zum Loader
Es wäre eine gute Ideen eine Zurückspringen zum "loader" zu ermöglichen. Ansonsten müsste man die Wii neustarten um die Homebrew zu beenden.
// Binde einfach die unistd.h-Headerdatei ein und rufe die exit() Funktion auf, um zum loader zurück zu kommen // Das Returnen aus der main Funktin funktioniert ebenso #include <unistd.h> // .... exit(0);
Anmerkkung: Der __crtmain-Code ist fehlerhaft, da er standardmäßig nicht exit aufruft. Kann man selbst verbessern. Zusätzlich ruft es nicht die Konstruktoren der globalen Objekte in C++ auf. Das kommt davon wenn man unsauber zusammengestrickte Einzeiler verwendet.
Debugging Tipp
Wenn du mit einem Absturzt deiner Homebrew konforniert wirst, siehst du meist eine Adresse mit einigem Maschinen-Code auf dem Display. Hier ist mein Trick um die Stelle im C++-Code zu lokalisieren.
Angenommen deine Homebrew stürzt ab und folgendes wird angezeigt:
CODE DUMP: 800084ac: 809F0020 2F840000 ... 800084bc: ... 800084cc: ...
Die 800084ac ist die Speicheradresse in Hex an der der Fehler auftrat. 809F0020 ist der Maschinen-Code der den Fehler produziert.
- Schritt 1:
Ändere in deinem Makefile die CXXFLAGS-Zeile zu:
CXXFLAGS = -save-temps -Xassembler -aln=$@.lst $(CFLAGS)
Das -save-temps Attribut speichert ddie assemblierte-Zwischencode-Datei, die interessant sein könnte. Das -Xassembler -aln=$@.lst Attribut erzeugt eine Liste der Dateien die assemblierten und Maschinen-Code enthalten. Jetzt Compiliere dein ganzes Projekt erneut. Anmerkung: Das wirkt sich nur auf C++ Code aus.
- Schritt 2:
Schaue dir die Map-Datei an die erstellt wurde. Die Map ist dort zu finden wo auch das Wii-Template Makefile ist. Normalerweise ist es im Built-Unterordner, als irgendwas.map Datei. Suche in Map-Datei nach der Speicheradresse die am nähsten an der steht die wir im CORE DUMP gehen haben. Hier ein Beispiel:
0x80008464 ShooterView::Render(BibGraphicsDevice&)
Das sagt mir, dass der Absturtz 72 Byte in der ShooterView::Render() Funktion war. Jetzt müssen wir die Render() Funktion noch im Code finden
- Schritt 3:
Suche in der Listen-Datei nach der gesuchten Funktion. Hier ein Beispiel:
473 .globl _ZN11ShooterView6RenderER17BibGraphicsDevice 474 .type _ZN11ShooterView6RenderER17BibGraphicsDevice, @function 475 _ZN11ShooterView6RenderER17BibGraphicsDevice: 476 .LFB1465: 477 .loc 1 158 0 478 .LVL20: 479 02d0 9421FF00 stwu 1,-256(1)
Die Funktionsnamen sind hier beschnitten denn es handelt sich um C++ Code ( Siehe http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_C.2B.2B). Die Adresse des ersten Befehls von Render() ist an der Stelle 02d0. Das ist gleichzeitig Zeile 158 in unserer Datei (".loc 1 158 0"). Um den Fehler zu finden müssen wir an Stelle 0x318 ( = 0x2d0 + 72 ) suchen. Wie hier:
.loc 1 168 0 528 0314 809F0020 lwz 4,32(31) 529 0318 2F840000 cmpwi 7,4,0
Hier sehen wir die Maschinen-Adresse 0x318 mit dem Maschinencode. Der nähste .loc Befehl sagt uns, dass das Problem in Zeile 168 in unserer ShooterView.cpp aufgetaucht ist. Für mehr Informationen zu Assembler-Ausgaben, gibt es dieses Manual: http://sourceware.org/binutils/docs-2.18/as/index.html
Grunstätzliche Programmier Tips
- Kommentierte deinen Code durchgehend, das hilft anderen Fehler zu finden.
- Jeder ungenutzt Code sollte aus dem Programm verschwinden, außer es ist ein Programm um anderen etwas zu Erklären.
- Wenn es eine Routine gibt die effizienter (schneller und/oder mit weniger Code) arbeitet, nutze diese.