Palm os “中的多段PalmOS应用程序/库”;背景“;

Palm os “中的多段PalmOS应用程序/库”;背景“;,palm-os,garnet-os,Palm Os,Garnet Os,我遇到的问题是:当使用sysAppLaunchCmdNormalLaunch以外的启动代码运行我的应用程序时,我不能使用默认代码段之外的代码-但我是否可以使用多段的共享库,从而避免此问题 一点背景信息:我正在评估将现有移动应用程序移植到PalmOS的可能性。该应用程序的一个核心部分是,它每隔10分钟左右在后台进行一次网络通信,或者在接收到传入数据时(通过网络/套接字回调)。在这段时间内,我无法访问全局变量,因此除了默认的代码段之外,我的应用程序中没有任何代码段 现在的问题是,通信中涉及的操作(协

我遇到的问题是:当使用sysAppLaunchCmdNormalLaunch以外的启动代码运行我的应用程序时,我不能使用默认代码段之外的代码-但我是否可以使用多段的共享库,从而避免此问题

一点背景信息:我正在评估将现有移动应用程序移植到PalmOS的可能性。该应用程序的一个核心部分是,它每隔10分钟左右在后台进行一次网络通信,或者在接收到传入数据时(通过网络/套接字回调)。在这段时间内,我无法访问全局变量,因此除了默认的代码段之外,我的应用程序中没有任何代码段

现在的问题是,通信中涉及的操作(协议、数据处理等)需要大量的代码,这些代码不适合一个段。除了让那么多代码在“后台”运行是否有意义的问题之外,显而易见的问题是:我首先应该如何运行它?因此,将代码放在共享(多段)库中是否会有所帮助


期待您的见解。

我没有使用共享库的经验,但我们的软件遇到了这个问题,我们遇到了三种不同的方法来解决这个问题

可能最简单的方法是在使用Metrowerks编译器时启用扩展模式,但我不能完全确定这是否有效。此特殊模式允许您在从非全局启动调用时访问某些恒定全局数据。然而,使用这种方法有很多警告。此外,我还没有确定扩展模式是否允许段间跳转。有一份由Ben Combee撰写的白皮书详细解释了如何使用扩展模式。它的标题是“在Palm操作系统上支持扩展模式”。我在网上找不到它,所以我在我的网站上贴了一份:

另一个更复杂的选择是自己加载全局变量,并在A5中放置指向它们的指针。为此,必须修改(或复制)加载全局的Metrowerks启动代码,然后在收到非全局启动时调用此修改后的代码。Metrowerks包含了运行时这一部分的完整源代码,因此您可以非常轻松地完成这项工作,尽管其中一些代码相当神秘。我们在Pocket Tunes的一个版本中成功地使用了这种技术,当从非全局启动代码调用时,可以访问全局和无限数量的段。只要确保从启动代码返回时恢复A5即可


最后一个选项是将所有(或部分)代码移动到pnolet中。这可能是一种痛苦,因为您必须将代码分为68K和PNO,这很快就会成为维护的噩梦。我们也成功地使用了这种方法,但是对互通代码的维护非常糟糕。最后,我们使用PEAL加载程序将整个代码移动到PNOlet,这对于大型代码非常有效,因为它会自动将代码分割成64KB的块,并在适当的位置运行ARM代码。然而,这是一项非常大的工作,因为PNOlet开发在ARM上没有得到很好的支持,所以您必须自己提供大量的底层支持(比如thunks来调用每个API函数)。

使用FtrSet在Ftr内存中存储一个指向使用MemPtr分配的漂亮大型结构的指针。这可以在应用程序中需要使用FtrGet进行全局访问的任何位置检索

或者使用
\uuuu STANDALONE\ucode\uu RESOURCE\uuuu
将每个函数放入一个单独的代码段,并使用一个带有包装器的共享函数.c加载并锁定到内存中以调用它们

//segment 1000

UInt32 foobar( char* hi )
{
   return 12;
}

// functions.c
typedef (UInt32)(*fooPtr)( char* ); // this is now a type representing a pointer to your function.
UInt32 foobar( char* hi )
{
   LocalID id; UInt16 cn; SysCurAppDatabase(&cn,&id);
   DmOpenRef ref = DmOpenDatabase (cn, id, dmModeReadOnly );
   MemHandle H = DmGetResource('code',1000);
   fooPtr code = MemHandleLock(H);
   UInt32 result = (*fooPtr)( hi);

   return result;
}

谢谢你的深刻见解。我曾考虑过使用PNOlets,但不幸的是,这个项目的时间限制太紧,无法进行大量实验。然而,PEAL看起来很有趣!我还打算使用PODS(或gcc),所以CW的扩展模式可能对我没有帮助;-)回答得好,蒂姆。。。比我写的还要好!完成后你需要解锁把手,哦,顺便说一下。MemHandleUnlock(H);