PPSM嵌入式RTOS中的窗口系统开发
摘要:PPSM是Motorola为M68K系列提供的实时嵌入式操作系统。本文介绍在PPSM嵌入式RTOS上开发窗口及控件系统的体系和方法。
关键词:PPSM EZ328 VZ328 M68K RTOS 实时嵌入式操作系统 窗口系统 控件
在目前的中低档PDA中,很多厂商都采用Motorola M68K系列芯片。Motorola为其M68K CPU提供了一套免费的实时操作系统PPSM(Personal Portable System Manager)。但该系统中没有提供窗口系统。我们在实践中开发了一套窗口系统,如图1和图2所示。该系统为事件驱动方式,并有一系列控件支持。软件开发人员采用添加控件的方式构建所需的窗口,编写对控件和窗口事件的响应方式。下面介绍这套窗口系统的设计方案。
1 PPSM系统简介
(1)虚拟多任务方式
PPSM系统中可以创建多个主任务,但只有一个主任务处于活动状态。每个主任务可以创建多个子任务。主任务和子任务均有唯一的TaskId。任务之间可以发送消息。接收消息的任务及其主任务可以取得CPU的控制权。
(2)触摸屏输入
PPSM系统采用了“活动区”的概念。“活动区”是用户设定的屏幕上的一个矩形区域,只有笔在这样的区域中的动作才能引起PPSM向活动任务发送消息。每个活动区均属于其创建的任务。换一种方式表达为:每个任务保存和管理一系列活动区,活动主任务的所有子任务的活动区均处于活动状态,后创建的活动区覆盖之前创建的活动区。
(3)图形界面支持
PPSM系统以一部分系统内存作为屏幕缓存。每个任务可以拥有自己独立的屏幕缓存,也可以共享一个屏幕缓存。屏幕缓存的尺寸可以与实际的屏幕大小不同。系统显示活动任务的屏幕缓存中的图像。每个主任务拥有自己独立的屏幕缓存,可以使主任务切换时迅速切换屏幕;而各主任务共享一个屏幕缓存可以节约内存空间,同时,应用程序还可以创建独立于任务的屏幕缓存。它具有与屏幕缓存同样的结构,但不能直接输出到屏幕上。用户可设置当前的屏幕缓存。PPSM提供了一组GUI函数,用于在当前的屏幕缓存中作图。
(4)事件驱动
PPSM采用中断方式处理各类事件,如时钟、UART输入/输出、笔输入等。各种事件均向活动任务发送消息。各任务(主任务或子任务)均有各自的消息队列。各任务从其消息队列中取得并处理消息。
2 窗口的基本任务及界面系统的总体考虑
由于PPSM提供了灵活的屏幕缓存操作方式,javascript:window.open(this.src);" style="cursor:pointer;"/>开发的系统可能会因各应用程序采用了不同的屏幕缓存方式而冲突,并且难以协调。我们开发PPSM系统上的窗口系统,就是为了使其应用程序界面开发变得容易而快速,使编程人员的精力集中在应用程序本身的功能上,提高开发的效率和可靠性。
(1)关于界面绘制、切换、恢复的考虑
由于本窗口系统的目标是基于Motorola EZ/VZ328的便携设备,其特点是内存较小、LCD屏幕较小、CPU速度和屏幕刷新速度均较慢;而窗口系统则要求刷新速度快,占有内存小。通过分析系统特点,较小的LCD屏幕上,一般很少要求子窗口之间的切换,因而本窗口系统中,子窗口不能切换。换言之,子窗口均为有模式的,只有关闭上层子窗口,才能显示下一层的窗口。下一层的窗口被上层子窗口覆盖的部分可以由上层子窗口保存并恢复,或由下一层的窗口自己重画。前一种恢复方式虽然节约内存,但速度较慢,而且如果被最顶层窗口覆盖的窗口只有一个,则每个窗口均需按顺序重画。这在速度较慢的CPU上是不能容忍的,因而我们采用了后一种保存并恢复窗口覆盖区域的方式。
一个应用程序(主任务)拥有一个主窗口。主窗口之间的切换等同于应用程序的切换。如果以重画的方式恢复一个主窗口,意味着该主窗口连同其所有子窗口必须依次重画,这样的刷新速度是不能满足要求的。PPSM提供了这样一种能力:如果主任务具有自己的屏幕缓存,在任务切换时,屏幕自动切换。因而我们采用这种方式。应用程序具有自己的屏幕缓存,而各窗口均在该缓存上绘出。每个应用程序均保存了一屏自己的窗口图形,当切换时,自动恢复。
由于消息只由最顶层窗口处理,见(3)消息的处理部分,因而,在我们的窗口系统中不存在下层窗口界面绘制问题;同时,在小的屏幕上,实现窗口的移动和缩放并无太大的实用性,因而我们也不实现窗口的这些功能。
另外有一类比较特殊的窗口,即POPUP属性的窗口。这类窗口主要应用于菜单和提示窗口,特点是:单击窗口之外的区域将自动关闭该窗口。我们的处理方法是在这类窗口显示时,设定一个全屏的活动区,以取得窗口外区域的笔输入;再设定一个窗口区域的活动区覆盖在全屏的活动区之上,以将窗口区域排除在点击自动关闭的区域之外。
(2)关于界面输入的考虑
由于PPSM采用活动区的输入方式,每个任务管理自己的活动区,任务激活时,其活动区处于有效状态。因而应用程序切换时,其活动区自动切换;但一个应用程序中,各窗口的活动区可能互相干扰。应用程序中,每个窗口均有各种的输入区域,而各窗口的活动区域可能相互覆盖,显示上层窗口时必须使下次窗口的所有活动区无效。有两种方式可实现这样的要求。第一种方式是,采用PPSM中子任务的方式:各子