第28章emWin(ucgui)STemWin多任务设计(模拟器)
SIMPL Windows基础教程 - 最终版

快思聪SIMPL Windows编程语言初级教程目录第一章快思聪SIMPL WINDOWS (5)概览 (5)关于初级教程 (5)快思聪开发软件 (6)SIMPL Windows (6)快思聪VisionTool Pro-e (6)DEAL TM for Windows (6)Media Manager TM System Builder (6)D3 Pro TM (7)数据库(Database) (7)产品目录光盘 (7)快思聪控制系统 (9)为什么对控制系统编程? (9)控制系统组件 (9)主机 (9)网络控制模块 (10)Plug-in控制卡 (10)用户界面 (10)触摸屏 (10)键盘(按键面板) (10)无线摇控界面 (10)用户设备 (10)控制方式 (11)继电器控制 (11)串口通信控制 (11)红外 (11)自定义串量 (13)RS232,RS422,RS485 (13)MIDI(数字音乐设备接口) (14)模拟电压 (14)自定义快思聪接口界面 (14)Cresnet (14)第二章SIMPL WINDOWS编程 (16)SIMPL介绍 (16)函数库 (16)设备函数 (16)逻辑函数 (16)函数属性 (16)输入 (17)输出 (17)信号类型 (18)数字量 (18)模拟信号量 (18)串量 (19)特殊信号0和1 (19)逻辑波跟逻辑解决方案 (19)用户界面编程 (21)按钮动作 (21)按钮反馈 (21)子页(仅用于触摸屏) (23)模拟显示(仅用于触摸屏) (23)间接文本(仅用于触摸屏) (24)用SIMPL W INDOWS来创建一个程序 (25)编程步骤 (25)基本编程规则 (25)建立一个系统 (25)网络硬件 (28)控制插卡 (29)串口设备 (29)用户设备 (30)网络ID (30)配置设备 (31)快思聪网络设备 (31)以太网设备 (32)串口设备 (33)触摸屏 (33)连接信号 (34)定义用户界面信号 (34)使用逻辑函数 (35)第三章逻辑函数编程 (37)概述 (37)逻辑函数的类型 (37)基本逻辑 (38)NOT函数 (38)OR函数 (38)AND函数 (40)Buffer函数 (41)状态逻辑 (46)Set/Reset Latch函数 (46)Toggle函数 (47)Interlock函数 (49)基于时间的逻辑 (52)One Shot 系列 (52)Multiple One Shot (53)Retriggerable One Shot (53)Delay Symbol (54)Oscillator Symbol (55)模拟逻辑 (57)Analog Ramp函数 (57)Analog Initialize (58)Analog Preset函数 (59)Serial/Analog One-Shot (61)Modules模块 (61)Communication Settings (62)Compiling and Uploading Programs (64)第一章快思聪SIMPL Windows概览关于初级教程编写本教程的目的在于向程序设计人员介绍SIMPL windows编程技术以及如何应用快思聪控制系统,这包括对控制系统如何利用触摸屏和按钮作为用户界面的理解,通过这些界面,使用者可以发送一个信号(主要是逻辑函数)给控制系统处理后输出用以最终控制一个设备。
emwin快速设计界面的方法

emwin快速设计界面的方法EMWIN是一种基于嵌入式系统的快速设计界面的方法。
EMWIN为开发者提供了一套易用的图形用户界面(GUI)开发工具,使他们能够轻松创建具有高度可视化效果的应用程序。
要快速设计EMWIN界面,下面是一些方法和步骤可以帮助你:1. 熟悉EMWIN库和其官方文档:首先,你需要了解EMWIN库的基本知识和功能。
通过阅读EMWIN的官方文档,你将了解到EMWIN所提供的API和函数,并且可以学习如何使用它们来创建界面元素。
2. 设计界面布局:在开始编写代码之前,你应该先考虑和规划你的界面布局。
确定你的界面有哪些不同的区域和元素,例如按钮、文本框、图像等。
然后,决定它们的位置、大小和排列方式。
3. 使用EMWIN绘图函数:EMWIN提供了一系列的绘图函数,用于在屏幕上绘制不同的图形和界面元素。
你可以使用这些函数来绘制按钮、文本框、图像等。
根据你的设计,使用合适的绘图函数创建你的界面元素。
4. 添加交互和反馈:一个好的界面应该能够与用户进行交互,并给予相应的反馈。
EMWIN提供了事件处理机制,可以让你识别和响应用户的操作,例如点击按钮或者输入文本。
添加适当的事件处理代码,以便在用户与界面进行交互时产生正确和实时的反馈。
5. 进行测试和优化:在完成设计和编码后,进行测试是非常重要的。
确保你的界面能够正常工作,并且符合你的设计预期。
如果需要,优化代码和界面,以提高其性能和用户体验。
通过实践和不断的学习,你会逐渐熟悉EMWIN的开发流程和技巧,并能够快速设计出高效的界面。
记住,练习是提高的关键,不断尝试并改进你的设计方法,你将成为一个优秀的EMWIN界面设计师。
第一章:emwin介绍

