KINGx - Das inoffizielle PlayStation Forum & News Portal

Normale Version: PSP3004 "Hello World"-Anfrage
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo, bin Anfänger und neu hier. Habe schon etliches im Forum gelesen, aber leider keine Antwort auf mein Problem gefunden.

Habe eine PSP3004 (8D, 5.51) und möchte mittels eLoader ein simples selbstgemachtes "Hello World"-Programm starten. Da der eLoader grundsätzlich mit ein paar einfachen Homebrews funktioniert, bin ich davon ausgegangen, dass ein simples Testprogramm, das lediglich "Hello World" anzeigt kein Problem sei.

Habe folgenden Code (pspfreak.de) mit pspsdk0.9.5 fehlerlos kompiliert, aber trotzdem funktioniert es nicht. Beim Starten über den eLoader passiert nichts, außer das sich die PSP nach einer Weile abschaltet. Kennt sich jemand aus und kann mir einen Tipp geben? Vielen Dank.

Code
#include #include
PSP_MODULE_INFO("Hello World", 0, 1, 1);

#define printf pspDebugScreenPrintf

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
sceKernelExitGame();
return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
int cbid;

cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
sceKernelRegisterExitCallback(cbid);

sceKernelSleepThreadCB();

return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
int thid = 0;

thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
if(thid >= 0) {
sceKernelStartThread(thid, 0, 0);
}

return thid;
}


int main() {

pspDebugScreenInit();
SetupCallbacks();

printf("Hello World");

sceKernelSleepThread();

return 0;

}
kann es sein dass du versuchst auf den kernel zuzugreifen?
Hi,

was dir fehlt ist eine Warteschleife in deinem Haupt-Thread.

Sowas wie

Code:
int main() {

pspDebugScreenInit();
SetupCallbacks();

while (running){
//do something like printf
}
return 0;


dabei wird "running" als globale BOOL variable definiert und mit true initialisiert.
In deinem exit_callback wird running dann auf false gesetzt.

Ja, pspkernel.h und pspdebug.h sind eingebunden, werden aber leider im Code nicht angezeigt. Aber wie soll's ohne pspkernel.h funktionieren?
Erstmal vielen Dank für die schnelle Hilfe. Der Tipp von anmabagima hat die Sache transparenter gemacht. Nach den Code-Änderungen gibt der Compiler Fehlermeldungen aus. Werde daraus leider nicht schlauer, ganz im Gegenteil.



Ist es vielleicht doch ein Kernel-Problem?

knopper :
Erstmal vielen Dank für die schnelle Hilfe. Der Tipp von anmabagima hat die Sache transparenter gemacht. Nach den Code-Änderungen gibt der Compiler Fehlermeldungen aus. Werde daraus leider nicht schlauer, ganz im Gegenteil.



Ist es vielleicht doch ein Kernel-Problem?


Nein du hast "running" nicht deviniert.
Entweder schreibst du "while(1)" das würde funktionieren, oder du schreibst oben "int running" oder so.

Habe jetzt den Code geändert (while(1)) und neu compiliert. Hat auch fehlerlos geklappt. Aber beim Starten von "Hello World" über den eLoader hat sich nichts verändert. Die Ladeanzeige blinkt kurz und das wars dann. Wenig später verabschiedet sich die PSP3004.

Code (unterer Teil)
int main() {
pspDebugScreenInit();
SetupCallbacks();
while (1){
printf("Hello World");
}
return 0;
}
Wenn du jetzt auf deiner PSP Produktiv programmieren willst, musst du leider auf die Finale Version des HBL warten.
Willst du jetzt aus Spaß ein Hello World coden, dann schau die mal die Funktionen aus dem Hello World Tutorial von Hackman an:
http://www.pspking.de/forum/showthread.php?tid=16919
@pspbricker

Danke für den Tipp, werde ich mir heute Nacht reinziehen.

Grüße...
Das ist kein Hello World Tutorial. Hier der Code den den du brauchst, kurz und schmerzlos:

Code:
#include <pspsdk.h>
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspctrl.h>
#include <pspthreadman.h>

PSP_MODULE_INFO("HalloWelt", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
PSP_MAIN_THREAD_STACK_SIZE_KB(256);

int main(int argc, char *argv[])
{
        SceCtrlData pd;
        pspDebugScreenPrintf("Hallo Welt\n\nDrücke [X] um das Programm zu beenden...");
        while(1)
        {
                 sceCtrlReadBufferPositive(&pd,1);
                 if(pd.Buttons == PSP_CTRL_CROSS) { break; }
        }
        pspDebugScreenClear();
        pspDebugScreenPrintf("Bye :)");
    return 0;
}

Hi,

@BattleMaster246:
ein recht guter code, der nur einen "Haken" hat. Diese HB kann nicht über den Home-Button wie üblich beendet werden.

@PSP-Hilfe: Auch die Nutzung von while(1) hat einen Haken, denn die Schleife wird auch beim Drücken der home-Taste nicht beendet. Das kann unterumständen auch zum Freeze/absturz der PSP führen. Darum sollte man immer vermeiden infinite Loops in den Programmen zu haben, es sollte immer eine EXIT-Bedingung geben.
Hallo,

@ pspbricker
Hackmans Hello World Tutorial ist 'ne feine Sache, aber für einen Anfänger nicht einfach. Mal sehen, wann und wie ich das hinkriege.

@ BattleMaster246
Der "kurz & schmerzlos"-Code ändert leider nichts daran, dass der eLoader die wenigen Code-Zeilen von "Hello World" nicht richtig lesen kann. Die Ladeanzeige leuchtet jetzt so lange, bis sich die PSP3004 nach ca. 10 Sekunden abschaltet.

Mir will einfach nicht einleuchten, dass einige Homebrews funktionieren, aber kein simples "Hello World".
Hi,

sind die paar wenigen Homebrews die funktionieren vielleicht im Kernel-Mode und nicht im User-Mode ?
Dein Hello World ist definitiv ein User-Mode HB....
HBL lädt nur UMode Homebrews..
@anmabagima:
wie würde der code ausschauen das man mit dem home button auch beenden kann.
?
mfg.flo
Hallo, weiß leider nicht in welchem Mode die wenigen lauffähigen Homebrews sind:

PSP_Snake
PSP_Tetris
PSP_Plasma
Bookr (PDF-Viewer)
Seiten: 1 2
Referenz-URLs