PPSM嵌入式RTOS中的窗口系统开发

发布者:泉地水无痕最新更新时间:2010-07-26 来源: 单片机及嵌入式系统应用关键字: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提供了灵活的屏幕缓存操作方式,开发的系统可能会因各应用程序采用了不同的屏幕缓存方式而冲突,并且难以协调。我们开发PPSM系统上的窗口系统,就是为了使其应用程序界面开发变得容易而快速,使编程人员的精力集中在应用程序本身的功能上,提高开发的效率和可靠性。

  (1)关于界面绘制、切换、恢复的考虑

  由于本窗口系统的目标是基于Motorola EZ/VZ328的便携设备,其特点是内存较小、LCD屏幕较小、CPU速度和屏幕刷新速度均较慢;而窗口系统则要求刷新速度快,占有内存小。通过分析系统特点,较小的LCD屏幕上,一般很少要求子窗口之间的切换,因而本窗口系统中,子窗口不能切换。换言之,子窗口均为有模式的,只有关闭上层子窗口,才能显示下一层的窗口。下一层的窗口被上层子窗口覆盖的部分可以由上层子窗口保存并恢复,或由下一层的窗口自己重画。前一种恢复方式虽然节约内存,但速度较慢,而且如果被最顶层窗口覆盖的窗口只有一个,则每个窗口均需按顺序重画。这在速度较慢的CPU上是不能容忍的,因而我们采用了后一种保存并恢复窗口覆盖区域的方式。

  一个应用程序(主任务)拥有一个主窗口。主窗口之间的切换等同于应用程序的切换。如果以重画的方式恢复一个主窗口,意味着该主窗口连同其所有子窗口必须依次重画,这样的刷新速度是不能满足要求的。PPSM提供了这样一种能力:如果主任务具有自己的屏幕缓存,在任务切换时,屏幕自动切换。因而我们采用这种方式。应用程序具有自己的屏幕缓存,而各窗口均在该缓存上绘出。每个应用程序均保存了一屏自己的窗口图形,当切换时,自动恢复。

  由于消息只由最顶层窗口处理,见(3)消息的处理部分,因而,在我们的窗口系统中不存在下层窗口界面绘制问题;同时,在小的屏幕上,实现窗口的移动和缩放并无太大的实用性,因而我们也不实现窗口的这些功能。

  另外有一类比较特殊的窗口,即POPUP属性的窗口。这类窗口主要应用于菜单和提示窗口,特点是:单击窗口之外的区域将自动关闭该窗口。我们的处理方法是在这类窗口显示时,设定一个全屏的活动区,以取得窗口外区域的笔输入;再设定一个窗口区域的活动区覆盖在全屏的活动区之上,以将窗口区域排除在点击自动关闭的区域之外。

  (2)关于界面输入的考虑

  由于PPSM采用活动区的输入方式,每个任务管理自己的活动区,任务激活时,其活动区处于有效状态。因而应用程序切换时,其活动区自动切换;但一个应用程序中,各窗口的活动区可能互相干扰。应用程序中,每个窗口均有各种的输入区域,而各窗口的活动区域可能相互覆盖,显示上层窗口时必须使下次窗口的所有活动区无效。有两种方式可实现这样的要求。第一种方式是,采用PPSM中子任务的方式:各子任务管理自己的活动区,当该子任务挂起或激活时,其活动区随之挂起或激活。这要求一个窗口必须对应有一个子任务。由于每个新的子任务需要较大的系统内存空间,而我们并不需要应用程序内各窗口之间的切换,因而我们不采用这种方式。第二种方式是,采用PPSM中挂起活动区和恢复活动区的方法。PPSM支持对每个任务多次挂起活动区和恢复活动区,因而我们可以在显示新的窗口时,先挂起原有的活动区;窗口关闭时,恢复原有的活动区。

  (3)消息的处理

  PPSM中定义了一系统硬件中断产生的消息,如IRPT_TIMER、IRPT_RTC、IRPT_UART等等;同时,提供SendMessage和AdvSendMessage函数允许发送用户自定义消息。用户自定义消息从IRPT_USER开始。一个程序可以发送到另一个应用程序或自己。这些消息和所有系统消息均由应用程序的顶层窗口处理。应用程序从其消息队列中取得消息后,首先,由预定义的应用程序消息处理函数处理公共的消息。然后,由为顶层窗口定义的消息处理函数处理。顶层窗口不处理的消息由预定义的窗口消息处理函数处理。

  消息发送采用两种方式。第一种是Send Message(),该函数将消息放在应用程序的消息队列中并立即返回;第二种是直接调用应用程序顶层窗口的消息处理函数,这样函数便在消息处理之后返回。

  (4)控件体系

  窗口只是提供了界面设计操作的基础。窗口中需要一系列按功能和操作方式分类的可视的界面元素,以便编程人员能够方便地设计窗口的界面,实现窗口的特定功能。这样的界面元素叫控件。

  由于嵌入式设备内存有限的原因,控件并不采用子窗口的方式。根据设计控件的目的,各类控件具有较为确定的外观和规定的动作,并在特定的条件下,向其父窗口发出预定义的消息以供其处理。

  控件属于父窗口。在父窗口显示时自动显示,在父窗口关闭时自动释放其占用的内存空间;父窗口接收的消息首先在各控件中分发处理。按照这一要求,窗口必须保存、维护其控件的一个列表。列表中控件的指针按控件创建的顺序存放。控件按创建的顺序显示,而消息在控件中按反序传递,以保证后创建的控件在可以覆盖之前创建的控件的图形和操作。

  为了提高控件开发效率,我们需要各控件可以作为一种新定义控件的子控件。这样新定义的控件可以利用已有的控件功能。如文本框控件中可以包含水平和垂直滚动条子控件。

  控件可分为有焦点和无焦点的。有焦点的控件可以处理输入法发出的字符消息。

  3 窗口体系的实现

  3.1 窗口的运行结构

  根据以上对窗口体系的总体考虑,确定窗口的运行结构需要以下内容:

  ① 窗口的位置、大小和标题。

  ② 窗口的风格:

  WS_MAINWND——应用程序主窗口。关闭主窗口将自动关闭应用程序。

  WS_POPUP——弹出式窗口。单击非窗口区域将自动关闭该窗口。该属性不能和WS_MAINWND同时出现。

  WS_NOBORDER——无边框窗口。

  WS_NOSTATEBAR——无状态条控件的窗口。一般窗口均有一个在窗口底部的状态条,提供弹出该窗口的命令菜单、显示窗口标题、关闭窗口、打开选择输入法、显示系统日期和时间等功能。

  ③ WS_POPUP类窗口的屏幕活动区和窗口活动区的ID。

  ④ 窗口当前的光标位置。

  ⑤ 窗口中控件的列表。

  ⑥ 窗口保存其覆盖区域的内存指针。

  ⑦ 前一个窗口的指针。用以在关闭窗口时重设应用程序的顶层窗口。

  ⑧ 窗口的缺省输入法类型和打开的输入法控件的句柄。

  ⑨ 窗口的焦点控件的句柄。焦点控件将最先处理字符输入的消息。

  ⑩ 窗口的消息处理函数指针。

  3.2 窗口的创建和操作函数介绍

  ① HWND CreateWindow(WNDCLASS &wndCls);

  WNDCLASS结构定义窗口的基本属性,如位置、大小、标题、风格等,见上面所述。该函数为窗口运行时的结构分配内存,初始化属性,并返回窗口结构的指针。

  ② BOOL ShowWindow(HWND hWnd);

  显示一个窗口。其工作包括:挂起以前的活动区;保存窗口的覆盖区域的图形;如果是有WS_POPUP属性的窗口,须设定屏幕和窗口的活动区;向该窗口的消息处理函数传递WM_ONSHOW消息(事实上是直接调用该函数),以提供编程人员在窗口上绘制控件以外的图形的机会;如果是没有WS_NOSTATEBAR的窗口,添加Statebar控件;依次调用窗口中各控件的绘制函数以显示控件;设第一个有焦点控件为窗口当前的焦点控件。

  ③ BOOL CloseWindow(HWND hWnd);

  关闭一个窗口。其工作包括:向该窗口的事件处理函数发送WM_CLOSE消息,如果返回FALSE则退出本函数,如果返回TRUE则继续以下工作 ——恢复窗口覆盖区图形;释放POPUP类窗口的屏幕活动区和窗口活动区; 依次释放该窗口包含的控件;隐藏光标;释放该窗口结构占用的内存;向上层窗口发送WM_TOPWNDCLOSE的消息,该消息用于下层窗口更新需要自动变化的界面,如股票实时大盘数据表;设置该窗口的前一层窗口为应用程序的顶层窗口。

  ④ WNDPROC函数指针类型。

  typedef BOOL (*WNDEVENTHANDLE)

  (HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);

  ⑤ DefWndProc(HWND hWnd, U16 msgType, U32 id,P_U32 data, U32 size);

  处理如POPUP窗口区外的点击自动关闭窗口之类的消息和行为。

  ⑥U32 WndAddCommand(HWND hWnd, P_S8 cmdName, U16 cmdLen, P_U8 cmdIcon);

  向有状态条控件的窗口增加应用程序定义的命令。命令出现在状态条的弹出菜单中。该函数返回一个唯一的命令ID,用于窗口处理WM_COMMAND消息时区分命令。

  ⑦ BOOL WndDelCommand(HWND hWnd, HCMD cmdId);

  删除一条命令。

  ⑧ U32 WndSetCommand(HWND, U32 cmdId, P_S8 newCaption);

  修改一条命令。

  ⑨ 其它函数。因篇幅原因,不能完全列出和解释所有的窗口操作函数。

  3.3 控件的实现

  (1)控件的基本结构

  我们使用控件的基本结构定义各类控件的公共属性。具体的控件结构在此基础上扩展,以包含其它属性。以下论述控件的基本属性。

  首先,在窗口的显示过程中,各控件的外观由自己绘制,因而各种控件需要一个绘制函数。该函数在定义具体控件时定义,在控件结构中保留该类函数的指针。其次,各种控件需要各自的消息处理函数,该函数的指针也保存在结构中。最后,一些控件可能会动态分配内存空间以保存自身的数据。控件需要在被释放时释放这样的内存,因而控件结构中也保存控件释放函数的指针。

  控件是窗口上的一个可操作区域,主要由笔输入来操作,因而控件需要响应笔操作的活动区。各种控件的活动区数量不同,因而在控件结构中需要保存一个可增长的活动区列表;但控件的屏幕区域可能覆盖部分窗口中的其它活动区(如其它控件),从而造成控件操作的混乱,因此需要一个控件占用区域的活动区,以屏蔽其它可能造成干扰的活动区。

  由于我们需要各种控件能在定义新控件时使用,即作为新控件的子控件,在控件的结构中,须保存子控件列表。各类控件的绘图、消息处理和释放函数,必须为控件系统定义的相应的缺省处理函数。这些缺省处理函数根据控件的子控件列表,首先调用子控件的相应函数。

  (2)具体控件定义的方法

  ① 一个具体的控件对应一个特定的结构。该结构首先包含控件的基本结构,其次定义该控件所需要的其它属性。如按键控件,需要有按键的类型、显示的文本或图形、笔操作所需的活动区ID和按下状态等属性。

  ② 定义控件的绘制、消息处理和释放函数。

  ③ 定义该控件的创建函数,如CreateButton()。在该函数的参数中包含该控件所需的初始属性、参数中标准的部分是控件的位置和大小。该函数初始化该控件结构的属性,包括初始化在基本控件结构中的控件绘制、消息处理和释放函数指针,使之指向相应的函数。

  ④ 定义操作控件、存取控件中数据所需的其它函数。

  (3)系统预定义的控件

  在系统中,已经使用这种定义方式定义了一些常用的控件。它们有:

  ① 按键:Button。文本或图形按键,Check方式按键。

  ② 标签:Label。

  ③ 复选框:CheckBox。

  ④ 单选框:RadioBox。

  ⑤ 组合框:CombBox。

  ⑥ 滚动条:ScrollBar。水平或垂直,简单类型滚动条可作为Spin使用。

  ⑦ 编辑框:TextBox。单行或多行,可编辑或不可编辑,有选块功能。

  ⑧ 列表框:ListBox。单列或多列,选项可带有图标。

  ⑨ 状态条:StateBar。含有命令菜单弹出按键、窗口关闭按键(在窗口关闭按键上显示窗口标题)、输入法按键、输入法选择按键、日期和时间显示区。

  日历控件:Canlendar。显示任意年月的日期,可切换公历和农历。

  组合日历控件:Date。单行显示日期,有弹出日历的按键。

  电子表格:Excel。显示数据库的记录,可按每列对应的字段排序。

  组控件:Group。用于控件分组。

  3.4 菜单系统

  菜单是通过在POPUP窗口中加入ListBox控件实现的。菜单窗口的消息处理函数在用户选择列表框项目后自动关闭,并向应用程序发送WM_ MENUCLICK消息。该消息带有选项的序号。

  使用PopupMenu()函数弹出菜单。PopupMenu()函数根据列表的项目数和列表文本的最大宽度,确定窗口的大小,创建窗口并添加列表框控件,在指定的位置显示。