第1章e m W i n介绍本期教程开始带领大家了解一下STemWin的基本知识,其实确切的讲应该叫emWin基础知识,由于教程使用的开发板是ST的微控制器,所以就把名字统一命名成STemWin(为什么叫STemWin,在下面会有详细的讲解)。
1.1 STemWin,emWin,μCGUI之间的关系1.2 SEGGER公司介绍1.3 STemWin介绍1.4 STM32F103和407跑STemWin性能测试1.5 STemWin论坛1.6 总结1.1S T e m W i n,e m W i n,μC G U I之间的关系这个放在最开头进行说明,因为很多的初学者比较的迷惑。
对于一些刚学GUI的用户来说,知道μCGUI的比较多,而不知道所谓的emWin或者STemWin。
这个并不奇怪,主要是因为大部分人只知道SEGGER公司的做的JLINK,而不知道他们还有RTOS和相关的中间件(中间件的意思就是基于RTOS的文件系统,GUI,USB主机和设备协议栈等)。
1.1.1μCGUI在国内比较火的原因μCGUI在国内前几年比较火的原因有三点:●一个是μCOS-II在国内的推广,自从Micrum公司出的那本《嵌入式实时操作系统μCOS-II》发布之后,国内关于μCOS-II的资料就是普天盖起,再加上各种培训机构和开发板的推广,μCOS-II就在国内火起来了。
μCOS-II火的同时,它配套的中间件,特别是μCGUI就跟着在国内火了起来。
●前几年国内有一个μCGUI的论坛,这个论坛在国内的μCGUI方面应该算是做得最好的,特别是那个站长在μCGUI方面的研究,这位站长对于μCGUI在国内的发展功不可没。
●还有一个原因就是μCGUI是带有源码的,很多时候可以通过修改部分的源码实现一些特殊的功能,现在网上流传的μCGUI的源码已经不知道经过多少人的手被修改过,最原始的的代码已经在官网上面找不到了。
1.1.2emWin和μCGUI的关系首先要明白,这两个GUI是一个东西。
Windows任务管理器的设计与实现

Windows任务管理器的设计与实现毕业设计(作业)毕业指导学生学院系专业学生要求交199windows任务管理器设计与实现年12月19日XXXX::::::::摘要据国外研究公司统计随着个人电脑进入千家万户,电脑操作系统中的任务管理器也越来越为越来越多的用户所熟悉和使用。
任务管理器是一个在视窗系统中管理应用程序和进程的工具。
它通常由视窗操作系统提供,并有提供增强功能的第三方软件。
通过任务管理器,用户可以轻松查看当前运行的程序、进程、用户、网络连接以及系统对内存和CPU资源的使用情况,并可以强制结束一些程序和进程。
此外,用户可以监控系统资源的使用。
视窗任务管理器首次出现在微软公司1998年发布的视窗98操作系统中。
从那以后,微软视窗操作系统的所有版本都集成了任务管理器。
任务管理器不是视窗系统的专利。
它广泛用于各种操作系统。
苹果的苹果操作系统中有一个类似的活动监视器,基于Linux的ubuntu操作系统中有一个类似的功能系统监视器窗口任务管理器提供有关计算机性能的信息,并显示有关计算机上运行的程序和进程的详细信息。
如果您连接到网络,您还可以查看网络状态,并快速了解网络如何工作。
它的用户界面提供了六个菜单项,包括文件、选项、视图、窗口、关机、帮助,以及五个选项卡,包括应用程序、进程、性能、网络和用户项目的设计是一个模拟视窗任务管理器开发的视窗过程管理软件。
主要设计是一个基于窗体的C#程序。
标签控件放置在主对话框上,创建了应用程序、过程和性能的三个页面。
标签控件用于选择和显示页面。
这三个页面分别用于显示当前运行的窗口程序、进程和进程模块以及系统资源使用情况该程序还实现了结束任务和管理流程的基本功能。
在的设计过程中,任务、进程、线程模块和系统资源使用等信息可以通过调用窗口应用编程接口函数来获得最后,在Windows10系统上对系统进行了测试,实现了流程管理的基本功能。
关键词:任务经理;螺纹;过程;API条目1目录摘要.................................................................................................................. .. (i)第一章简介 (1)1.1项目背景:.............................................1 1.2国内外研究现状;................................1 1.3研究意义.............................的主要研究内容.................1 1.4的论文简要介绍了MicrosoftVisualStudio的开发环境.............................2 1.5。
emWin522(uCGUI)图形用户接口移植详细实例_STM32_2013_12_30

