文档章节

PSP开发简明教程(3)

龙之田
 龙之田
发布于 2014/05/01 00:14
字数 2076
阅读 1072
收藏 6
点赞 0
评论 0

#PSP开发简明教程(3)

##开头

上一篇文章说明了如何搭建PSP软件的开发环境,这一篇将大概讲一下关于程序开发的问题。主要会讲到Makefile中各项参数的含义,并说明一下代码的框架。

其实这部分内容我也是看别人的文章学来的(参考文献在文章末尾),并没有研究的太深,所以如果有说的不大明白的地方,还请见谅!

##Makefile

之前说过,PSP自制软件使用Makefile进行构建,所以这里对Makefile中的各项做个简单的说明。

下面就给出一个Makefile的示例

#目标文件
TARGET = hello_world

OBJS   = main.o

INCDIR   =
CFLAGS   = -G0 -Wall -O2
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS  = $(CFLAGS)
 
LIBDIR  =
LDFLAGS =
 
#是否构建PRX
BUILD_PRX = 1 

#生成文件名(不可改动)
EXTRA_TARGETS   = EBOOT.PBP

#软件名称
PSP_EBOOT_TITLE = Hello World
#软件图标(144*80)
PSP_EBOOT_ICON= ICON0.png
#软件背景(480*272)
PSP_EBOOT_PIC1= PIC1.png
#软件背景音乐(AT3格式)
PSP_EBOOT_SND0= SND0.at3

#PSPSDK路径
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

可以看出来Makefile还能够为我们的自制程序添加背景,图标和背景音乐等功能。

需要注意的是,BUILD_PRX=1最好不要省略,如果省略的话,会只生成静态可执行文件。按照其它教程的说法,这样做的话,程序的兼容性不大好。

还有一点要注意的就是,PRX其实有两种解释,一种解释是PRX类似于后台程序,金手指就算这种类型的程序。他不能够直接运行,需要依赖系统或者其他可执行程序才可以用。通常被放在记忆棒的seplugins目录下。

另一种就是我们上面说的,有点类似于内部链接库的东西,程序在执行时需要调用它。

##样例程序

#include <pspkernel.h>
#include <pspdebug.h>

//程序相关的信息,依次是程序名称、运行模式、主版本号,次版本号
PSP_MODULE_INFO("Hello World", PSP_MODULE_USER, 1, 0);

//定义主线程的属性
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER); 
PSP_HEAP_SIZE_MAX();

//为了使用方便,将pspDebugScreenPrintf定义为printf,用法也和printf一样。
#define printf	pspDebugScreenPrintf

int done = 0;

///////////////////////////////////////////////////////////////

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
	done = 1;
	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(void)
{
	//初始化DebugScreen,这样就可以在屏幕上显示了
	pspDebugScreenInit();
	
	//创建线程监听用户行为,为了能够退出程序
	SetupCallbacks();

	//主循环体,用户退出时,done会变为1,循环退出
	while(!done)
	{
		pspDebugScreenSetXY(0, 0);
		printf("Hello World!\n");
		printf("Test by Max");
		sceDisplayWaitVblankStart();
	}
	
	//彻底退出
	sceKernelExitGame();	
	
	return 0;
}

这里给出一个简单的Hello World程序做代码框架解释。乍看挺乱的,但逻辑上并不复杂。

被斜杠框住的一大堆函数,实现的功能就是我们按下Home键的时候,能够退出程序。如果看不懂的话(比如说我=_=),可以暂时略过。其它的程序里面按照这个写也没有大的问题。

主函数一目了然,先初始化显示,创建线程监听用户操作,然后进入主循环体循环。

整个程序的结构大致就是这样。

大家可以尝试按照上一篇文章所讲的方法,构建出Hello World程序。

不过要注意的是,因为我们在Makefile里面定义了图标,背景等,所以需要在工程文件夹下面放置符合要求的图片和音乐文件,才能保证编译通过。如果实在懒得弄,也可以直接删掉这几行命令。

运行效果(使用CMF截图):

小图标

(小图标)

背景图片

(背景图片)

运行效果

(运行效果)

对于程序的说明就到这里吧。个人水平实在是有限。

如果想要写一些真正能用的东西,下面这些资料可以做参考。

##参考文档、论坛

我找了半天也没找到官方出的开发文档。但是在MINPSPW文件夹下发现了官方的编程参考手册。

PSP编程参考手册(由Doxygen生成)

(MinPSPW安装位置)\doc\pspsdk\index.html

这个手册是SDK作者用Doxygen生成的,是网页版本的。

里面有对函数的说明,和函数参数的格式等等,不过说的不是很细。光看这个我感觉还是不清楚每个模块该如何使用。

但是我在其它地方发现了两个PSP开发的入门教程、wiki,我的文章也参照这两份教程。

PSP Programming(WIKIBOOKS)

linuxgraphics psp专栏(刘鹏)

第二个博客里面讲的PSP破解史比我说的详细的多,推荐大家看看

这两份教程讲的都比较浅,和我说的差不了多少。

这里有一篇博客文章,是讲程序结构的,说的比我详细些,我的说明也参考了它。

我也玩PSP开发!(2)—— PSPSDK示例 源码分析

最后是ps2dev论坛,准确的说应该是论坛镜像,因为ps2dev已经不在了。这个镜像里面保存了论坛到2010年的所有帖子。我大概翻过一些,还是有些有意义的东西的。大家如果想深入开发的话,建议多翻翻这里的旧帖子。