关键字:PPSM  EZ328  VZ328  M68K  RTOS  实时嵌入式操作系统  窗口系统  控件 引用地址:PPSM嵌入式RTOS中的窗口系统开发

上一篇:Java技术在嵌入式系统中的应用
下一篇:风河全新软件测试工具加速Android开发进程

推荐阅读最新更新时间:2024-05-02 21:06

基于RTX51实时操作系统的用户专用键盘软件设计
0 引言     传统的用户专用键盘单片机软件采用结构化设计方法,主程序循环执行,依次完成按键扫描、按键处理、串口命令接收、串口命令处理等任务。由于任务的数量少,并且每个任务执行的操作简单,此种设计可以使得软件较好地满足功能要求。但仔细分析,会发现程序一些可以改进的地方,如:执行时间短的任务不得不排队等待执行时间长的任务的完成。此外,如果用户的设计要求发生变化(如:专用键盘功能增加、按键数量增多、串口协议复杂化等),原有的编程思想将很难满足要求,程序因此无法进行移植升级而不得不重新开发。     基于RTX51实时操作系统进行单片机软件设计,可以真正做到各任务并行执行,同时,由于程序结构更加科学合理,可以方便地实现修改升级,以满足
[嵌入式]
嵌入式系统在大射电望远镜5米模型上悬索控制中的应用
“大射电望远镜FAST(Five hundred meter Aperture Spherical Telescope)预研究”是中国科学院知识创新设计方案 。通过六根悬索驱动馈源舱完成馈源的大范围跟踪,保证馈源舱的定位精度在50cm以内。为验证方案的可行性,实地已建造了50m缩比实验模型。现由于实际需要,还建立了5m缩比实验模型(以下简称FAST 5m)。5m缩比模型的馈源舱一级粗调由自动调整和手动调整组成,自动调整由工业控制计算机实现,手动调整主要目的是把馈源舱调到指定位置,为自动调整作准备。手动调整分为点动调整和精确调整两部分。为了调整方便,需要LCD和触摸屏,并要求较高的实时性,加上复杂的控制程序,这就需要更高的CPU处理
[单片机]
嵌入式<font color='red'>系统</font>在大射电望远镜5米模型上悬索控制中的应用
STM8的福利--Atomthreads实时操作系统
Atomthreads是开源的实时操作系统。诞生之初就是给STM8s设计的,而且作者还在不断更新,我看最近的主要修改是加入更多MCU的支持。算法上没有变化。所以我取了1.3的版本,足够用了。 我使用的是STM8S105K4的最小系统。有16Kflash可以使用。这个大小放下原生的atomthreads是够的。 这个实时系统包含了操作系统所有最基本的接口 mutex semaphore timer queue 255级优先级的强占是调度 同优先级时间片轮转 等等。绝对算是完整的操作系统。 并且源代码有所有API调用的例子,这绝对是福利,节约大家时间。要造汽车,绝对不需要每次都从车轮造起。当今世界要站在巨人的肩膀上前进
[单片机]
STM8的福利--Atomthreads<font color='red'>实时操作系统</font>
AVR单片机的RTOS-AVRX应用
摘 要 :详细介绍AVR系列单片机的专用实时嵌入式操作系统AVRX的特点,并以ATmega16单片机为平台,结合AVR单片机应用实例分析AVRX的内核代码及移植方法,并对系统的相关性能进行测试。采用AVRX可以大大简化程序设计,满足实时要求,降低编程难度,提高系统可靠性。本文为在AVR单片机上进行嵌入式系统开发提供了参考。 关键词 : RTOS AVRX AVR单片机移植 系统测试 引 言 随着技术的发展,嵌入式系统的设计及应用对人们的生活产生了很大的影响,并将逐渐改变人们未来的生活方式。在特定的操作系统上开发应用程序,可以使开发人员忽略掉很多底层硬件细节,使得应用程序调试更方便、易于维护、开发周期缩短并且降低开发成本,因
[单片机]
嵌入式操作系统在高速实时信号处理系统中的应用
  现今的信号处理设备越来越复杂,不仅要求高速的处理能力,而且要求功能多样化,仅仅追求速度已经不能满足需求。尤其在复杂多变的环境中,要求信号处理机能够完成多种处理功能,并能方便灵活地切换工作模式。因此有必要发展一种可重构和可扩展的通用信号处理系统,能将信号处理机多功能化、模块化、标准化和通用化。将嵌入式操作系统与高速实时信号处理机结合,可以很好地实现这些要求。在雷达火控系统中,信号处理不仅需要很高的处理速度,而且要满足控制显示多方面的需求,如果没有操作系统,实现起来不仅复杂而且不便于系统的模块化和标准化。因此,采用实时操作系统VxWorks实现雷达系统的控制和显示功能。VxWorks是一种类UNIX的高性能嵌入式实时操作系统,