emWin 5.22 (uCGUI) 图形用户接口移植实例——STM32作者:Ach日期:2013年12月29日联系方式:ox000008@1.概要移植图形用户接口的好处是不言而喻的。
本文图文并茂地介绍了一个emWin 5.22(uCGUI)的移植实例。
文章具体分为emWin简介,硬件平台简介,开发环境及项目简介,移植过程以及总结几个部分。
2.emWin简介emWin是一种高效的而图形用户界面,是我们能够摆脱处理器和显示控制器而更专注于GUI的设计。
这里借用STemWin的一幅图来说明emWin的作用和结构。
它通过LCD及GUI的配置来驱动底层硬件,而应用程序又是通过调用emWin来实现各种GUI。
5.22版的emWin带有许多常用的显示控制器的驱动(在参考手册Display Driver一章中有详细介绍),因此为我们移植带来了诸多方便。
emWin的更详细的内容可参照它的参考手册。
图1. emWin在项目中的结构3.硬件平台简介笔者使用的是一块以STM32F103VET6为核心的ARM开发板,没有外部的SRAM及Flash。
显示屏为2.8”320*240的彩色液晶屏,屏的驱动芯片为ILI9341(emWin 5.22带有它的驱动)。
屏与CPU 的连接方式为该ARM核心所特有的FSMC_SRAM方式,访问LCD内容时操作就如同读写SRAM一样方便。
如果你想使用其它硬件平台来移植emWin,本文亦有一定的参考价值。
希望本文能助你成功移植emWin。
图2. 硬件平台4.开发环境简介笔者所使用的开发软件为MDK-ARM 4.70。
项目模板使用的是STemWin库中的(可从ST官方下载)。
图3. 项目截图如图,项目下面有3个文件夹,其中Appli存放的是应用层的程序,第二个文件夹就如文件名,存放了emWin5.22所有部件,第三个文件夹存放了一些STM32及其它的库。
具体见附件。
5.移植过程有了MDK-ARM以及STemWin库,整个移植过程应该比较简单。
[STemWin教程入门篇]第一期:emWin介绍
![[STemWin教程入门篇]第一期:emWin介绍](https://img.taocdn.com/s3/m/2f913f52bf1e650e52ea551810a6f524ccbfcbf4.png)
[STemWin教程⼊门篇]第⼀期:emWin介绍特别说明:原创教程,未经许可禁⽌转载,教程采⽤回复可见的形式,谢谢⼤家的⽀持。
armfly-x2,x3,v2,v3,v5开发板裸机和带系统的emWin⼯程已经全部建⽴,链接如下:SEGGER公司介绍了解emWin之前,先了解⼀下SEGGER这家公司,了解⽣产商才能对emWin有更加全⾯的认识。
SEGGER公司成⽴于1997年,到现在的2013年,有差不多16年的历史了,这家公司主要有两个office,⼀个是在德国的Hilden,另个在美国的 Massachusetts。
官⽹还有⼀个他们⼯作地⽅的照⽚,看着很不错,我这⾥也把这个照⽚贴上这家公司的产品主要有三个⼤的⽅向,下⾯分别的说⼀下:RTOS和中间件embOS (Real Time Operating System)embOS/IP (TCP/IP Stack)emWin (Graphic Software & GUI)emFile (File System)emUSB Device (USB Device Stack)emUSB Host (USB Host Stack)J-Link Debug ProbesJ - Link PROJ - Link ULTRA+J - Link PLUSJ - LinkJ - Trace Cortex-M3J - Trace ARMProduction ProgrammersFlasher ARMFlasher RXFlasher STM8Flasher ST7Flasher 5Flasher 5 PRO官⽹上⾯也有⼀个论坛,不过论坛的打开速度⽐较的慢,⽽且是英⽂的,问个问题也不太⽅便Energy Micro获得了SEGGER的授权,可以免费的使⽤,想了解其他信息的可以去官⽹查看,这⾥有⼏个官⽹张贴的,客户设计界⾯,设计的的确很好看。
其实话说回来,要想设计⽐较好的界⾯还是得⼿⼯设计,⽤控件很难做出这种效果,除⾮有这种效果的控件。
代码大全

本书简介本书精选了《代码大全(第2版)》中的精华内容,包括各章“要点(Key Points)”以及“核对表(CHECKLIST)”的全部内容,便于读者在工作学习中随时查阅,极具参考价值。
另外,本书还附有《深入解析Windows操作系统,第4版——Microsoft Windows Server 2003/Windows XP/Windows 2000技术内幕》第14章的内容,供广大读者试读。
本书适合计算机相关专业学生和教师、软件开发人员、IT专业人员以及计算专业知识爱好者阅读和参考。
目录第1章 欢迎进入软件构建的世界第2章 用隐喻来更充分地理解软件开发第3章 三思而后行:前期准备第4章 关键的“构建”决策第5章 软件构建中的设计第6章 可以工作的类第7章 高质量的子程序第8章 防御式编程第9章 伪代码编程过程第10章 使用变量的一般事项第11章 变量名的力量第12章 基本数据类型第13章 不常见的数据类型第14章 组织直线型代码第15章 使用条件语句第16章 控制循环第17章 不常见的控制结构第18章 表驱动法第19章 一般控制问题第20章 软件质量概述第21章 协同构建第22章 开发者测试第23章 调试第24章 重构第25章 代码调整策略第26章 代码调整技术第27章 程序规模对构建的影响第28章 管理构建第29章 集成第30章 编程工具第31章 布局与风格第32章 自说明代码第33章 个人性格第34章 软件工艺的话题第35章 何处有更多信息下载后 点击此处查看完整内容。
第1章 STemWin介绍

第1章S T e m W i n介绍本期教程开始带领大家了解一下STemWin的基本知识,其实确切的讲应该叫emWin基础知识,由于教程使用的开发板是ST的微控制器,所以就把名字统一命名成STemWin(为什么叫STemWin,在下面会有详细的讲解)。
1.1 STemWin,emWin,μCGUI之间的关系1.2 SEGGER公司介绍1.3 STemWin介绍1.4 STM32F103和407跑STemWin性能测试1.5 STemWin论坛1.6 总结1.1S T e m W i n,e m W i n,μC G U I之间的关系这个放在最开头进行说明,因为很多的初学者比较的迷惑。
对于一些刚学GUI的用户来说,知道μCGUI的比较多,而不知道所谓的emWin或者STemWin。
这个并不奇怪,主要是因为大部分人只知道SEGGER公司的做的JLINK,而不知道他们还有RTOS和相关的中间件(中间件的意思就是基于RTOS的文件系统,GUI,USB主机和设备协议栈等)。
1.1.1μCGUI在国内比较火的原因μCGUI在国内前几年比较火的原因有三点:●一个是μCOS-II在国内的推广,自从Micrum公司出的那本《嵌入式实时操作系统μCOS-II》发布之后,国内关于μCOS-II的资料就是普天盖起,再加上各种培训机构和开发板的推广,μCOS-II就在国内火起来了。
μCOS-II火的同时,它配套的中间件,特别是μCGUI就跟着在国内火了起来。
●前几年国内有一个μCGUI的论坛,这个论坛在国内的μCGUI方面应该算是做得最好的,特别是那个站长在μCGUI方面的研究,这位站长对于μCGUI在国内的发展功不可没。
●还有一个原因就是μCGUI是带有源码的,很多时候可以通过修改部分的源码实现一些特殊的功能,现在网上流传的μCGUI的源码已经不知道经过多少人的手被修改过,最原始的的代码已经在官网上面找不到了。
1.1.2emWin和μCGUI的关系首先要明白,这两个GUI是一个东西。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第28章STemWin多任务设计(模拟器)本期教程主要是跟大家讲一下STemWin多任务的设计,官方手册对于这部分内容在开头的时候讲的非常好,本期教程主要是把这部分内容给大家做个介绍,并在模拟器上跑一下多任务。
28. 1 单任务系统(超级循环)28. 2 多任务系统:一个任务调用emWin28. 3 多任务系统:多个任务调用emWin28. 4 官方推荐运行方式28. 5 运行多任务(模拟器)28. 6 总结28.1单任务系统(超级循环)STemWin可以配置为不使用RTOS,这时就是整个程序在一个超循环中运行。
通常,软件的所有组件都进行周期性调用。
因为未使用实时内核,所以软件的实时部分必须使用中断。
此类型系统主要用于小型系统,或者实时操作特性无关紧要时。
平时大家写裸机程序的时候基本都是下面这种方式:void main (void){/* 初始化硬件 */HARDWARE_Init();/* 初始化软件组件 */XXX_Init();YYY_Init();/* 超级循环: 规则的调用所以软件组件*/while (1){/* Exec all compontents of the software */XXX_Exec();YYY_Exec();}}加入了STemWin的初始化函数后就是下面这样:void main (void){/* 初始化硬件 */HARDWARE_Init();/* 初始化软件组件 */XXX_Init();YYY_Init();GUI_Init(); //初始化emWin/* 超级循环: 规则的调用所以软件组件*/while (1){/* Exec all compontents of the software */XXX_Exec();YYY_Exec();GUI_Exec(); //调用刷新函数}}关于emWin的使用没有实际的限定。
照例,需要在调用GUI_Init()之后才能使用该软件。
之后,任何API 函数都可使用。
如果使用了窗口管理器的回调机制,则必须定期调用emWin更新函数。
这通常通过从超循环内调用GUI_Exec()来完成。
各种模块化函数,如GUI_Delay()和GUI_ExecDialog()不应在循环中使用,因为它们会阻断其它软件模块。
可使用不支持多任务(#define GUI_OS 0)的默认配置;不需要内核接口例程。
●优点因为未使用实时内核 (->较小的ROM大小,仅一个堆栈->用于堆栈的RAM较少),所以不存在使用RTOS中的抢先/同步问题。
●缺点超循环类型程序的大小如果超出某个值,会变得很难维护。
实时特性较差,因为一个软件组件无法被 任何其它组件中断 (只能通过中断)。
这意味着一个软件组件的反应时间取决于系统中所有其它组件的执行时间。
28.2多任务系统:一个任务调用emWin使用了实时内核(RTOS)。
用户程序分成不同部分,在不同的任务中执行,这些任务通常具有不同的优先级。
通常,实时关键任务 (需要一定的反应时间)将具有最高优先级。
一个单任务用于用户界面,它调用emWin函数。
此任务在系统中通常具有最低优先级,或至少是最低优先级任务中的一个(一些统计任务或简单的空闲时间处理可能具有更低的优先级)。
中断可以但不是必须用于软件的实时部分。
如果使用了窗口管理器的回调机制,则必须从调用emWin的任务定期调用emWin更新函数(通常为GUI_Exec()、GUI_Delay())。
由 于emWin仅由一个任务调用,所以对于emWin而言,它与在单任务系统中的使用是相同的。
可使用不支持多任务(#define GUI_OS 0)的默认配置;不需要内核接口例程。
可使用任何实时内核,商用的或专用的。
●优点该系统的实时特性非常优秀。
任务的实时特性仅受以较高优先级运行的任务的影响。
这意味着对在低 优先级任务中运行的程序组件的更改完全不会影响实时特性。
如果从低优先级任务执行用户界面,则意味着用户界面的更改不影响实时特性。
因此,使用这种系统可轻松将软件的不同组件分配给开发团队的不同成员,成员彼此间可以高度独立地工作。
●缺点用户需要拥有实时内核(RTOS),这需要资金并会耗费ROM和RAM(用于堆栈)。
此外,还必须考虑任务的同步,以及如何将信息从一个任务传输到另一个任务。
28.3多任务系统:多个任务调用emWin使用了实时内核(RTOS)。
用户程序分成不同部分,在不同任务中执行,这些任务通常具有不同的优先级。
通常,实时关键任务 (需要一定的反应时间)将具有最高优先级。
多个任务用于用户界面,调用emWin 函数。
这些任务在系统中通常具有低优先级,所以它们不影响系统的实时特性。
中断可以但不是必须用于软件的实时部分。
如果使用了窗口管理器的回调机制,则必须从调用emWin的一个或多个任务定期调用emWin更新 函数 (通常为GUI_Exec()、GUI_Delay())。
不可使用不支持多任务(#define GUI_OS 0)的默认配置。
配置需要启用多任务支持并定义从中调用emWin的任务的最大数目 (摘自GUIConf.h): #define GUI_OS 1 // Enable multitasking support#define GUI_MAX_TASK 5 // Max. number of tasks that may call emWin内核接口例程是必需的,并需要与正在使用的内核匹配。
可使用任何实时内核,商用的或专用的。
●优点该系统的实时特性非常优秀。
任务的实时特性仅受以较高优先级运行的任务的影响。
这意味着对在低 优先级任务中运行的程序组件的更改完全不会影响实时特性。
如果从低优先级任务执行用户界面,则意味着用户界面的更改不影响实时特性。
因此,使用这种系统可轻松将软件的不同组件分配给开发团队的不同成员,成员彼此间可以高度独立地工作。
●缺点用户必须拥有实时内核(RTOS),这需要资金并会耗费部分ROM和RAM(用于堆栈)。
此外,还必须考虑任务的同步,以及如何将信息从一个任务传输到另一个任务。
28.4官方推荐运行方式上面介绍了三种STemWin的运行方式,下面介绍下官方推荐的运行方式:●仅从一个任务调用emWin更新函数(即GUI_Exec()、GUI_Delay()),这有助于保持程序结构清晰。
如果在您的系统中有足够的RAM,则指定一个任务 (具有最低优先级)来更新emWin。
如下面示例所示,此任务将不断调用GUI_Exec(),且不进行任何其它操作。
●保持实时任务 (它们确定I/O、接口、网络等方面的系统特性)与调用emWin的任务分开,这有助于确保最佳的实时性能。
●如果可能,仅为用户界面使用一个任务,这有助于保持程序结构简单并简化调试工作。
(当然,这不是必须的,而且可能在一些系统中不适合。
)官方推荐的这几点比较的笼统,后面我会在教程中再跟大家详细讲解。
28.5运行多任务(模拟器)这个例子在模拟器中的位置:实际运行效果如下:下面把相关的代码跟大家解释下:#ifndef SKIP_TEST#include <stddef.h>#include "GUI.h"#include "FRAMEWIN.h"#if GUI_OS == 0#error Multitasking sample requires task awareness (#define GUI_OS 1)#endif/********************************************************************* Define how to create a task and start multitasking**********************************************************************/#ifndef WIN32#include "RTOS.h" /* Definitions for embOS */#define CREATE_TASK(pTCB, pName, pFunc, Priority, pStack) OS_CREATETASK(pTCB, pName, pFunc, Priority, pStack) #define START_MT() OS_Terminate(0)#define Delay(t) OS_Delay(t)#else#include "SIM.h" /* Definitions for the Win32 simulation */#define CREATE_TASK(pTCB, pName, pFunc, Priority, pStack) SIM_CreateTask(pName, pFunc)#define START_MT() SIM_Start()#define Delay(t) SIM_Delay(t)#endif/********************************************************************* Static data**********************************************************************/#ifndef WIN32//// Stacks//static OS_STACKPTR int Stack_0[600];static OS_STACKPTR int Stack_1[600];static OS_STACKPTR int Stack_2[600];static OS_TASK aTCB[3]; // Task control blocks#endif/********************************************************************* Static code**********************************************************************//********************************************************************* _cbCallbackT0*/static int XPos;static const char aText[] = "Moving text...";static void _cbCallbackT0(WM_MESSAGE * pMsg) {(1)switch (pMsg->MsgId) {case WM_PAINT://// Handle the paint message//GUI_SetBkColor(GUI_RED);GUI_SetColor(GUI_BLACK);GUI_SetFont(&GUI_FontComic24B_ASCII);GUI_Clear();GUI_DispStringAt(aText, XPos, 0);break;default:WM_DefaultProc(pMsg);}}/********************************************************************* _cbCallbackT1*/static void _cbCallbackT1(WM_MESSAGE * pMsg) {(2)WM_HWIN hWin = (FRAMEWIN_Handle)(pMsg->hWin);switch (pMsg->MsgId) {case WM_PAINT://// Handle the paint message//GUI_SetBkColor(GUI_BLUE);GUI_SetColor(GUI_WHITE);GUI_SetFont(&GUI_FontComic24B_ASCII);GUI_SetTextAlign(GUI_TA_HCENTER | GUI_TA_VCENTER);GUI_Clear();GUI_DispStringHCenterAt("Moving window...",WM_GetWindowSizeX(hWin) / 2,WM_GetWindowSizeY(hWin) / 2);break;default:WM_DefaultProc(pMsg);}}/********************************************************************* _cbBackgroundWin*/static void _cbBackgroundWin(WM_MESSAGE* pMsg) {(3)switch (pMsg->MsgId) {case WM_PAINT://// Handle only the paint message//GUI_SetBkColor(0x00CC00);GUI_Clear();GUI_SetFont(&GUI_Font24_ASCII);GUI_DispStringHCenterAt("emWin - multitasking demo\n", 160, 5);GUI_SetFont(&GUI_Font13_1);GUI_DispStringAt("Scrolling text and moving windows without flickering", 5, 35); default:WM_DefaultProc(pMsg);}}/********************************************************************* _Task_0*/static void _Task_0(void) {(4)//// Create frame window//FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 0", NULL, WM_CF_SHOW | WM_CF_STAYONTOP, 0, 70, 200, 40); //// Create child window//WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin),WM_CF_SHOW | WM_CF_MEMDEV, _cbCallbackT0, 0);FRAMEWIN_SetActive(hFrameWin, 0);//// Make sure the right window is active...//WM_SelectWindow(hChildWin);//// ...and the right font is selected//GUI_SetFont(&GUI_FontComic24B_ASCII);while(1) {GUI_RECT Rect;int XLen;XLen = GUI_GetStringDistX(aText); // Get the length of the stringWM_GetClientRect(&Rect); // Get the size of the window//// Show moving text//for (XPos = 0; XPos < (Rect.x1 - Rect.x0) - XLen; XPos++) {WM_InvalidateWindow(hChildWin);Delay(50);}for (; XPos >= 0; XPos--) {WM_InvalidateWindow(hChildWin);Delay(100);}}}/********************************************************************* _Task_1*/static void _Task_1(void) {(5)//// Create frame window//FRAMEWIN_Handle hFrameWin = FRAMEWIN_Create("Task 1", NULL, WM_CF_SHOW | WM_CF_STAYONTOP,20, 170, 200, 40);//// Create child window//WM_HWIN hChildWin = WM_CreateWindowAsChild(0, 0, 0, 0, WM_GetClientWindow(hFrameWin), WM_CF_SHOW |WM_CF_MEMDEV,_cbCallbackT1, 0);FRAMEWIN_SetActive(hFrameWin, 0);while(1) {int i;int nx = 80;int ny = 90;//// Move window continously//for (i = 0; i < ny; i++) {WM_MoveWindow(hFrameWin, 0, -2);Delay(50);}for (i = 0; i < nx; i++) {WM_MoveWindow(hFrameWin, 2, 0);Delay(50);}for (i = 0; i < ny; i++) {WM_MoveWindow(hFrameWin, 0, 2);Delay(50);}for (i = 0; i < nx; i++) {WM_MoveWindow(hFrameWin, -2, 0);Delay(50);}}}/********************************************************************* _GUI_Task** This task does the background processing.* The MainTask job is to update invalid windows, but other things such as* evaluating mouse or touch input may also be done.*/static void _GUI_Task(void) {(6)while(1) {GUI_Exec(); // Do the background work ... Update windows etc.)GUI_X_ExecIdle(); // Nothing left to do for the moment ... Idle processing}}/*********************************************************************** Public code************************************************************************//*********************************************************************** MainTask*/void MainTask(void) {//// Init GUI//GUI_Init();WM_SetCreateFlags(WM_CF_MEMDEV); // Use memory devices on all windows to avoid flicker WM_SetCallback(WM_HBKWIN, _cbBackgroundWin); // Set callback for background window//// Create tasks//CREATE_TASK(&aTCB[0], "Task_0", _Task_0, 80, Stack_0);(7)CREATE_TASK(&aTCB[1], "Task_1", _Task_1, 60, Stack_1);CREATE_TASK(&aTCB[2], "GUI_TASK", _GUI_Task, 1, Stack_2);//// Start multitasking//START_MT();}#endif跟大家讲这个DEMO,主要是想让大家对emWin的多任务框架有个了解,对于初学者可以不必了解主要是实现了什么功能。