基于uCOSⅡ的LCD驱动编写
- 格式:docx
- 大小:334.43 KB
- 文档页数:11
在μC/OS-II下,设计了一个通用的设备管理模型,称为通用驱动框架,通过该驱动框架,可以实现对硬件设备的统一、一致的管理,同时,也为上层应用程序提供了统一、一致的设备访问在μC/OS-II下,设计了一个通用的设备管理模型,称为通用驱动框架,通过该驱动框架,可以实现对硬件设备的统一、一致的管理,同时,也为上层应用程序提供了统一、一致的设备访问接口,并在以ARM7TDMI-S为核心的LPC2210微控制器开发板上给出了一例实现。
1、概述在嵌入式应用系统中使用嵌入式操作系统可以提高应用系统的开发效率和提升嵌入式应用系统的稳定可靠性,因此,在嵌入式应用系统中使用嵌入式操作系统将成为嵌入式应用系统的设计主流[1]。
μC/OS-II是由美国学者Labrosse设计的一个优秀的嵌入式实时操作系统[2],它是一个源码公开、可移植、可固化、可裁剪、占先式的实时多任务操作系统,目前已经得到广泛应用。
μC/OS-II提供了操作系统必须具备的基本功能,包括:任务管理、信号量管理、邮箱管理、消息队列管理、事件管理、时间管理、内存管理,但它不提供设备管理和文件系统管理,已有研究者对μC/OS-II进行了文件子系统功能扩展[3]。
在实际应用中,对系统设备的有效管理也是一个非常重要的任务,因此,需要对μC/OS-II进行扩展,以实现这一功能。
本文为μC/OS-II设计了一个对系统设备进行统一管理的通用驱动框架,在此框架下,可以屏蔽系统硬件的差异,在无约束地发挥硬件能力的前提下,为上层应用提供了统一、一致的调用接口 API,从而实现了对系统设备的有效管理。
2、μC/OS-II下通用驱动框架的基本模型为了给上层应用提供统一、一致的系统设备调用接口,需要对上层应用程序对系统设备的访问操作进行抽象,在这方面,Unix系统和Linux系统做得比较成功[4][5]。
本文借鉴了Unix及Linux系统的成功经验,同时考虑到嵌入式操作系统的特殊性,为μC/OS-II建立了如图1所示的通用驱动框架模型。
stm32 UCGUI 完美移植作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment前一篇:stm32 DA 数模转换后一篇:Stm32 SWD 下载 调试配置UCGUI是一种嵌入式应用中的图形支持系统。
它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。
它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。
UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。
类似程序还有国产的一个MINIGUI (/zhcn/),MiniGUI 是一个自由软件项目。
其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时嵌入式操作系统。
有机会尝试下,支持下国产,毕竟国内这样的公司不多。
这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。
但是目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。
一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。
UCGUI390a 下载整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。
总之移植是个累人的活首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的触摸屏可以参考 stm32 驱动 T F T LCD stm32 驱动 触摸屏 两篇文章UCGUI的文件数量很大,主要用到UCGUI390a/Start/Con f ig 和 UCGUI390a/Start/GUI两个文件夹下文件,不过文件数量也已经很多了 。
实验五ucOS II内存管理及显示驱动实验一、实验目的●回顾uC/OS II 在Cortex-M3(LM3S9B2芯片)平台上的移植,以及RS232串口、TFT显示等驱动程序的加载。
●回顾µC/OS-II任务管理的基本函数调用,任务堆栈、任务控制块、任务就绪表的结构和作用。
●掌握操作系统存储管理方法,以及在uC/OS II 中采用的存储光管理方法。
●掌握uC/OS II中和存储管理相关的基本函数,实现原理以及应用方法。
●应用µC/OS-II中的存储管理机制处理简单的实际问题。
二、实验环境与设备1、实验独立进行,每位学生上交一份实验报告及其相应的程序。
2、安装Windows操作系统(Windows Xp)的计算机,并且已经安装VC 6.0编程调试软件。
3、安装Keil for ARM 仿真调试软件,JLink软件,超级终端或者串口精灵等辅助调试工具。
4、Cortex-M3(LM3S9B92内核)评估板,串口线,USB线,电源等。
三、预习要求1. 基础内容在ANSI C 中是使用malloc 和free 两个函数来动态分配和释放内存。
例如在Linux 系统中就是这样。
但在嵌入式实时系统中,多次这样的操作会导致内存碎片,因为嵌入式系统尤其是uCOS是实地址模式,这种模式在分配任务堆栈时需要整块连续的空间,否则任务无法正确运行。
且由于内存管理算法的原因,malloc 和free的执行时间也是不确定。
这点是实时内核最大的矛盾。
基于以上的原因uC/OS‐II中把连续的大块内存按分区管理。
每个分区中包含整数个大小相同的内存块,但不同分区之间的内存快大小可以不同。
用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。
释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。
同时uCOS‐II 根据以上的处理封装了适合于自己的动态内存分配函数OSMemGet()和OSMemPut(),但是使用这两个函数动态分配内存前需要先创建内存空间即内存分块。
μC/OS-II实时内核下的A/D驱动程序设计关于应用RPT在性能测试的思考谈谈嵌入式操作系统的调试问题软件测试中的性能测试的容量评估上海英孚教育急聘系统管理员初级程序员软件开发工程师数据库工程师高级项目经理界面设计经理中国IT实验室整理佚名2008-12-24 保存本文推荐给好友收藏本页欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入本文详细分析在μC/OS-II实时内核下驱动程序读取A/D的三种方法;阐述C8051F015单片机的A/D转换器的配置、转换特点及其驱动程序读取A/D采用的方法;针对C8051F015单片机分析A/D驱动程序设计的方法和思想。
这些方法和思想为在μC/OS-II下访问其它类型的A/D提供了很好的借鉴。
A/D转换是单片机数据采集系统的重要组成部分,实时内核下A/D驱动程序的实现过程主取决于A/D转换器的转换时间。
本文首先比较和分析μC/OS-II 下A/D采样数据的三种方法;其次介绍C8051F015单片机A/D模数转换器配置及特点;最后,在μC/OS-II内核移植到8位单片机C8051F015的基础上,介绍编写A/D驱动程序的一般思想和方法。
1 μC/OS-II实时内核下的A/D读方法实时内核下,驱动程序采用什么方法读取A/D采样数据是首先考虑的问题。
许多因素将影响读取A/D,如A/D的转换时间、模拟值的转换频率、输入通道数等,但最主要的取决于A/D的转换时间。
典型的A/D转换典型的A/D转换电路由模拟多路复用器(MUX)、放大器和模数转换器(ADC)三部分组成。
下面描述读取A/D 的三种方法。
图1所示的是第1种读取方法。
假设A/D转换器的转换时间较慢(5ms以上)。
应用程序调用图1所示的驱动程序,并传递要读取的通道。
驱动程序通过MUX选择要读取的模拟通道(①)开始读。
有,延时几μs以便使信号通过MUX传递,并之稳定下来。
接着,ADC被触发开始转换(②)。
基于ucOSII ucGUI 的LED闪烁控制例程手册作者Sun68嵌入式实时操作系统uCosII是由美国工程师Jean brosse所创,它在中国的流行源于那本被邵贝贝引进翻译的著名书籍《嵌入式实时操作系统uCos-II》,这本书是学习ucosII 的宝典,虽然很厚,但理解了关键概念,再结合实际应用例程,还是很容易看懂的。
uCosII 通过了美国航天管理局(FAA)的安全认证,可以用于飞机、航天器与人性命攸关的控制系统中。
也就是说,用户可以放心将uCosII用到自己的产品中, ucGUI也是Micrium公司的产品,在本例程里使用了ucGUI3.90版本,它为嵌入式应用提供了功能强大的图形用户接口,使得用户在开发具有人机界面的应用时,可以很方便做出复杂精致的用户显示界面。
并提供了交互的接口。
uCOSII特点:可移植性:uCosII源码绝大部分是用移植性很强的ANSI C写的。
与微处理硬件相关的部分是用汇编语言写的。
uCOS可以在绝大多数8位、16位、32位以及64位处理器、微控制器及数字信号处理器(DSP)上运行。
可裁剪性:可以通过开关条件编译选项,来定义哪些uCosII的功能模块用于用户程序,方便控制代码运行所占用的空间及内存。
可剥夺性:uCOSII是完全可剥夺型的实时内核,它总是运行处于就绪状态下的优先级最高的任务。
多任务:uCOSII可以管理64个任务,每个任务对应一个优先级,并且是各不相同。
其中8个任务保留给uCOSII。
用户的应用程序可以实际使用56个任务。
可确定性:绝大多数uCosII的函数调用和服务的执行时间具有可确定性,也就是说用户总是能知道函数调用与服务执行了多长时间。
任务栈:每个任务都有自己单独的栈,uCOSII规定每个任务有不同的栈空间。
系统服务:uCOSII提供很多系统服务,例如信号量、互斥信号量、事件标志、消息邮箱、消息队列、内存的申请与释放及时间管理函数等。
中断管理:中断可以使正在执行的任务暂时挂起,中断嵌套层数可达255层。
LCD驱动程序之代码编写实现LCD驱动程序编写前⾯通过对linux内核中LCD的驱动框架进⾏了分析,弄清楚了内核中LCD的驱动框架,通过分析知道内核中已经在fbmem.c⽂件中注册了LCD这⼀类设备的字符设备驱动,向上实现了上层通⽤的访问接⼝,向下给驱动设计者预留了fb_info注册接⼝。
现在基于我们的开发板平台(JZ2240),编写适配于⾃⼰硬件的驱动程序从前⾯分析可以知道,编写LCD驱动需要驱动的编写者去完成以下内容(可参考内核中s3c2410fb.c):1)分配⼀个fb_info结构体2)根据使⽤LCD硬件特征,设置fb_info结构体的⼀些参数3)配置硬件相关操作4)注册fb_info结构体下⾯我们就开始按照这些步骤,完成LCD驱动程序的编写1、fb_info结构体介绍fb_info结构体是LCD驱动程序中最核⼼的数据结构,应⽤程序通过fbmem.c⽂件中注册的设备访问⼊⼝,找到打开设备⽂件的fb_info结构体,最终访问到硬件,fb_info结构体声明如下:struct fb_info {int node;int flags;struct fb_var_screeninfo var; /* Current var */struct fb_fix_screeninfo fix; /* Current fix */struct fb_monspecs monspecs; /* Current Monitor specs */struct work_struct queue; /* Framebuffer event queue */struct fb_pixmap pixmap; /* Image hardware mapper */struct fb_pixmap sprite; /* Cursor hardware mapper */struct fb_cmap cmap; /* Current cmap */struct list_head modelist; /* mode list */struct fb_videomode *mode; /* current mode */#ifdef CONFIG_FB_BACKLIGHT/* assigned backlight device *//* set before framebuffer registration,remove after unregister */struct backlight_device *bl_dev;/* Backlight level curve */struct mutex bl_curve_mutex;u8 bl_curve[FB_BACKLIGHT_LEVELS];#endif#ifdef CONFIG_FB_DEFERRED_IOstruct delayed_work deferred_work;struct fb_deferred_io *fbdefio;#endifstruct fb_ops *fbops;struct device *device; /* This is the parent */struct device *dev; /* This is this fb device */int class_flag; /* private sysfs flags */#ifdef CONFIG_FB_TILEBLITTINGstruct fb_tile_ops *tileops; /* Tile Blitting */#endifchar __iomem *screen_base; /* Virtual address */unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */void *pseudo_palette; /* Fake palette of 16 colors */#define FBINFO_STATE_RUNNING 0#define FBINFO_STATE_SUSPENDED 1u32 state; /* Hardware state i.e suspend */void *fbcon_par; /* fbcon use-only private area *//* From here on everything is device dependent */void *par;};可以看到fb_info的结构体⽐较复杂,它的肯定是为了抽象出所有LCD硬件⽽设计的,但我们不需要去了解每⼀个成员变量的功能和使⽤⽅法。
计算机科学与技术学院嵌入式系统设计课程设计设计题目:基于μC/OS-II的贪吃蛇游戏嵌入式系统实现方案设计专业班级:计算机科学学院2008级(2)班组员:指导教师:设计时间:2011/7/4~2011/7/8 设计地点:明理楼B319基于μC/OS-II的贪食蛇游戏设计μC/OS-II实时操作系统简介μC/OS-是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。
μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。
μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。
μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至 2KB 。
μC/OS-II 已经移植到了几乎所有知名的CPU 上。
严格地说μC/OS--II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于μC/OS--II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
一、方案论证方案一如图1.1所示,采用AT89C52和1602液晶显示。
AT89C52芯片是一款非常常用的芯片,具有32个IO口及多个定时器中断,添加外部ram后能够实现ucos-II的移植。
这里AT89C52作为主控芯片,实现多任务操作。
如1602不断刷新显示字符串,流水灯同时产生不同的变化。
天津电子信息职业技术学院课程设计课题名称基于uCOSⅡ的LCD驱动编写姓名王浩学号35班级电信S10-1专业电子信息工程成绩完成日期2012-06-01基于uCOSII的LCD驱动编写摘要LCD是嵌入式操作系统的重要组成部分,是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
用户可以只通过LCD监测系统内部运行状态,然后作出相应的处理。
因而具有良好的人机界面的嵌入式操作系统能过很好的完成系统开发、生产生活的需要。
S3C44B0X 中具有内置的LCD 控制器,它能将显示缓存(在SDRAM存储器中)中的LCD 图像数据传输到外部的LCD驱动电路上的逻辑功能。
它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。
在显示灰度时,它采用时间抖动算法(time-based dithering algorithm)和帧率控制 (Frame Rate Control)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。
通过软件编程,可以实现233或332的RGB调色的格式。
对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD 控制器中的相应寄存器写入不同的值,来配置不同的LCD 显示板。
LCD能够正常工作得益于软硬件的协同工作,S3C44B0X集成了LCD的控制器,即不带驱动电路的LCD显示模块,驱动程序需要根据用户需要来自行添加。
u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,在具体应用中稳定可靠,并且支持uIP TCP/IP协议栈、ucGUI等,可扩展性强,功能强大。
因此,在uC/OS II下写的LCD驱动具有较好的实时性和稳定性,功能强大。
关键词:嵌入式系统;LCD显示;驱动电路;目录一、系统设计 (4)1.课题目标及总体方案 (4)2.LCD驱动程序组成 (4)3.UCOSII操作系统下添加LCD驱动程序 (5)4.应用程序 (5)二、实验结果测试 (6)三、总结 (7)四、心得体会 (8)五、参考文献 (9)六、附录 (9)一、系统设计1.课题目标及总体方案首先学习了解LCD的驱动程序,然后在移植好的UCOSII项目中添加LCD的驱动程序, 最后能够在uCOSII下,编写LCD应用任务的简单编程实例,来检验LCD驱动程序的完好度。
本实验实例为在LCD屏上显示跑马灯,同时模拟CPU板上D7、D8灯的交替闪烁,闪烁周期为跑马灯周期。
2.LCD驱动程序组成LCD驱动程序的文件夹Gui(如图1所示),其中,包括四个文件夹:图1Font中存放的是字体文件,存放四个文件,Font_Cn12.c为调用汉字库12X12汉字的引用文件;Font_Cn16.c为调用汉字库16X16汉字的引用文件;Font8X16为调用ASCII码的源文件,它的大小为8X16;Gchar.c为显示字符的源程序库。
Glib中存放绘图的中层和上层的函数,上层函数是直接供用户调用的API,。
Glib文件夹内存放两个文件,Glib.c是图形显示库的源代码,它主要实现LCD的中层和上层供用户调用的API函数,Glib.h则是供其他文件或自身调用的头文件。
Init中存放GUI初始化的函数,Init文件夹内存放两个文件,data.h是数据类型重定义的文件,GUI_Init.c是GUI系统的初始化文件。
Lcddriver中存放的是LCD的底层驱动函数,以及对LCD控制器的初始化函数。
Lcddriver文件内存放两个文件,Lcddriver.c包括LCD的底层读写内存用来绘图的函数,以及初始化LCD控制寄存器的初始化硬件的函数。
Lcddrive是供其他文件或自身调用的头文件。
3.UCOSII操作系统下添加LCD驱动程序在UCOSII操作系统下添加LCD驱动程序,也就是把整个GUI文件夹加入该项目里。
同时,还要在Application\INC目录下的config.h文件中,加入GUI程序的头文件,#include "..\..\Gui\Glib\Glib.h",这是为了在应用中方便调用画图的API函数。
如果,要在LCD上显示英文或汉字,还要在Application\SRC\Main.c中声明引用的是extern GUI_FONT CHINESE_FONT12;等外部定义过的字体。
这样,编译就能通过,就把LCD 的驱动程序以及小型的GUI图形库,加载到了UCOSII操作系统上了。
在UCOSII操作系统下,要单独开辟一个GUI任务,进行画图,一般这个任务的优先级很低,一般它仅比空闲任务的优先级高,这样做是为了可以使更多的任务等级显示在屏上。
在Application/SRC下的MAIN.C文件,有GUI的应用任务,绘图的API函数即放在这里,或者作一个应用函数的文件,在此任务里调用。
所有的对LCD显示操作内容要在MAIN.C 文件中编写。
4.应用程序本实验实例为在LCD屏上显示跑马灯,同时模拟CPU板上D7、D8灯的交替闪烁,闪烁周期为跑马灯周期。
来检验LCD驱动程序是否能正常工作。
实验流程图如下:程序开始先进行各项初始化,包括开发板、GUI初始化、系统初始化,然后配置LCD 屏幕设置,运行时先调用跑马灯延时程序Timedelay(),跑马灯运行一周后,置开发板上D7、D8灯亮灭,通过信号传递置LCD屏幕上模拟D7D8灯亮灭,接着调用Timedelay()函数,循环任务。
二、实验结果测试测试方法:①在移植好的UCOSII项目中添加LCD的驱动程序。
(方法参见第一章第二节)②在main.c文件中编写程序(源程序见附录),先使用画图函数绘出包含跑马灯,模拟D7、D8两灯在内的LCD界,用函数timedelay()控制跑马灯运行,timedelay()亦是延时函数。
D7、D8两灯每交替闪说一次,调用一次timedelay()延时函数。
③连接电脑和试验箱,编译程序,无错误,把程序下载到S3C44B0X,观察结果。
④观察现象,有问题检查修改MAIN.C文件。
LCD界面显示如下:图2三、总结实验结果显示出预期的LCD界面,LCD屏幕显示预定图案(如图2)。
屏幕上D7、D8随CPU板上的D7,D8两灯同步闪烁,而且跑马灯每转一周,两个等交替闪烁一次。
说明LCD驱动即添加到内核中没有问题,系统工作正常。
四、心得体会课程设计完成了,在这个过程中我学到了很多东西。
我对嵌入式系统有了更加深入的了解,对书本上的知识也有了更加深刻的理解,对以前有些含糊不理解的地方也有了新的认识。
学会使用嵌入式系统实现问题解决的一般过程,在UCOSII下,LCD驱动程序的结构,以及LCD驱动程序怎样添加道内核中去,也能够使用嵌入式系统设计制作一些简单实例。
这次课程设计给我们理论联系实际的机会,书本上的东西很抽象,通过这次课程设计,能够把自己的想法和设计实现是一件很开心的事情,而依靠自己独立思考发现并解决一个问题也更是一件开心的事情。
课程设计中也遇到了许多问题,比如:老师给的参考程序并不能是LCD屏幕和CPU实验板上的灯同步闪烁,最后多次检查并和同学讨论才发现问题所在,问题程序代码如下:for(i=0;i<100000;i++);rPCONB = 0x7cf;rPDATB = 0x7ef;for(i=0;i<100000;i++); //***问题所在****{ 处理函数}当设置CPU板D7、D8灯亮灭后,又通过for(i=0;i<100000;i++);延时一段时间,才去修改LCD屏幕上的LCD两个灯,当去掉第二行延时代码时,LCD屏幕模拟的灯泡和CPU实验板上的D7、D8等同步闪烁。
课程设计让我认识到个人的力量是渺小的,依靠一个人的努力也是不够的,许多事情只有靠大家精诚合作,一起思考讨论,分工协作,才能完成。
大家之间要默契配合,相互理解,阐述各自对问题不同看法、不同理解的相互交流是发现问题学的新知的良好契机。
课程设计很快就结束了,我觉得最大的收获就是能够理论联系实际,把书本上的知识活学活用道实际中来解决一些实际问题,这样才能发挥用途。
独立思考解决问题,并能够接受他人意见来修正完善自己的想法,最终付诸于实现。
五、参考文献[1] 王永,何立民.嵌入式系统原理与设计[M].浙江:浙江大学出版社.[2] Jean J. Labrosse著 ; 邵贝贝等译.嵌入式实时操作系统μC/OS-Ⅱ第2版[M] .北京:北京航空航天大学出版社.六、附录1.主函数void Main(void){Target_Init(); // ARMII实验系统的初始化,包括CPU板GUI_Init();OSInit(); // 操作系统的初始化Send_D7light_Sem = OSSemCreate(0); //创建信号量Send_LCD_Sem = OSSemCreate(0);OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1[STACKSIZE - 1], 5);OSTaskCreate(Task_2, (void *)0, (OS_STK *)&Stack_Task_2[STACKSIZE*3 - 1], 6);OSSemPost(Send_LCD_Sem);OSStart();}2.跑马灯闪烁程序(即延时程序)void timedelay(){INT32U i,k ;for(i=0;i<8;i++){k=i%8;switch(k){case 0 : Set_Color(GUI_RED);Fill_Circle (220, 80, 20); //跑马灯1 亮Set_Color(GUI_GREEN);Fill_Circle (262, 98, 20); //跑马灯2灭Fill_Circle (280, 140, 20); //跑马灯3灭Fill_Circle (262, 182, 20); //跑马灯4灭Fill_Circle (220, 200, 20); //跑马灯5灭Fill_Circle (178, 182, 20); //跑马灯6灭Fill_Circle (160, 140, 20); //跑马灯7灭Fill_Circle (178, 98, 20); //跑马灯8灭break;case 1 :{处理函数1};//省略,类似case 0处理函数case 2 :{处理函数2};//省略,类似case 0处理函数case 3 :{处理函数3};//省略,类似case 0处理函数case 4 :{处理函数4};//省略,类似case 0处理函数case 5 :{处理函数5};//省略,类似case 0处理函数case 6 :{处理函数6};//省略,类似case 0处理函数case 7 :{处理函数7};//省略,类似case 0处理函数}}}3.控制CPU板上D7、D8和LCD模拟灯同步闪烁部分程序for(;;){OSSemPend(Send_D7light_Sem, 0, &err);if(flag==0){Set_Color(GUI_RED);Fill_Circle(60, 160, 20); ///LCD模拟D7亮Set_Color(GUI_BLACK);Fill_Circle(60, 100, 20);flag = 1;}else{Set_Color(GUI_BLACK);Fill_Circle(60, 160, 20); //LCD模拟D8亮Set_Color(GUI_RED);Fill_Circle(60, 100, 20);flag = 0;}OSSemPost(Send_LCD_Sem);}void Task_1(void *pdata){INT8U err;INT32U flag=0;Rtc_Tick_Init(); //打开时钟节拍,让操作系统跑起来for(;;){OSSemPend(Send_LCD_Sem, 0, &err);if(flag==0){timedelay(); //调用延时rPCONB = 0x7cf;rPDATB = 0x7ef; //CPU板上D7亮flag = 1;}else{timedelay(); //调用延时rPCONB = 0x7cf;rPDATB = 0x7df; //CPU板上D8亮flag = 0;}OSSemPost(Send_D7light_Sem);}}。