您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 嵌入式开发 > 正文
·速成电脑精英(包分配)白领高薪一族从这里开始



-Java套接字编程(下)
-MediaStudio Pro 6.5教程
-三款卸载软件最新试用
-基于Visual C++的Winsock API研究

Palm OS 3.5重要系统错误
2001-07-24· ·中文··yesky


  目前,一些开发者在Palm OS 3.5版本的系统平台上测试他们的应用软件时,发现了一些问题。本文将在这里讨论一下其中的一些具有共性的问题。尤其是在使用具有调试功能的ROM(debug-enabled ROMs)时。下面的列表里将列举那些经常遇到的问题,以及导致问题出现的原因。

  必须指出的是,其中的很多问题仅仅是在使用具有调试功能的ROM(debug-enabled ROMs)时才出现,在用户掌上设备自带的不具备调试功能的ROM(non-debug)中并不存在这种问题。这样做的用意是:具有调试功能的ROM能够发现那些在某些普通的掌上设备中很难被意识到的问题。如果开发者能在软件的调试过程中充分重视那些由调试功能ROM提供的错误代码的话,您的软件将在不同的新老版本的掌上设备中获得最好的可靠性,同是也能保证对未来发布的所有操作系统版本和新的硬件设备的最好的兼容性。

  如果您想获得更多的关于这些重要问题,以及相类似问题的信息的话,您可以通过邮件或者新闻组的形式加入developer forums开发者论坛的相应讨论区。

  为了获得更多的关于Palm OS 3.5版本操作系统的信息,请访问Documentation页面。

  1

问题症状: 当在CodeWarrior中开始一个调试进程时,马上出现下列致命警告信息:"DataMgr.c, Records left locked in closed unprotected DB",而此时软件还没有开始运行。
  原因: 没有通过一种完全可靠的方式来设置调试器的第一个断点。新发布的基于3.5版本SDK的调试器已经解决了这个问题。
解决方案: 将您的调试器升级到Palm OS 3.5 SDK版本;或者在出现警告时,直接点击"Continue"继续。
附加说明: 该警告信息只会在使用调试功能ROM时出现。但是还有其他非调试器的原因也会造成类似警告信息的出现。

  2

问题症状: 当您的软件在推出或者关闭它的一个database时,马上出现下列致命警告信息:"DataMgr.c, Records left locked in closed unprotected DB"。
原因: 就像警告信息说的那样,当database被关闭时,相应的记录和资源并没有解锁。此时,如果一个软件继续读写该记录或者资源的数据的话,有可能另外一个软件会删除该database,从而造成指针失效,甚至指针被锁死。
此外,另一个应用软件可能会以改写的权限打开该数据库,删除记录,同样因此指针错误。
解决方案: 如果在某一个database被关闭之后,确实还要使用到其中的记录和资源的话,您可以使用DmDatabaseProtect()函数来保护该database不会被删除。不过,对于任何情况下都适用的正确做法应该是每次关闭某个database时,马上就将相应的记录解锁。这样同时还可以起到减少内存存储碎片的作用。
附加说明: 该警告信息一般只会在使用调试功能ROM的情况下出现,但是该警告信息中潜在的问题可能在任何种类的ROM中出现。

  3

问题症状: 当开发一个"hack",并且在HackMaster 0.9.x版本上运行时,马上出现下列致命警告信息:"DataMgr.c, Records left locked in closed unprotected DB"。
原因: HackMaster能够锁定一个hack的代码区段,但是不能保护这个hack的database不会被删除。这就意味着,用户可能会删除了一个正在运行的hack,或者载入了一个新的hack覆盖了原来正在运行的那个,此时,系统极有可能崩溃。
解决方案: 这是当前的HackMaster自身的一个缺陷,必须通过以后发布的新版本的HackMaster调用DmDatabaseProtect()函数来解决。这样才能够使一个hack能够保护自己的database,以便防止该问题的出现。
附加说明: 该警告信息一般只会在使用调试功能ROM的情况下出现,但是该警告信息中潜在的问题可能在任何种类的ROM中出现。
同时,还有其他的非HackMaster的故障也可能造成该警告信息的出现。尽管HackMaster不是Palm公司的产品,但是由于适用它的用户很多,因此,我们在这里通知用户们,有关HackMaster可能因此的系统崩溃信息。

  4

