Palm OS 3.5 开发 -- 第一部分,Palm OS 入门






3.67/5 (6投票s)
Palm OS 开发入门介绍。
|
这是什么? |
请参阅 要点 部分。 |
引言
在本系列文章中,我将演示仍然有用的 Palm OS 3.5 作为开发平台。
什么?Palm OS 3.5?这难道不是过时的技术吗?
是的,但是旧的 Palm 手持设备价格便宜,而且仍然有很多新的和二手的,有 Palm 和竞争对手(如 Handspring、Sony 等)的多种型号,甚至还集成在手机中。这是一个通过开发手持工具来磨练嵌入式平台技能的绝佳平台。
当然,CodeProject 上已经有几篇关于 Palm OS 的入门文章。但是,为了不贬低作者,我觉得有些细节缺失,我打算在本系列中进行阐述。这些文章旨在向读者介绍编码进入 Palm 手持平台所需的基本工具和技术。它们不会涵盖将 Palm 用作最先进的 PDA 来进行个人组织、无线通信和游戏;因为它不是。
我将从初学者级别开始介绍,为读者提供足够的信息让他们开始自己的冒险,然后在下一篇文章中提升到中级水平。例如,我将使用我在 eBay 上以低于 100 美元(含运费)的价格翻新的 Palm IIIc。它配有 HotSync 底座和充电器。我在亚马逊上花了大约 10 美元买了一条 HotSync 串行电缆,该电缆可以直接插入手持设备,无需底座,非常适合连接到移动串行设备。
背景
随着 Palm OS 3.5 的发布,这是第三个主要版本的最后一个版本,Palm OS 平台已具备完整的功能,如:彩色、高分辨率、扩展端口等。这些运行在兼容摩托罗拉 68000 的 Dragonball 芯片上。
下一个主要版本 Palm OS 4.0 随着 Palm m500 系列发布,向下兼容 3.5 应用程序,并增加了一些附加功能,如 SD 卡访问和一些 UI 改进。在 4.0 之后,有 Palm OS 5.0 Garnet 版本,以及后来的 Cobalt 版本。从 5.0+ 开始,Palm 手持设备转向 ARM 处理器,操作系统也进行了大量重新设计。Palm OS 5.0+ 手持设备可以在兼容模式下运行 68K 应用程序。
在这些文章中,选择 Palm OS 3.5 作为最常见的 68K 处理器型号,大多数型号都有足够的内存和 Palm 开发自定义工具所需的基本功能。
技术概述
内存
内置内存各不相同,但大多数型号都有 8 MB。有些会有可以插内存卡的扩展端口。
图形
彩色和黑白 Palm 的标准分辨率为 160x160,高分辨率版本则翻倍至 320x320。黑白 Palm 具有瞬时背光功能,但几乎没用,因为它不会持续亮起。彩色 Palm 是最佳选择,因为即使是第一代 Palm IIIc 也配备了明亮、易于阅读的彩色显示屏。
声音
哔。嘟。
用户界面
Palm 一直以其触摸屏输入创新而闻名,使用了其 Graffiti 符号。Palm 拥有整个显示屏的全触摸分辨率,加上额外的“按钮”和 Graffiti 绘制区域。经过一些练习,您就可以比使用 Pocket PC 风格的触摸键盘更快地用 Graffiti 书写。但是,如果您愿意,也可以选择屏幕键盘进行“点击”输入。
互联性
大多数运行 Palm OS 3.5 或更新版本的 Palm 至少有两个通信端口:红外线和 RS232 串行端口。红外端口通常位于设备顶部,可用于从 HotSync、Palm 到 Palm 的传输到电视遥控器。串行端口可以通过 HotSync 串行电缆或标准底座以常见的传输速度运行。
Palm VIIx 型号内置无线发射器/接收器,通过低带宽蜂窝网络进行通信,当然这需要付费。
一些较新型号集成了蓝牙无线功能。
电池
有些 Palm 使用电池供电,而另一些,如 IIIc,则内置锂离子充电电池。
开始 Palm OS 开发
开发要求
- Palm Desktop 或 Palm OS Conduit Development Kit (CDK)。
- 交叉编译器到 Palm 二进制文件。
- Palm 资源编译器和 PRC 构建工具。
- Palm 手持设备和/或 Palm 模拟器。
Palm Desktop 与 Palm OS CDK
免费下载的 PC 应用程序 Palm Desktop 直接支持手持设备的 PDA 功能,并包含 PC 端 PDA 工具以维护同步数据。当您与 PC 进行 HotSync 时,Palm Desktop 附带的 HotSync Manager 将能够读取 PC 上的同步数据库。除非您想与其他 PIM 软件进行交互,否则无需进行同步。HotSync Manager 是您需要安装编译后的 PRC 和 PDB 文件到 Palm 手持设备上。
现在,如果您打算开发 HotSync conduit,您将需要考虑安装 Palm OS CDK (Conduit Developer Kit)。它提供相同的 HotSync 工具,还附带一些调试功能和 SDK 文档,但没有 Palm Desktop。这是第二部分即将讨论的主题。
您应该选择安装其中一个,因为它们都尝试使用不同的 Palm 主目录进行安装,从而导致用户数据和可执行文件位置的冲突。也许可以共存,但我将其留给读者练习。
开源选项:PRC-Tools
本系列将基于使用开源 PRC-Tools 的 Palm OS 开发。这是一个 Cygwin 附加包,提供适用于摩托罗拉 68000 的 GNU C/C++ 交叉编译器、链接器和调试工具。
注意:如果任何可下载的材料不再可用,请联系我,以便我修复链接或提供其他方式。
首先,安装 Cygwin。默认安装选项即可。
在您的 PC 上创建一个目录,作为所有 Palm OS 开发的根目录。称之为 PalmDev。
从 PalmSource 下载最新可用的适用于 68K 平台的 Palm OS SDK 和 PRC-Tools。注意:您需要免费注册才能访问此链接。下载标有 PRC tools 的其中一个软件包,并将其安装在您的 PalmDev 目录中,以便在 PalmDev 中拥有 SDK-5R3(或任何可用版本)目录。Windows 安装程序 .exe 会提供有用的工具、文档和示例,但不能单独用于 PRC-Tools,因为它面向 Metroworks CodeWarrior 开发环境。
然后,按照 PRC-Tools 网站上的 Cygwin 安装说明进行操作。确保下载所有与 Palm OS 相关的软件包,完成创建 PalmDev 树的步骤,然后使用 PalmDev-prep 初始化 SDK。
POSE:Palm OS 模拟器
在不耗尽 Palm 电池的情况下,POSE 可能是测试和调试代码的最佳工具。
安装 POSE 时,请务必同时获取皮肤。默认情况下,您不会获得运行模拟器的 ROM 映像。您可以从 PalmSource 获取通用 ROM。或者,您可以使用 POSE 附带的 _ROM Transfer.prc_ 工具下载您设备的 ROM。
使用 POSE 进行调试
GNU Debugger
PRC-Tools 包含 GNU 调试器,它通过 POSE 运行得同样好。它简洁、丑陋,但它有效。
一旦您使用调试选项(GCC 中的 -g 选项)构建了 PRC,就通过拖放将 PRC 安装到 POSE 中。然后在您的 bash shell 中键入此命令
$ m68k-palmos-gdb helloworld
(gdb) target palmos
Remote debugging under PalmOS using localhost:2000
Waiting... (Press Ctrl-C to connect to halted machine)
注意:您需要指定编译后的二进制文件,不带 .prc 扩展名。
现在,_gdb_ 正在等待 POSE。在 POSE 中执行应用程序,_gdb_ 将启动并开始调试。
POSE 调试选项
POSE 本身提供了许多调试选项。默认情况下,当应用程序尝试访问坏指针时,POSE 会发出警告。通过右键单击 POSE 并单击“设置 -> 调试...”来查看所有选项。
PalmSource 提供下载 Palm OS 调试 ROM 的选项。这些 ROM 提供了额外的检测功能,通过向用户发出发布 ROM 不会发出的某些警告,或者在某些情况下用不同颜色突出显示显示屏以指示控件边界。
Palm 上的 Hello World
helloworld.c:
#include <PalmOS.h>
#include "resource.h"
Boolean appHandleEvent(EventType *e);
Boolean mainFormHandleEvent(EventType *e);
FormType *mainForm; /* Form handle to mainForm */
/* Program entry point */
UInt32 PilotMain(UInt16 cmd, void *cmdPBP, UInt16 launchFlags) {
EventType event;
UInt16 err;
switch (cmd) {
case sysAppLaunchCmdNormalLaunch:
FrmGotoForm(mainFormId); /* Start mainForm on app startup */
do { /* Event pump */
EvtGetEvent(&event, evtWaitForever);
if (!SysHandleEvent(&event) &&
!MenuHandleEvent(NULL, &event, &err) &&
!appHandleEvent(&event)) {
FrmDispatchEvent(&event);
}
} while (event.eType != appStopEvent);
FrmCloseAllForms();
break;
}
return(0);
}
/* Application event handler */
Boolean appHandleEvent(EventType *e) {
switch (e->eType) {
case frmLoadEvent:
/* Load form */
switch (e->data.frmLoad.formID) {
case mainFormId:
/* Set event handler for mainForm, then make it active */
mainForm = FrmInitForm(e->data.frmLoad.formID);
FrmSetEventHandler(mainForm, mainFormHandleEvent);
FrmSetActiveForm(mainForm);
break;
}
break;
case frmOpenEvent:
switch (e->data.frmOpen.formID) {
case mainFormId:
FrmDrawForm(mainForm);
break;
}
break;
default:
break;
}
return(false);
}
/* mainForm event handler */
Boolean mainFormHandleEvent(EventType *e) {
switch (e->eType) {
case frmOpenEvent:
FrmDrawForm(mainForm);
return(true);
default:
break;
}
return(false);
}
helloworld.rcp:
#include "resource.h" version "1.0" /* Main form */ form id mainFormId at (0 0 160 160) begin title "Hello World" label "Hello World" id helloLabelId at (center center) end
在 Cygwin bash shell 中,运行 _make_ 来构建 _helloworld.prc_。
$ make
m68k-palmos-gcc -O2 -Wall -g -c -o helloworld.o helloworld.c
m68k-palmos-gcc -O2 -Wall -g -o helloworld helloworld.o
pilrc -q -allowEditID -ro -o helloworld.ro helloworld.rcp
build-prc -n helloworld -c helo helloworld helloworld.ro
构建完成后,您可以将 _helloworld.prc_ 加载到您的 Palm 中。通常,您可以通过在 Explorer 中双击 .prc 文件来完成,它将运行 Palm Installer。在下一次 HotSync 时,将加载 .prc 文件。完成后,您应该能够找到新应用程序
Palm 应用程序基础
创建者 ID
每个应用程序都必须有一个唯一的创建者 ID,一个四字符的字母数字字符串。此 ID 也存储在应用程序数据库中,用于标识它所属的应用程序。使用一个不与其他任何人冲突的唯一创建者 ID 非常重要,以防止冲突。因此,检查 创建者 ID 注册非常重要。
内存分配
Palm OS 内存分配的一个特殊之处在于,内存是以“块”的形式使用 Palm OS API 分配的,而不是使用 _malloc()_。块被分配为可移动或不可移动。不可移动块使用 _MemPtrNew()_ 创建,其工作方式类似于 _malloc()_,因为它返回一个可用的内存指针。但是,使用 _MemHandleNew()_ 分配的可移动块具有让操作系统移动内存块以进行优化的优点。当您想访问块时,您使用 _MemHandleLock()_ 来获取可用的内存指针。在锁定期间,块会暂时变得不可移动。
有关内存架构的更多详细信息,请参阅 Palm OS Programmer's Companion,卷 I。
事件处理
与 Windows API 类似,Palm 应用程序将包含一个事件循环,类似于 Windows 的消息循环。事件循环包含一个系统事件处理程序、菜单事件处理程序和应用程序事件处理程序。如果没有这些处理程序捕获事件,它将转到 _FrmDispatchEvent()_,该函数会将事件发送到当前窗体的处理程序。
数据存储
数据以文件的形式存储,但底层机制是数据库。每个数据库包含任意数量的记录,记录包含一个 ID 和一个内存块。应用程序负责将内存块分解为可用的字段。
Palm OS 3.5 只支持一种数据库类型:Classic。SDK 可能会描述扩展和模式数据库类型,但这些仅在 Palm OS 5.0+ 上受支持。
您可以使用免费的 Filez 工具来浏览和编辑手持设备上的文件结构。
结论
现在您已经掌握了开始编写 Palm 手持设备的知识和资源。Palm 网站上的出色文档解释了任何 Palm 型号的软件和硬件组件的所有细节。
在下一部分,我将介绍 HotSync conduit 平台,用于将您的 Palm 数据与 PC 连接。
参考文献
- Palm Desktop
- Palm OS SDK (需要免费注册)。
- Cygwin.
- PRC-Tools 网站.
- PilRC 网站.
注意:您可以在 _/usr/share/doc/pilrc-3.2_(通过 Cygwin 安装)或 _c:\cygwin\usr\share\doc\pilrc-3.2_(通过 Windows 安装)中找到 PilRC 的参考文档。
- POSE:Palm OS 模拟器.
- Palm OS SDK 文档:程序员手册和参考手册最有价值,也请查看用户界面指南。
- Palm OS 技术邮件列表。
- 创建者 ID 注册:确保您的 ID 是唯一的。
- “Palm OS Programming: The Developer's Guide” 作者:Neil Rhodes 和 Julie McKeehan,O'Reilly,ISBN 1-56592-856-3。
关注点
一个关于 Palm 巧妙用途的绝佳示例是 Dmitry Yurtaev 的 MMCd Datalogger,这是一个开源项目,使用 Palm 手持设备记录 OBDII 之前的 Mitsubishi 汽车的诊断数据。本文顶部的截图展示了该工具。我为我的 1991 Mitsubishi Galant VR-4 使用此工具。
历史
- 2005.12.19:已发布。