2

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

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

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

期待您的见解。

4

2 回答 2

2

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

可能最简单的方法是在使用 Metrowerks 编译器时启用扩展模式,但我不完全确定这是否有效。这种特殊模式允许您在从非全局启动调用时访问某些常量全局数据。但是,使用这种方法有很多注意事项。此外,我还没有确认扩展模式肯定允许段间跳转。Ben Combee 写的白皮书详细解释了如何使用扩展模式。它的标题是“支持 Palm OS 上的扩展模式”。我在网上找不到它,所以我在我的网站上放了一份副本:http ://www.normsoft.com/tim/technical/Codewarrior_Expanded_Mode.pdf

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

最后的选择是将所有(或部分)代码移入 PNOlets。这可能会很痛苦,因为您必须将代码分割成 68K 和 PNO,这很快就会成为维护的噩梦。我们也成功地使用了这种方法,但是交互代码的维护很糟糕。我们最终使用 PEAL 加载程序将整个代码移动到 PNOlet,这对于大型代码非常有效,因为它会自动将代码分割成 64KB 的块并就地运行 ARM 代码。但是,这是一项非常大的工作,因为 PNOlet 开发在 ARM 上没有得到很好的支持,因此您必须自己提供很多低级支持(例如调用每个 API 函数的 thunk)。

于 2008-10-12T12:26:05.013 回答
1

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

交替使用__STANDALONE_CODE_RESOURCE__将每个函数放入单独的代码段,并使用带有包装器的共享函数.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;
}
于 2009-05-26T21:34:23.543 回答