necesito usar timer

hola amigos.
Alguien me puede ayudar.
Estoy compilando para 3.x
Necesito que cada x segundos se realice una funcion, mientras el hombrew sigue funcionando.
Ahora lo tengo mediante bucle, y eso es lo que quiero evitar.
He encontrado 2 metodos creo. pero tengo problemas.
-------------------------------------------------------------------------------
(metodo 1) (pspsystimer.h:)
He leido algo de timer aqui:
http://forums.ps2dev.org/viewtopic.php?t=7519&highlight=&sid=1b51f3c467127cc45c33bb72698f2bb9

pero la parte que pone:
SysTimerForKernel.S no entiendo como implementarla.

Ahora he implementado la parte final de ese post:(el main.c)
Me compila bien, sin errores, pero cuando le doy a ejecutar la aplicacion(juego) directamtne desde la psp me da el error de que no puede iniciar el juego...
Y si intento arrancar mediante psplink me da error:
Failed to Load/Start module 'host0:/barcos371/xxxxx.prx' Error: 0x8002013C

si al main le quito la linea:
timer =sceSTimerAlloc();
no me da error la aplicacioon, o sea el error me lo da en la funcion : sceSTimerAlloc();

------------------------------------------------------------------------------
(metodo 2)(sceKernelSetVTimerHandler)
main.c

static SceUInt timer_handler(SceUID uid, SceKernelSysClock *c1, SceKernelSysClock *c2, void *common){
SceKernelSysClock clock;
unsigned time;
sceKernelGetSystemTime(&clock);time = clock.low;
return 0;
}


int main(){

const char * name="jose";
struct SceKernelVTimerOptParam * opt;
SceUID timer1;
unsigned int aa; //SceSize
aa=1;SceSize size;// opt.size=aa;
timer1=sceKernelCreateVTimer(name, NULL);

#define SAMPLE_FREQ 1000*1000*10 //10 sec
SceKernelSysClock sc; sc.hi = 0; sc.low = SAMPLE_FREQ;
/*
int thid = sceKernelGetThreadId();
SceKernelThreadInfo info; info.size = sizeof(info);
int ret = sceKernelReferThreadStatus(thid, &info);
setXY(0,6);printf("sceKernelReferThreadStatus1: %i",ret);
if(ret == 0){
*/
void* timer_addr = timer_handler;
// if((info.attr & PSP_THREAD_ATTR_USER) == 0){timer_addr += 0x80000000;}
err = sceKernelSetVTimerHandler(timer1, &sc, timer_addr, NULL);
// }

en este metodo me salta el timer pero solo una vez, y luego ya no me vuelve a saltar el timer o sea no lo hace de forma repetitiva.
------------------------------------------------------------------------------------

No sé si me he explicado bien.

POr favor alguna ayudaaa.
muchas graciasssss.
Segun esto, deberias retornar -1

/**
* Setup a SysTimer handler
*
* @param timer - The timer id.
* @param cycle - The timer cycle in microseconds (???). Maximum: 4194303 which represents ~1/10 seconds.
* @param handler - The handler function. Has to return -1.
* @param unk1 - Unknown. Pass 0.
*
*/
void sceSTimerSetHandler(SceSysTimerId timer, int cycle, int (*handler)(void), int unk1);

Pero vamos, este tipo de funciones, suele retornar 0 para cancelar o un valor verdadero para repetir (en PC por ejemplo, se estila devolver el numero de ms del proximo timer o 0 para cancelar)


El .S es lenguaje ensamblador: lo puedes compilar con gcc al igual que los *.c
Hermes ante todo muchas gracias.
No sé compilar ese fichero ensamblador (.s).
Yo tengo un makefile, para compilar mi aplicacion.

1)dime como tengo que compilar ese SysTimerForKernel.s
yo intenté con: gcc -x assembler SysTimerForKernel.s
y me dió error

2) una vez compilado SysTimerForKernel.s, como lo agrego a mi aplicación.


En resumen como tengo que hacerlo para que funcione mi eboot o mi prx
Muchas gracias de nuevo.
Pero vamos a ver ¿Como compilas los ficheros .c? Pues asi tienes que añadir el .S (que no .s, en la primera forma, tira de preprocesador)

Si el fichero se llama hola.S pues añade en OBJS=main.o hola.o y ya está


Si te da error, es porque quiza no encuentre pspstub.s (tendras que dar la ruta de los include) o porque esta utilizando gcc x86 en vez del compilador cruzado psp-gcc.

luego por supuesto, tendras que tener el fichero de cabecera correspondiente .h para que defina las funciones a la hora de usarlas en tu main.c .
¿Para qué necesitas el timer?
Sólo por curiosidad [angelito].
Hermes una cosa, (perdona mi pesadez) pero para poner el "hola.o" tengo que convertir el hola.S a hola.o. Como lo hago.
Yo puse y me lanzó este error:
1.-
psp-gcc -o SysTimerForKernel.o SysTimerForKernel.S
SysTimerForKernel.S:3:22: error: pspstub.s: No existe el fichero ó directorio

2.- Luego puse todo el path completo en el include de dentro de SysTimerForKernel.S y me lanzo el siguiente error.
psp-gcc -o SysTimerForKernel.o SysTimerForKernel.S
SysTimerForKernel.S:3:22: error: pspstub.s: No existe el fichero ó directorio
psp@Upsp:~/proyectos/3.71/barcos$ psp-gcc -o SysTimerForKernel.o SysTimerForKernel.S
/usr/local/pspdev/lib/gcc/psp/4.1.0/../../../../psp/lib/crt0.o: En la funci�n `_start':
/home/psp/download/psptoolchain/build/pspsdk/src/startup/crt0.c:149: referencia a `sceKernelCreateThread' sin definir
/home/psp/download/psptoolchain/build/pspsdk/src/startup/crt0.c:150: referencia a `sceKernelStartThread' sin definir
/usr/local/pspdev/lib/gcc/psp/4.1.0/../../../../psp/lib/crt0.o: En la funci�n `_main':
/home/psp/download/psptoolchain/build/pspsdk/src/startup/crt0.c:68: referencia a `strlen' sin definir
/home/psp/download/psptoolchain/build/pspsdk/src/startup/crt0.c:83: referencia a `atexit' sin definir
/home/psp/download/psptoolchain/build/pspsdk/src/startup/crt0.c:86: referencia a `main' sin definir
/home/psp/download/psptoolchain/build/pspsdk/src/startup/crt0.c:89: referencia a `exit' sin definir
collect2: ld devolvió el estado de salida 1
--------------------------------------------------------------------------------


Chano el timer lo quiero para que cda x segundo lea del wifi y compruebe si le llego algo.
Ahora lo tengo metido en un bucle pero no es muy "fino".

por favor una ayudaa.
gracias de nuevo.
------------------------------------------------------------------------------
Nota.- yo tengo este makefile:

TARGET = xxxxx
PSPSDK = $(shell psp-config --pspsdk-path)
PSPBIN = $(shell psp-config --psp-prefix)/bin
SDL_CONFIG = $(PSPBIN)/sdl-config
OBJS = main.o

BUILD_PRX = 1
PSP_FW_VERSION = 371

SDL_INSTALL_PATH=/usr/local/pspdev/psp

#DEFAULT_CFLAGS = $(shell $(SDL_CONFIG) --cflags)

DEFAULT_CFLAGS = -I$(SDL_INSTALL_PATH)/include/SDL

MORE_CFLAGS = -G0 -O2 -DPSP

CFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS)
CXXFLAGS = $(DEFAULT_CFLAGS) $(MORE_CFLAGS) -fno-exceptions -fno-rtti

#LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm $(shell $(SDL_CONFIG) --libs)

LIBS = -lSDL_gfx -lSDL_image -lSDL_mixer -lSDL_ttf -lvorbisidec -lfreetype -lpng -ljpeg -lz -lm -L$(SDL_INSTALL_PATH)/lib -lSDL -lm -lGL -lpspvfpu -L$(SDL_INSTALL_PATH)/sdk/lib -lpspdebug -lpspgu -lpspctrl -lpspge -lpspdisplay -lpsphprm -lpspsdk -lpspaudio -lc -lpspuser -lpsputility -lpspkernel -lpspnet_inet -lpspirkeyb -lpsppower -lpsprtc -lpspwlan -lpspnet -lpspnet_adhoc -lpspnet_adhocctl -lpspnet_adhocmatching -lpspgum -lpspgu -lm

EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = xxxxx
PSP_EBOOT_ICON = ./imagenes/iconoinicio371.png
PSP_EBOOT_PIC1 = ./imagenes/background.png

include $(PSPSDK)/lib/build.mak
--------------------------------------------------------------------------------
el fichero:SysTimerForKernel.S

.set noreorder

#include "/usr/local/pspdev/psp/sdk/include/pspstub.s"

STUB_START "SysTimerForKernel",0x00010011,0x00090005
STUB_FUNC 0x228EDAE4,sceSTimerGetCount
STUB_FUNC 0x4A01F9D3,sceSTimerStopCount
STUB_FUNC 0x53231A15,SysTimerForKernel_53231A15
STUB_FUNC 0x54BB5DB4,sceSTimerResetCount
STUB_FUNC 0x975D8E84,sceSTimerSetHandler
STUB_FUNC 0xA95143E2,sceSTimerStartCount
STUB_FUNC 0xB53534B4,SysTimerForKernel_B53534B4
STUB_FUNC 0xC105CF38,sceSTimerFree
STUB_FUNC 0xC99073E3,sceSTimerAlloc
STUB_END

----------------------------------------------------------------------------------
No tienes que convertir nada, al ponerlo en el makefile cuando este se ejecute ya hace el todo el trabajo necesario
Ante todo muchas gracias. a todoss

Retiro todo lo dicho anterior.

Ya lo he conseguido!!
usando el "metodo 2".
el ciclo se consigue retornando de la funcion el tiempo que quieras, (return x) aunque como minimo son segundos.

Muchas gracias de nuevo a todos
7 respuestas