[嵌入式]
基于RTOS的涡喷发动机数字控制系统
摘要:介绍了一种应用于无人机的微型涡轮喷气式发动机数字控制系统的设计与实现。该系统基于C8051F021单片机和MicroStar嵌入式实时操作系统,实现了小型涡喷发动机自动点火、启动、推力控制与稳定、超温超速保护、系统自检、冷却等功能。该系统具有体积小、重量轻、功能全的特点。 关键词:C8051F021 MicroStar RTOS 涡喷发动机 PID 与活塞发动机相比,涡轮喷气发动机(以下简称涡喷发动机)在推重比方面的优势无可争议。如果将之微型化,将使小型无人飞行器获取较高的速度和载荷能力。因此,研制微型涡喷发动机在军用和民用领域都有深远的意义。目前,美、德、丹麦等国家都有相当成熟的微型涡喷发动机产品,已成功应用到航模和
[单片机]
简单双通道示波器VI控件的触发源功能块选择
  触发源功能块的作用主要是利用触发源开关的选择和通道选择开关完成对示波器显示波形的触发源的选择问题,如图所示。 图 触发源功能块设置   触发源 Source 开关和通道选择开关 Select Channel 选择通过And逻辑操作后作为分支选择结构(case-switch)的选择项,若选择结果为真,此时触发通道B,将逻辑选择数值 0 作为触发源 Source ,触发极性 Slope 不口触发电位 Level 属性引用节点的设置数值,打开后两者的功能。如果case选择情况为后者,即采用外触发 EXT ,此时将逻辑选择数值 2 作为逻辑数值输入触发器面板3个控件的属性节点后,使得触发极性和触发电位取消作用。
[测试测量]
简单双通道示波器VI<font color='red'>控件</font>的触发源功能块选择
构造一个51单片机的实时操作系统的方法
目前,大多数的产品开发是在基于一些小容量的单片机上进行的。51系列单片机,是我目前使用最多的单片机系列之一,有非常广大的应用环境与前景,多年来的资源积累,使51系列单片机仍是许多开发者的首选。针对这种情况,近几年涌现出许多基于51内核的扩展芯片,功能越来越齐全,速度越来越快,也从一个侧面说明了51系列单片机在国内的生命力。 多年来我们一直想找一个合适的实时操作系统,作为自己的开发基础。根据开发需求,整合一些常用的嵌入式构件,以节约开发时间,尽最大可能地减少开发工作量;另外,要求这个实时操作系统能非常容易地嵌入到小容量的芯片中。毕竟,大系统是少数的,而小应用是多数而广泛的。显而易见,μC/OS—II是不太适合于以上要求的,而Keil
[应用]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved