Anuncios Google

Entrega 3. Entendiendo 'Hola nena'. (Curso desde 0 de programación C bajo PSP por THC_Hack)

Entrega 3. Entendiendo 'Hola nena'.

 

Bien, en esta entrega trataremos de entender al completo el programa Hola nena que compilamos en la entrega anterior. Para ello os voi a volber a escribir el código pero con comentarios para que lo entendaís todo. Sin más empezamos:

main.c

/*
Bien, vamos a escribir un sencillo 'Hola nena'. Un 'Hola nena' es el equivalente a un
'Hola mundo' de toda la vida pero con un poco más de gracia. Este programa consiste simplemente
en mostrar algo de texto por pantalla sobre el fondo negro de la PSP. No tiene mucha miga pero
es la base.
 
Esto que estás leyendo es un comentario. Los comentarios son ignorados por el compilador y no
aumentan el peso del programa. Sirven para que cuando leas un código fuente (el código fuente es
el código que escribes en el main.c) te acuerdes de cada cosa y lo tengas todo bien organizado.
 
Hay 2 tipos de comentarios:
    * Comentarios de una línea (//): se inician escribiendo dos barras (//) y no se pueden cerrar de
      ninguna forma.
    * Comentarios con apertura y cierre (/*): pueden ocupar más de una línea. Se abren y se
      cierran en cualquier momento.
*/
 
#include <pspkernel.h>
/*Esta librería es obligatoria si estás programando para la PSP.*/
 
#include <pspdebug.h>
/*Esta librería tiene las funciones que sirven para escribir en pantalla, limpiar la pantalla, cambiar el color del fondo, etc. Esta librería no es obligatoria pero casi siempre (por no decir siempre) la vas a necesitar.*/
 
#define printf pspDebugScreenPrintf
/*Con #define [nuevo_nombre] [nombre_de_la_funcion] lo que haces es algo así como crear un acceso directo a la función. En este caso sería lo mismo poner printf ("Hola nena"); que poner pspDebugScreenPrintf ("Hola nena");. Puedes escoger cualquier nombre para la función respetando siempre que el primer caracter del nombre de la variable sea una letra o una barrabaja.*/
 
PSP_MODULE_INFO("Hola nena", 0, 1, 1);
/*Esto también es obligatorio para todos los programas. El primer parámetro es el nombre del programa, el segundo el modo de aplicación. Existen dos modos, modo user y modo kernel. El modo user es más seguro porque no nos deja escribir en la flash. El modo kernel si que nos permite escribir en la flash. 1-> modo kernel; 0-> modo user. El tercer y el cuarto número indican la versión. Esta sería la versión 1.1.*/
 
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
/*Esta línea también es obligatoria y lo que hace es volber ha decir a la PSP que el programa se ejecute en modo user.*/
 
void main (void)
{
/*Bien, acabamos de declarar el main. El programa se empieza a ejecutar por la función main. En este caso no devuelbe nada (ya que solo tiene que escribir en pantalla) y no tiene parámetros. Void es algo  así como vacío.*/
/*Date cuenta de que se inicia con la llave y también de cierra con la llave*/
 
    pspDebugScreenInit (); //Es una función de la librería pspdebug.h y sirve para inicializar la pantalla
                                         //y prepararla para poder empezar a escribir encima de ella.
 
    printf ("Hola nena\n");
/*Escribe Hola nena en pantalla. Todas las ordenes finalizan con punto y coma (;)*/
/*El \n significa salto de línea, con este ejemplo enseguida lo vas a entender*/
 
    printf ("Ahora estoy abajo.");
    printf (" Pero ahora estoi donde antes.");
    printf ("\n\nAhora entiendo lo que es un salto de linea :)");
/*Comprueba en tu PSP el resultado de esto al ejecutar el programa.*/
 
}//fin del main
 
 
 
 

makefile

#Primera linea del makefile necesario, para la compilacion de nuestra aplicacion
#TARGET, objetivo traducido literalmente, es el nombre de nuestra aplicacion
TARGET = Hola_nena
 
#OBJS, viene de OBJECTS, objetos traducido literalmente
#Aquí tenemos que poner los .c de nuestra aplicacion,
#en este caso solo el main, pero la extension
#tendra que ser .o, porque encriptara, codificara,
#enrarezera, hara que no entiendas nada, (como lo quieras decir)
#el archivo.
OBJS = main.o
 
#Esto es complejo, FLAGS
#Generalmente, los FLAGS de tus aplicaciones seran asi
#Son "archivos" por asi decirlo, que se incluiran en la aplicacion compilada
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
 
#EXTRA_TARGETS, Objetivos extra traducido literalmente
#Con esta linea le vamos a decir que queremos que nuestra aplicacion
#sea un EBOOT.PBP, los .exe, ejecutables de la PSP por asi mencionarlo
EXTRA_TARGETS = EBOOT.PBP
 
#PSP_EBOOT_TITLE, titulo del eboot de la PSP traducido literalmente
#Con esto, le vamos a dar el nombre a la aplicacion, ese que sale cuando
#quieres ejecutar algo en la PSP y te quedas parado encima
PSP_EBOOT_TITLE = Hola nena
 
#BUILD_PRX, ésto es recomendable ponerlo sobretodo para que
#nuestro homebrew funcione en CFW 3.XX y superiores.
#Ésta línea crea un .prx que no hace falta meterlo en la PSP.
BUILD_PRX = 1
 
#Con estas dos lineas le decimos que empieze a fabricar nuestra creacion
#con lo anteriormente ordenado en el makefile
#Lo compilara con el pspsdk, buscara las librerias en la ruta que tenga como
#valor la variable del sistema PATH
#y incluira el build.mak
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Resultado:

Ahora compila utilizando este código en el main.c y como makefile el mismo de la entrega anterior. Comprueba que entiendes todo perfectamente. Cualquier pequeña duda que tengas ponla aquí y será respondida. En la próxima entrega jugaremos con distintas cosas y aprenderemos sobre las variables.

 

Ejercicio de la semana

El ejercicio de la semana es el siguiente. Hay dos funciones llamadas sceKernelDelayThread() y sceKernelExitGame(). Con sceKernelDelayThread(1*1000*1000) esperas 1segundo y cotinuas. Con sceKernelExitGame() sales al XMB. Haber si con esto eres capaz de escribir un programa que muestre de una manera clara el funcionamiento de estas funciones. Envíame el código fuente por MP y publicaré el ejemplo más claro en la próxima entrega y a su autor. Espero que me mandeis unos cuantos ;) ¡Hasta la próxima entrega!


Entrega 2. Hola nena.



Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de DeViaNTe

Buen tuto

Bien explicado, así muchos podrán dar sus primeros pasos, tan sólo corregirte una cosita ;)

#Esto es complejo, FLAGS #Generalmente, los FLAGS de tus aplicaciones seran asi #Son "archivos" por asi decirlo, que se incluiran en la aplicacion compilada CFLAGS = -O2 -G0 -Wall CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti 

ASFLAGS = $(CFLAGS)

No son realmente archivos, son, "banderitas" (FLAGS), opciones de configuración del compilador.

CFLAGS , configuración de C.
-O2 = optimize level = 2, que el compilador busque lo que pueda optimizar, y lo haga, nivel medio de optimización. (también hay O1, O3...), pero hay que tener cuidado con altos niveles de optimización, pues pueden llevar a pérdida de eficiencia si el code no está bien estructurado y completamente definido (uso de statics, inlines y demás).
-G0 <- este no me acuerdo mu bien,
-Wall <- Warning all. que muestre cualquier warning en el output.

CXXFLAGS, configuración de C++
-fno-exceptions <- hacer que el compilador se asegure que los try {} catch, no produzcan excepciones y se hagan bien.
-fno-rtti <-que no genere informacion de cada clase con funciones virtuales.

Si estás haciendo C only, puedes saltarte esas.

Además, aquí en el CFLAGS está muy bien habilitar defines. Por ejemplo yo aquí suelo usar algo como:

CFLAGS = -O2 -G0 -Wall -DPSP -DDEBUG

Entonces dentro del c, ya puedo usar:

#ifdef DEBUG
  printf("Compilación de debug, mostrar algo o hacer algo que en la versión final no estará.");
#endif

#ifdef PSP
 // si programo multiplataforma, esto solo será para psp, pq definí -DPSP en el makefile de PSP.
#endif 

Para compilar de manera final, quitar el -DDEBUG del makefile, y ya no estará definido, y ya no se ejecutará ni compilará el código que haya dentro de los ifs de preprocesador. 


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Al fin

Al fin una persona me ayuda a entender el Makefile :D ya todo me empieza a cobrar sentido con los de la librerías :D... Muy Bien explicado THC_Hack tengo unos proyectos que acabé de hacer desde hace 1 año si quieres te lo doy por MP y me dices :D


 

 

Imagen de User170294

OK, como quieras ;)

OK, como quieras ;)

Imagen de m.rr

Y s quiero escribir en cierta

Y s quiero escribir en cierta x e y, como se haría?

Imagen de User170294

Existe una función en la

Existe una función en la librería pspdebug.h que se llama pspDebugScreenSetXY(int x, int y);

Para escribir un Hola nena en las coordenadas 100 y 100 sería así:

#include <pspkernel.h>
#include <pspdebug.h>
 
PSP_MODULE_INFO ("Hola nena", 0, 1, 1);
PSP_MAIN_THREAD_ATTR (PSP_THREAD_ATTR_USER);
 
int main (int argc, char **argv)
{
    pspDebugScreenInit ();
    pspDebugScreenSetXY (100, 100);
    pspDebugScreenPrintf ("Hola nena");
    sceKernelDelayThread (3*1000*1000);
    sceKernelExitGame ();
    return 0;
}

EDITO: Animate a mandarme un ejercicio ;)


Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.