PPSM嵌入式RTOS中的窗口系统开发
发布时间:2007/8/30 0:00:00 访问次数:724
在目前的中低档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输入/输出、笔输入等。各种事件均向活动任务发送消息。各任务(主任务或子任务)均有各自的消息队列。各任务从其消息队列中取得并处理消息。
由于PPSM采用活动区的输入方式,每个任务管理自己的活动区,任务激活时,其活动区处于有效状态。因而应用程序切换时,其活动区自动切换;但一个应用程序中,各窗口的活动区可能互相干扰。应用程序中,每个窗口均有各种的输入区域,而各窗口的活动区域可能相互覆盖,显示上层窗口时必须使下次窗口的所有活动区无效。
有两种方式可实现这样的要求。第一种方式是,采用PPSM中子任务的方式:各子任务管理自己的活动区,当该子任务挂起或激活时,其活动区随之挂起或激活。这要求一个窗口必须对应有一个子任务。由于每个新的子任务需要较大的系统内存空间,而我们并不需要应用程序内各窗口之间的切换,因而我们不采用这种方式。第二种方式是,采用PPSM中挂起活动区和恢复活动区的方法。PPSM支持对每个任务多次挂起活动区和恢复活动区,因而我们可以在显示新的窗口时,先挂起原有的活动区;窗口关闭时,恢复原有的活动区。
(3)消息的处理
PPSM中定义了一系统硬件中断产生的消息,如IRPT_TIMER、IRPT_RTC、IRPT_UART等等;同时,提供SendMessage和AdvSendMessage函数允许发送用户自定义消息。用户自定义消息从IRPT_USER开始。一个程序可以发送到另一个应用程序或自己。这些消息和所有系统消息均由应用程序的顶层窗口处理。应用程序从其消息队列中取得消息后,首先,由预定义的应用程序消息处理函数处理公共的消息。然后,由为顶层窗口定义的消息处理函数处理。顶层窗口不处理的消息由预定义的窗口消息处理函数处理。
消息发送采用两种方式。第一种是Send Message(),该函数将消息放在应用程序的消息队列中并立即返回;第二种是直接调用应用程序顶层窗口的消息处理函数,这样函数便在消息处理之后返回。
(4)控件体系
窗口只是提供了界面设计操作的基础。窗口中需要一系列按功能和操作方式分类的可视的界面元素,以便编程人员能够方便地设计窗口的界面,实现窗口的特定功能。这样的界面元素叫控件。
由于嵌入式设备内存有限的原因,控件并不采用子窗口的方式。根据设计控件的目的,各类控件具有较为确定的外观和规定的动作,并在特定的条件下,向其父窗口发出预定义的消息以供其处理。
控件属于父窗口。在父窗口显示时自动显示,在父窗口关闭时自动释放其占用的内存空间;父窗口接收的消息首先在各控件中分发处理。按照这一要求,窗口必须保存、维护其控件的一个列表。列表中控件的指针按控件创建的顺序存放。控件按创建的顺序显示,而消息在控件中按反序传递,以保证后创建的控件在可以覆盖之前创建的控件的图形和操作。
为了提高控件开发效率,我们需要各控件可以作为一种新定义控件的子控件。这样新定义的控件可以利用已有的控件功
在目前的中低档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输入/输出、笔输入等。各种事件均向活动任务发送消息。各任务(主任务或子任务)均有各自的消息队列。各任务从其消息队列中取得并处理消息。
由于PPSM采用活动区的输入方式,每个任务管理自己的活动区,任务激活时,其活动区处于有效状态。因而应用程序切换时,其活动区自动切换;但一个应用程序中,各窗口的活动区可能互相干扰。应用程序中,每个窗口均有各种的输入区域,而各窗口的活动区域可能相互覆盖,显示上层窗口时必须使下次窗口的所有活动区无效。
有两种方式可实现这样的要求。第一种方式是,采用PPSM中子任务的方式:各子任务管理自己的活动区,当该子任务挂起或激活时,其活动区随之挂起或激活。这要求一个窗口必须对应有一个子任务。由于每个新的子任务需要较大的系统内存空间,而我们并不需要应用程序内各窗口之间的切换,因而我们不采用这种方式。第二种方式是,采用PPSM中挂起活动区和恢复活动区的方法。PPSM支持对每个任务多次挂起活动区和恢复活动区,因而我们可以在显示新的窗口时,先挂起原有的活动区;窗口关闭时,恢复原有的活动区。
(3)消息的处理
PPSM中定义了一系统硬件中断产生的消息,如IRPT_TIMER、IRPT_RTC、IRPT_UART等等;同时,提供SendMessage和AdvSendMessage函数允许发送用户自定义消息。用户自定义消息从IRPT_USER开始。一个程序可以发送到另一个应用程序或自己。这些消息和所有系统消息均由应用程序的顶层窗口处理。应用程序从其消息队列中取得消息后,首先,由预定义的应用程序消息处理函数处理公共的消息。然后,由为顶层窗口定义的消息处理函数处理。顶层窗口不处理的消息由预定义的窗口消息处理函数处理。
消息发送采用两种方式。第一种是Send Message(),该函数将消息放在应用程序的消息队列中并立即返回;第二种是直接调用应用程序顶层窗口的消息处理函数,这样函数便在消息处理之后返回。
(4)控件体系
窗口只是提供了界面设计操作的基础。窗口中需要一系列按功能和操作方式分类的可视的界面元素,以便编程人员能够方便地设计窗口的界面,实现窗口的特定功能。这样的界面元素叫控件。
由于嵌入式设备内存有限的原因,控件并不采用子窗口的方式。根据设计控件的目的,各类控件具有较为确定的外观和规定的动作,并在特定的条件下,向其父窗口发出预定义的消息以供其处理。
控件属于父窗口。在父窗口显示时自动显示,在父窗口关闭时自动释放其占用的内存空间;父窗口接收的消息首先在各控件中分发处理。按照这一要求,窗口必须保存、维护其控件的一个列表。列表中控件的指针按控件创建的顺序存放。控件按创建的顺序显示,而消息在控件中按反序传递,以保证后创建的控件在可以覆盖之前创建的控件的图形和操作。
为了提高控件开发效率,我们需要各控件可以作为一种新定义控件的子控件。这样新定义的控件可以利用已有的控件功