http://lukasz.dk/mirror/forums.ps2dev.org

其实在谷歌里还能搜索到其它的PSP教程,不过质量参差不齐。这里就不再多推荐了。

##关于示例程序

虽然没有好的教程可供学习,但是官方的示例程序还是有的。在minpspw中有很多示例程序可供参考,种类繁多。从usb、红外(这个2000系列之后没有了)、MP3播放,到wifi,adhoc等网络相关的示例程序都有。

但问题是这些示例程序不少已经不能使用了。因为它们大部分都是在06-08年间写的,都是1.50固件时代的东西。不少程序在最新的6.60版本固件上基本上没法运行,甚至在M33的固件上都不能。

我一共尝试过三个示例,一个是按键检测示例(就是在上篇教程里使用的那个),一个是MP3播放,还有一个就是wlan_scan。这三个程序,第一个可以正常运行,第二个如果MP3文件的ID3信息中不包含中文,则可以运行。至于第三个程序,则完全运行不了,至于原因,有两个可能,一个就是因为它是1.50固件时代的产物,已经无法在新版本固件上使用了;还有一种可就是,我对程序的理解有问题。例程所需的一些文件(比如说PRX)没有提供。我在上面说的那个论坛镜像上找到了两篇关于网络编程的讨论,但是看不大懂。这里我把链接给大家,看博客的人肯定比有我知识经验丰富的,或许可以明白问题究竟出在哪里=。=

wlan "simple" sample for 3.xx (simple_prx)

Wi-Fi in User Mode

##总结

至此,整个PSP开发简明教程就完结了。

我写这个也不是想说,PSP其实还大有可为。虽然PSP的功能很强大,但是个人开发十分的困难,而且没有官方的支持(我真的很佩服当年搞PSP破解和自制软件开发的人)。

加上现在有了手机这种比PSP适用范围更广,更便宜,而且开发还简单的东西,PSP实际上已经可以入住博物馆了……

所以我只是想让大家多了解下它,毕竟PSP的破解很有代表性,研究它或许对我们以后从事类似的工作有一定的帮助。

本文MarkDown源文件和提到的示例程序源代码,可以在我的Github上获取。

Github地址:https://github.com/flymaxty/OSChina_Blog

© 著作权归作者所有

共有 人打赏支持
龙之田
粉丝 4
博文 5
码字总数 6368
作品 0
海淀
程序员
PSP开发简明教程(1)

PSP开发简明教程(1) PSP游戏机 PSP,即PlayStation Portable。是索尼于2004年12月12日发售的掌上型游戏机。 它采用4.3寸16:9比例、背光全透式的夏普ASV超广可视角液晶屏幕,屏幕分辨率达到...

龙之田 ⋅ 2014/04/27 ⋅ 4

PSP开发简明教程(2)

PSP开发简明教程(2) 开头 接着上文,这篇文章将具体说明如何搭建PSP开发环境。因为我是刚开始写教程类文章,加上对这一类型的程序开发不是很了解,所以文章可能有说的不明白,甚至错误的地...

龙之田 ⋅ 2014/04/29 ⋅ 3

Python学习资料篇

Python学习资料网络上比较多,看到好的资源,不及时记录下来,下次就找不到了,我把知乎上好的回到收藏汇总到这里,以便自己随时查看,包括Python入门书籍,网站,项目,官方文档,下载资源等...

BjarneCpp ⋅ 2017/12/03 ⋅ 0

49个python经典电子书

49个python经典电子书 本文转自:http://blog.sina.com.cn/s/blog_5bce66f00102vgqv.html

天意1 ⋅ 2016/01/20 ⋅ 0

我的友情链接

51CTO博客开发 马哥教育 itnihao的运维技术博客 虚拟的现实 实践检验真理 运维笔记 斩月 峰云,就她了。 Linux SA John 聆听未来 linux&python my life for my wife 吟—技术交流 滴水穿石孙...

xiaofengge315 ⋅ 2017/11/22 ⋅ 0

python操作数据库基础知识

python是如何访问数据库的,通过数据库接口DB-API,他是阐明一系列所需对象和数据库访问机制的标准,它可以为不同的数据库适配器和底层数据库系统提供一致性的访问。 为实现对数据库的访问,...

Wantobetter ⋅ 01/03 ⋅ 0

OpenBoR

OpenBoR 是一个2D横版过关游戏开发引擎,国外制多了超级多的同人横版过关游戏。PSP OpenBoR 就是这个引擎的PSP平台移植版,让你也可以在PSP上玩到这些外国玩家自己开发的2D清版动作游戏。 使...

匿名 ⋅ 2008/11/11 ⋅ 0

推荐:深入浅出的自然语言处理书单!

DT时代,大数据、BI和人工智能均是十分火热的产业趋势,而自然语言处理作为人工智能领域和计算机科学领域中的一个重要方向,也随之火热了一把,得到不少IT人士的极大研究兴趣。现在,大圣众包...

大圣众包 ⋅ 2017/01/06 ⋅ 0

好久不见,我总感觉欠你点什么

好久不见,后台有收到朋友留言,问前端周刊是不是不做了?实际上不是,我在酝酿更好的内容提供形式!经过两个月的精心准备,很高兴跟大家宣布:我又回来了,并且给关注前端周刊的同学准备了礼...

王仕军 ⋅ 2017/10/23 ⋅ 0

开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技 ⋅ 2017/12/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 19分钟前 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 52分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 55分钟前 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 59分钟前 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部