问题症状: 当用户关闭一个软件时,出现“SystemMgr.c, Possible memory leak at 0x000xxxxx...Use the 'hd 0' command to find chunks owned by your app. These chunks have an ownerID of 2”警告信息。
原因: 当您的软件退出时,并没有将所有曾经占用的内存空间释放。
解决方案: 在程序退出时,释放所有的内存空间。此时常常发生的疏忽,就是在使用AppStop函数结束程序运行时,忘记调用一下FrmCloseAllForms()函数来释放所有的存储空间。(甚至在3.5版本以前的SDK的Starter工程中也有这个问题。)。Palm OS系统本身的确能够在程序被关闭时,自动释放动态堆栈中所有的被程序占用的存储空间。但是这个功能能否正常实现,在很大程度上取决于被遗漏的是何种内存,其大小,以及是否时累积调用。而且,您的程序本身也可能存在一个潜在的严重漏洞需要排除。

同时,一定要使用在调试控制台窗口中的'hd 0'命令来检查动态堆栈,以及被该警告信息提出的那些存储空间的内容。或者使用标准的调试技术来发现那些“内存漏斗”(memory leaks)。在任何类型的计算机何任何形式的应用软件上,“内存漏斗”都是一种很常见的缺陷。
附加说明: 本信息只会在使用调试功能ROM时出现,但是内存漏斗问题可能在任何种类的ROM工作时出现。

  5

问题症状: 出现下列致命警告信息:"Form.c, Form must be full width"或者"Form.c, Form must be bottom justified"。
原因: 和最顶端(topmost)的窗体不同,普通的窗体必须以屏幕的全宽度显示。调试功能的ROM在向屏幕上移动一个窗体时,都会进行这项检查(在FrmEraseForm中)。
解决方案: 将窗体设置为全屏幕宽度。如果该窗体有边框的话,请注意将窗体的起始坐标设为1或者2,而且最大宽度要小于160。
附加说明: 该警告信息只会在使用调试功能ROM时出现。
有时,一个弹出菜单,或者警告框事件也会导致系统产生这种警告信息。

  6

问题症状: 出现下列致命警告信息:"Form.c, Windows cannot be under forms because they can't be redrawn"。
原因: 如果一个窗口(windows)出现在一个窗体(form)的下面,那么当窗体关闭时,窗口管理器将无法刷新该窗口。如果其他的窗体没有保存这个窗口的内容,则将导致在屏幕上出现一个不正确的空白区域,使用户感到疑惑。
解决方案: 修改使用窗体的程序,是的一个frmUpdateEvent事件能够被发送到窗体事件的处理器那里,以便于在必要的时候刷新窗体。或者,在另外一个窗体将要出现在一个窗口上面之前,实现关闭窗口。
附加说明: 该警告信息只会在使用调试功能ROM的时候出现,但是其他的ROM也可能引起窗口不刷新的问题。
有时,一个弹出菜单,或者警告框事件也会导致系统产生这种警告信息。

  7

问题症状: 软件在绘制一个新的窗体,尤其是启动,或者切换到新的窗体时,突然崩溃。
原因: 在使用调试功能的ROM时,如果创建了一个不正确的窗口,或者指派了一个不应该的窗口有效,则窗体绘制程序就会导致一个总线错误。这样的机制能够帮助开发者发现它们软件中前后衔接不正确,或者不必要的窗口创建过程。
解决方案: 在绘制一个窗体之前,一定要首先调用FrmDrawForm函数来创建该窗体的背景,并且声明该窗体为当前被激活的窗体。
附加说明: 在已经发布的一些版本的ROM中,当当前没有被激活的窗口时,绘制程序往往在主(ROOT)窗口直接进行写屏。尽管者往往是一种故意设计的有目的的行为,用于实现一些特殊的效果。但是严格按照系统的要求,规规矩矩地进行绘制才是开发人员应该做的。

  8

问题症状: 当一个对话框关闭时,屏幕该区域出现了空白,或者对话框的像素没有完全被清除。
原因: 关于这种情况的最大的可能性是frmUpdateEvent事件并没有被正确地执行。一般情况下,当一个窗体句柄收到一个frmUpdateEvent事件时,软件应当确保调用了一个FrmDrawForm函数,并且在标准窗体对象(如gadget内容)没有填充的区域绘制相应的内容。
解决方案: 在frmUpdateEvent事件处理程序中增加一格句柄处理器,用于调用FrmDrawForm,并且完成所有必要的写屏过程。然后返回一个正确的标志,显示它已经完成了所有的必要工作。
附加说明: 许多弹出窗口和窗体在它们失去“焦点”变灰之前,都会设定一个“saveBehind”位,来通知系统保存当前屏幕上的内容。但是,如果系统当前可用的存储空间不足以用来保存屏幕内容的话,它就会在某变灰的窗体被关闭之前,向窗体发出一个frmUpdateEvent事件。为了保证软件正确的响应了这个刷新屏幕的事件,具有调试功能的ROM就会用一个更小的存储空间保存当前屏幕状态,但是不会还原这个状态,然后发送该frmUpdateEvent事件。

  9

问题症状: 软件不能在彩色显示模式的设备上工作,或者启动的时候就死机。
原因: 如果软件直接对屏幕的显示信息做了设定,或者说直接对Dragonball LCD控制器芯片的相应管脚做了操作,则该软件将几乎不可能在彩色模式,或者未来的新型号的设备上正常工作。
解决方案: 使用相应的API来测试硬件、显示、操作系统的相关的兼容性和支持性信息,然后在决定是否要在这些设备上运行您的软件。同时,在特征管理器(feature manager)中也提供了一些用于检测硬件以及系统显示信息的函数(见 sysFtrNumProcessorID, sysFtrNumHwrMiscFlags, HwrMiscFlags.h等),同时WinScreenMode和WinGetBitmap也能够提供非常有用的信息。
附加说明: 并不是所有的掌上设备都必须使用到Dragonball芯片上的LCD显示控制器。

  10

问题症状: 当启动一个软件时,屏幕变成黑色(在彩色显示模式下也可能是黄色)。并且这些区域有可能在程序运行时继续留在屏幕上。
原因: 这是在调试功能ROM中附加的一个对调试有用的设置。当某些不正常的显示内容没有被清除时,系统就会用一种很特殊的色彩显示那些区域,以提醒开发者您的软件并没有将无用的显示内容完全清除
解决方案: 如果在屏幕上没有任何不正常的色彩,就说明当前的软件运行的比较正确。如果有某些不正常色彩存在的话,则请修改您的程序,来彻底清除不正确的显示内容。
附加说明: 只有在使用调试功能的ROM时才会出现这种情况。

  11

问题症状: 一些警告用按钮的尺寸会比3.5版本以前的Palm OS系统环境下的要大。
原因: 当调用FrmAlert, FrmCustomAlert 或者 FrmCustomResponseAlert函数来生成警告用按钮时,系统总是会重新调整按钮的尺寸来配合按钮上的文本字数,同时还要加上一个小边距。同时,在3.5版本的系统中,还要强行限制一个不能小于36像素的限制,以便于保证外观显示效果。(如果当前没有足够的显示空间的话,就不会进行这种按钮尺寸的扩展。)
解决方案: 这并不是一个缺陷;这样做的用意是让用户能够更方便的用触摸笔区点击这个按钮。
   

  12
问题症状: 系统本身自带的剪切、复制、粘贴按钮能够在3.5版本系统的命令条上正常显示,但是当点击它们的时候没有产生任何操作。
原因: 您的软件可能错误的告诉系统,它已经处理了这些命令条事件。如果应用软件的事件处理程序总是向系统菜单事件返回TRUE,而事件处理程序本身并就没有处理该事件的话,则系统便不会对这些按钮做出任何的操作。(这3个按钮发送的菜单事件的识别号都是大于或等于10000的,这也是系统自己保留的范围。)
解决方案: 只有在您的程序已经完全处理了这些事件,并且不希望系统自己去产生操作时,才返回TRUE。
附加说明: 如果您想您的软件自己来处理这三个按钮的操作的话,您可以通过menuCmdBarOpenEvent事件将您自己的按钮放置到命令条中去,或者直接自己去处理识别号为10000 到 10003 的系统命令事件。(包含了sysEditMenuUndoCmd 和 sysEditMenuPasteCmd。)

  13

问题症状: 当屏幕采用8位显示模式,或者使用了彩色位图时,软件运行出现内存溢出。
原因: 彩色的位图使用的存储空间是黑白图片的8倍。因此,软件使用彩色位图时处理的内存将远远超过以前处理黑白图片。
解决方案: 在程序设计上对内存的控制多加注意,或者在必须使用彩色位图时,采用分割的办法。
附加说明: 用于在动态堆栈中的最大分配空间仍然是64K,所以,使用太大的彩色位图是不可能的。

  14

问题症状: CodeWarrior出现编辑错误:“the file 'Us.Prefix.h' cannot be opened...”
原因: 该工程需要一个在新的SDK中不存在的老文件。
解决方案: 进入您的工程的“C/C++ Language”设置面板。在底部,您会看到一个“Prefix file”条目。删除涉及Us.Prefix.h的内容,一切都会恢复正常。

  15

问题症状: 软件在本来应该显示美元符号“$”的地方显示了两个方块。
原因: 软件直接去解析"cnty"资源了。这是一个系统自身的资源,它的格式使可以被改变的(并且已经改变了)。
解决方案: 不要这样做。当前的操作系统没有API可以用来确定一个特定国家的符号。
附加说明: 系统内置的软件能够直接去访问cnty资源。但是对于其他用户自己的软件来说,这样直接访问cnty资源是不可靠的。

  16

问题症状: 点击标题栏时,没有出现菜单。
原因: 软件截取了手写笔的点击事件。或者软件不允许系统来处理frmTitleSelectEvent事件。
解决方案: 允许手写笔的点击事件,并且允许系统处理该事件。或者修改程序,来监控frmTitleSelectEvent事件,或者使用menuChr来在合适的情况下显示菜单。
附加说明: 当用户的手写笔点击一个按钮时,一个penDown事件就被发送了。当用户的手写笔在标题栏点下,然后抬起时,系统的窗体事件处理函数就会产生一个frmTitleSelectEvent事件。当frmTitleSelectEvent事件被系统执行时,就会调用一个menuChr来显示菜单。

  17

问题症状: 本来应该是空格的地方被显示了欧洲字符。
原因: 一些软件使用“数字空格(numeric space)”来作为制表符进行数据分隔。但是,在Palm OS 3.3系统中,数字空格会被随机的欧洲字符代替。
解决方案: 不要继续使用数字空格了。或者用新的ChrNumericSpace宏(3.5版本中的新功能),来检测当前的设备中表示空格的应该是哪一个字符。

  18

问题症状: 在汇编过程中使用的回传,或者在GCC中的A4寄存器自动设置的回传调用,现在却导致死机。
原因: 一些软件是这样编写的:当调用一个回传过程时,它们假定A4寄存器,或者某个其他的寄存器时被保持着的,或者被系统设置了某个特殊的值。简而言之,当它们的这种假设是正确的时候,软件还能很幸运地正常运行。但是在新版本的OS系统环境下,这些寄存器可能被用作其他目的。
解决方案: A5寄存器是被作为存储全部变量而保留的。而其他的寄存器就不能被保证不会被占用了。所以,请通过可靠的方法修改源程序(一般情况下,特征管理器(Feature Manager)是一个不错的选择。)。

  19

问题症状: 在新的系统中,SerSetSettings现在经常返回一个serErrNotOpen错误代码。
原因: 在新版本的系统中,如果在连续库(Serial Library)还没有被打开的情况下就调用SerSetSettings的话,就可能返回和错误代码。而在以前,在这种情况下调用SerSetSettings的话,就不会出现错误代码,而是将设置写到低存储空间(low memory)中。
解决方案: 在调用SerSetSetings之前,打开库文件。


【责任编辑:方舟】
【发表评论】【关闭窗口】
■ 相关内容
 在palm中创建界面图标
 PC也能玩Palm
 在嵌入式开发中创建界面图标
 Palm OS软件界面设计初步
 Palm OS 3.5新特性
 Palm OS 3.0 新特性
 如何看待新老版本的SDK
 选择Windows CE 还是 Palm OS
 Palm OS开发者必读
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!