基于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不断刷新显示字符串,流水灯同时产生不同的变化。
//主函数模板#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*//* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/while( 1 ){}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}//LED闪烁//led.c#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "led.h" /* Led驱动接口函数的说明头文件*/#include "mx1_gpio.h" /* 包含与通用IO口相关的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "mx1_uart.h" /* 包含与串口相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*//* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_LEDDEMO 256 /* 分配给任务的堆栈大小*/#define PRIO_LEDDEMO 3 /* 任务的优先级*/OS_STK StkLedDemo[STK_SIZE_LEDDEMO];/* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void LedDemo( void *pdata ){IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/while( 1 ){LED_On( LED3 ); /* 依次点亮LED*/OSTimeDlyHMSM( 0, 0, 0, 500 ); /* 延时500毫秒*/LED_On( LED4 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED4 ); /* 依次熄灭LED*/OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/MX1_GPIO_Init(MX1_GPIO_PC); /* 初始化通用IO端口C */MX1_UART_Init(COM1); /* 初始化串口1 */IRQ_Init(); /* 初始化中断管理*/LED_Init( LED3 ); /* 初始化LED */LED_Init( LED4 );MX1_UART_PutString(COM1,"\n\r\n\ruC/OS-II is initializing...\n\r",33);OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( LedDemo, 0, &StkLedDemo[STK_SIZE_LEDDEMO-1], PRIO_LEDDEMO );MX1_UART_PutString(COM1,"Running...\n\r",12);OSStart(); /* 开始调度*/return 0;}//LED闪烁#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "led.h" /* Led驱动接口函数的说明头文件*/#include "mx1_gpio.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/LED_Init( LED3 ); /* 初始化*/LED_Init( LED5 );LED_Init( LED7 );while( 1 ){LED_On( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED5 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED5 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED7 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED7 );OSTimeDlyHMSM( 0, 0, 0, 500 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}//按钮开关#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "led.h"#include "switch.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/LED_Init( LED3 );LED_Init( LED4 );LED_Init( LED5 );LED_Init( LED6 );LED_Init( LED7 );LED_Init( LED8 );LED_Init( LED9 );LED_Init( LED10 );SWITCH_Init( SW2 ); /* 初始化开关*/SWITCH_Init( SW3 );SWITCH_Init( SW4 );SWITCH_Init( SW5 );SWITCH_Init( SW6 );SWITCH_Init( SW7 );SWITCH_Init( SW8 );SWITCH_Init( SW9 );while( 1 ){if( SWITCH_IS_ON( SW2 ) )LED_On( LED3 );elseLED_Off( LED3 );/////////////////////////if( SWITCH_IS_ON( SW3 ) )LED_On( LED4 );elseLED_Off( LED4 );/////////////////////////if( SWITCH_IS_ON( SW4 ) )LED_On( LED5 );elseLED_Off( LED5 );//////////////////////////if( SWITCH_IS_ON( SW5 ) )LED_On( LED6 );elseLED_Off( LED6 );/**************************/if( SWITCH_IS_ON( SW6 ) )LED_On( LED7 );elseLED_Off( LED7 );/////////////////////////if( SWITCH_IS_ON( SW7 ) )LED_On( LED8 );elseLED_Off( LED8 );/////////////////////////if( SWITCH_IS_ON( SW8 ) )LED_On( LED9 );elseLED_Off( LED9 );/////////////////////////if( SWITCH_IS_ON( SW9 ) )LED_On( LED10 );elseLED_Off( LED10 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}//主板I/O LED#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "led.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/LED_Init( LED3 ); /* LED的初始化,需要调用GPIO的接口设置函数*/LED_Init( LED4 );LED_Init( LED5 );LED_Init( LED6 );LED_Init( LED7 );LED_Init( LED8 );LED_Init( LED9 );LED_Init( LED10 );while( 1 ){LED_On( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED4 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED4 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED5 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED5 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED6 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED6 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED7 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED7 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED8 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED8 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED9 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED9 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED10 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED10 );OSTimeDlyHMSM( 0, 0, 0, 500 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_GPIO_Init( MX1_GPIO_PC );MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}//串口通信#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "mx1_uart.h"#include <string.h>/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){char tmp;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/MX1_UART_Init( COM1 );MX1_UART_PutString( COM1, "Input a Char:", strlen("Input a Char:") );while( 1 ){MX1_UART_GetChar( COM1, &tmp ); /* 显示输入的字符*/MX1_UART_PutChar( COM1, tmp );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}//AD转换//misc.c adc0809.c#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "mx1_uart.h"#include "adc0809.h"#include "misc.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){char tmp[16];IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/ADC0809_Init();while( 1 ){/* 将电压值放大100倍,通过串口显示*/MX1_UART_PutString( COM1, tmp, IntToStr(500*ADC0809_READ_CHANNEL( 4 )/256, tmp, 16) );MX1_UART_PutChar( COM1, ' ' );OSTimeDlyHMSM( 0, 0, 1, 0 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/MX1_UART_Init( COM1 );OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}//LCD#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "misc.h"#include "mx1_lcdc.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK 256 /* 分配给任务的堆栈大小*/#define PRIO_TASK 3 /* 任务的优先级*/OS_STK StkTask[STK_SIZE_TASK]; /* 为任务分配堆栈空间*//* 此函数定义了一个任务*/void Y ourTask( void *pdata ){int i;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/MX1_LCDC_DrawRect( 0, 0, 319, 239, 50, 50, LS_SOLID, FS_SOLID );MX1_LCDC_DrawSquare( 0,0, 120, 15, 31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawCircle( 60, 180,60, 15, 47, LS_SOLID, FS_DOTDOT );MX1_LCDC_DrawRect( 120, 120, 319, 239, 50, 47, LS_SOLID, FS_DOTDOT );MX1_LCDC_DrawEllipse( 120, 0, 319, 120, 31, 47, LS_SOLID, FS_SOLID );i=0;while( 1 ){if( i++%2 )MX1_LCDC_DrawSquare( 0,0, 120, 15, 31, LS_SOLID, FS_SOLID );elseMX1_LCDC_DrawSquare( 0,0, 120, 31, 15, LS_SOLID, FS_SOLID );OSTimeDlyHMSM( 0, 0, 1, 0 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){unsigned int palette[LCDC_CMRAM_SIZE];//#define LCDC_CMRAM_SIZE 256int i;MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/OSInit(); /* 初始化uC/OS-II内核数据结构*///初始化LCDMX1_LCDC_Init(LCDC_PANEL_WIDTH, //屏幕宽320LCDC_PANEL_HEIGHT, //屏幕高240LCDC_INIT_STARTX, //显存帧X 0LCDC_INIT_STARTY, //显存帧Y 0LCDC_VPW, //虚拟页宽1024*3LCDC_PANEL_CONF, //显示屏参数LCDC_BPP ); //像素颜色位数8 // 初始化调色板for( i=0; i<16; i++ ){palette[i] = RGB( i, 0, 0 );palette[i+16] = RGB( 0, i, 0 );palette[i+32] = RGB( 0, 0, i );palette[i+48] = RGB( i, i, i );}MX1_LCDC_CMRAM_Set( palette );/* 建立一个任务*/OSTaskCreate( Y ourTask, 0, &StkTask[STK_SIZE_TASK-1], PRIO_TASK );OSStart(); /* 开始调度*/return 0;}#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "led.h" /* Led驱动接口函数的说明头文件*/#include "mx1_gpio.h"#include "misc.h"#include "mx1_lcdc.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK1 256 /* 分配给任务的堆栈大小*/#define STK_SIZE_TASK2 256#define STK_SIZE_TASK3 256#define PRIO_TASK1 3 /* 任务的优先级*/#define PRIO_TASK2 4#define PRIO_TASK3 5OS_STK StkTask1[STK_SIZE_TASK1]; /* 为任务分配堆栈空间*/OS_STK StkTask2[STK_SIZE_TASK2];OS_STK StkTask3[STK_SIZE_TASK3];/* 此函数定义了一个任务*/void Y ourTask1( void *pdata ){IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/LED_Init( LED3 ); /* 初始化*/LED_Init( LED4 );LED_Init( LED5 );LED_Init( LED6 );while( 1 ){LED_On( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED3 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED4 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED4 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED5 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED5 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_On( LED6 );OSTimeDlyHMSM( 0, 0, 0, 500 );LED_Off( LED6 );OSTimeDlyHMSM( 0, 0, 0, 500 );}}/* 此函数定义了一个任务*/void Y ourTask2( void *pdata ){/* 在下面添加任务内容*/LED_Init( LED7 ); /* 初始化*/LED_Init( LED8 );LED_Init( LED9 );LED_Init( LED10 );while( 1 ){LED_On( LED7 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_On( LED8 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_On( LED9 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_On( LED10 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_Off( LED10 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_Off( LED9 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_Off( LED8 );OSTimeDlyHMSM( 0, 0, 0, 200 );LED_Off( LED7 );OSTimeDlyHMSM( 0, 0, 0, 200 );}}/* 此函数定义了一个任务*/void Y ourTask3( void *pdata ){int i;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/MX1_LCDC_DrawRect( 0, 0, 319, 239, 50, 50, LS_SOLID, FS_SOLID );MX1_LCDC_DrawSquare( 0,0, 120, 15, 31, LS_SOLID, FS_SOLID );MX1_LCDC_DrawCircle( 60, 180,60, 15, 47, LS_SOLID, FS_DOTDOT );MX1_LCDC_DrawRect( 120, 120, 319, 239, 50, 47, LS_SOLID, FS_DOTDOT );MX1_LCDC_DrawEllipse( 120, 0, 319, 120, 31, 47, LS_SOLID, FS_SOLID );i=0;while( 1 ){if( i++%2 )MX1_LCDC_DrawSquare( 0,0, 120, 15, 31, LS_SOLID, FS_SOLID );elseMX1_LCDC_DrawSquare( 0,0, 120, 31, 15, LS_SOLID, FS_SOLID );OSTimeDlyHMSM( 0, 0, 1, 0 );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){int i;unsigned int palette[LCDC_CMRAM_SIZE];MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*///初始化LCDMX1_LCDC_Init(LCDC_PANEL_WIDTH, LCDC_PANEL_HEIGHT,LCDC_INIT_STARTX, LCDC_INIT_STARTY, LCDC_VPW, LCDC_PANEL_CONF, LCDC_BPP );// 初始化调色板for( i=0; i<16; i++ ){palette[i] = RGB( i, 0, 0 );palette[i+16] = RGB( 0, i, 0 );palette[i+32] = RGB( 0, 0, i );palette[i+48] = RGB( i, i, i );}MX1_LCDC_CMRAM_Set( palette );OSInit(); /* 初始化uC/OS-II内核数据结构*//* 建立任务*/OSTaskCreate( Y ourTask1, 0, &StkTask1[STK_SIZE_TASK1-1], PRIO_TASK1 );OSTaskCreate( Y ourTask2, 0, &StkTask2[STK_SIZE_TASK2-1], PRIO_TASK2 );OSTaskCreate( Y ourTask3, 0, &StkTask3[STK_SIZE_TASK3-1], PRIO_TASK3 );OSStart(); /* 开始调度*/return 0;}//信号量#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "misc.h"#include "mx1_lcdc.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK1 256 /* 分配给任务的堆栈大小*/#define STK_SIZE_TASK2 256#define PRIO_TASK1 3 /* 任务的优先级*/#define PRIO_TASK2 4OS_STK StkTask1[STK_SIZE_TASK1]; /* 为任务分配堆栈空间*/OS_STK StkTask2[STK_SIZE_TASK2];OS_EVENT *pLCDSem; /* 用于LCD的信号量*//* 此函数定义了一个任务*/void Y ourTask1( void *pdata ){INT8U err;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/MX1_LCDC_DrawRect( 0, 0, LCDC_PANEL_WIDTH-1, LCDC_PANEL_HEIGHT-1, 48, 48, LS_SOLID, FS_SOLID );while( 1 ){OSSemPend( pLCDSem, 0, &err );MX1_LCDC_DrawRect( 20, 20, LCDC_PANEL_WIDTH-20, LCDC_PANEL_HEIGHT-20, 15, 15, LS_SOLID, FS_TRANS );MX1_LCDC_DrawRect( 40, 40, LCDC_PANEL_WIDTH-40, LCDC_PANEL_HEIGHT-40, 31, 31, LS_SOLID, FS_TRANS );MX1_LCDC_DrawRect( 60, 60, LCDC_PANEL_WIDTH-60,LCDC_PANEL_HEIGHT-60, 47, 47, LS_SOLID, FS_SOLID );OSTimeDlyHMSM( 0, 0, 4, 0 );MX1_LCDC_DrawRect( 20, 20, LCDC_PANEL_WIDTH-20, LCDC_PANEL_HEIGHT-20, 48, 48, LS_SOLID, FS_TRANS );MX1_LCDC_DrawRect( 40, 40, LCDC_PANEL_WIDTH-40, LCDC_PANEL_HEIGHT-40, 48, 48, LS_SOLID, FS_TRANS );MX1_LCDC_DrawRect( 60, 60, LCDC_PANEL_WIDTH-60, LCDC_PANEL_HEIGHT-60, 48, 48, LS_SOLID, FS_SOLID );OSSemPost( pLCDSem );}}/* 此函数定义了一个任务*/void Y ourTask2( void *pdata ){INT8U err;/* 在下面添加任务内容*/while( 1 ){OSSemPend( pLCDSem, 0, &err );MX1_LCDC_DrawEllipse( 20, 20, LCDC_PANEL_WIDTH-20, LCDC_PANEL_HEIGHT-20, 15, 15, LS_SOLID, FS_TRANS );MX1_LCDC_DrawEllipse( 40, 40, LCDC_PANEL_WIDTH-40, LCDC_PANEL_HEIGHT-40, 31, 31, LS_SOLID, FS_TRANS );MX1_LCDC_DrawEllipse( 60, 60, LCDC_PANEL_WIDTH-60, LCDC_PANEL_HEIGHT-60, 47, 47, LS_SOLID, FS_SOLID );OSTimeDlyHMSM( 0, 0, 4, 0 );MX1_LCDC_DrawEllipse( 20, 20, LCDC_PANEL_WIDTH-20, LCDC_PANEL_HEIGHT-20, 48, 48, LS_SOLID, FS_TRANS );MX1_LCDC_DrawEllipse( 40, 40, LCDC_PANEL_WIDTH-40, LCDC_PANEL_HEIGHT-40, 48, 48, LS_SOLID, FS_TRANS );MX1_LCDC_DrawEllipse( 60, 60, LCDC_PANEL_WIDTH-60, LCDC_PANEL_HEIGHT-60, 48, 48, LS_SOLID, FS_SOLID );OSSemPost( pLCDSem );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){unsigned int palette[LCDC_CMRAM_SIZE];int i;MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*///初始化LCDMX1_LCDC_Init(LCDC_PANEL_WIDTH, LCDC_PANEL_HEIGHT,LCDC_INIT_STARTX, LCDC_INIT_STARTY, LCDC_VPW, LCDC_PANEL_CONF, LCDC_BPP );// 初始化调色板for( i=0; i<16; i++ ){palette[i] = RGB( i, 0, 0 );palette[i+16] = RGB( 0, i, 0 );palette[i+32] = RGB( 0, 0, i );palette[i+48] = RGB( i, i, i );}MX1_LCDC_CMRAM_Set( palette );OSInit(); /* 初始化uC/OS-II内核数据结构*//* 初始化信号量,必须在OSInit()之后*/pLCDSem = OSSemCreate( 1 );/* 建立任务*/OSTaskCreate( Y ourTask1, 0, &StkTask1[STK_SIZE_TASK1-1], PRIO_TASK1 );OSTaskCreate( Y ourTask2, 0, &StkTask2[STK_SIZE_TASK2-1], PRIO_TASK2 );OSStart(); /* 开始调度*/return 0;}//消息邮箱//misc.c#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/#include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "mx1_uart.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK1 256 /* 分配给任务的堆栈大小*/#define STK_SIZE_TASK2 256#define PRIO_TASK1 3 /* 任务的优先级*/#define PRIO_TASK2 4OS_STK StkTask1[STK_SIZE_TASK1]; /* 为任务分配堆栈空间*/OS_STK StkTask2[STK_SIZE_TASK2];OS_EVENT *pMbox;char msg[11];/* 此函数定义了一个任务*/void Y ourTask1( void *pdata ){INT8U err;char *str=(char*)0;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/while( 1 ){str = OSMboxPend( pMbox, 0, &err );if( str!=0 ){MX1_UART_PutString( COM1, "Message: ", 9 );MX1_UART_PutString( COM1, str, 10 );MX1_UART_PutString( COM1, "\r\n", 2 );}}}/* 此函数定义了一个任务*/void Y ourTask2( void *pdata ){/* 在下面添加任务内容*/while( 1 ){MX1_UART_GetString( COM1, msg, 10 );msg[10]=0;OSMboxPost( pMbox, (void*)msg );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*/MX1_UART_Init( COM1 );OSInit(); /* 初始化uC/OS-II内核数据结构*//* 创建消息油箱,必须在OSInit()之后*/pMbox = OSMboxCreate( 0 );/* 建立任务*/OSTaskCreate( Y ourTask1, 0, &StkTask1[STK_SIZE_TASK1-1], PRIO_TASK1 );OSTaskCreate( Y ourTask2, 0, &StkTask2[STK_SIZE_TASK2-1], PRIO_TASK2 );OSStart(); /* 开始调度*/return 0;}//实验代码/******************* A Sample Module*******************/#include "INCLUDES.H" /* 包含与uC/OS-II相关的系统调用的头文件*/ #include "mx1_aitc.h" /* 包含与中断控制器相关的头文件*/#include "IRQ.h" /* 包含与中断管理相关的头文件*/#include "mx1_gpio.h"#include "misc.h"#include "mx1_lcdc.h"#include "switch.h"#include "led.h"/* 用于时钟中断*/extern void OSStartTimeTick( void );extern void OSTickISR( void );#define STK_SIZE_TASK1 256 /* 分配给任务的堆栈大小*/#define STK_SIZE_TASK2 256#define PRIO_TASK1 3 /* 任务的优先级*/#define PRIO_TASK2 4OS_STK StkTask1[STK_SIZE_TASK1]; /* 为任务分配堆栈空间*/OS_STK StkTask2[STK_SIZE_TASK2];OS_EVENT *pLCDSem; /* 用于LCD的信号量*/int speed;/* 此函数定义了一个任务*/void Y ourTask1( void *pdata ){INT8U err;int x,y;int directX;int directY;speed=50;x=20;y=20;directX=2;directY=1;IRQ_Register( OSTickISR, TIMER1_INT ); /* 开启uC/OS-II的时钟中断(必须在第一个运行的任务里进行) */OSStartTimeTick();/* 在下面添加任务内容*/MX1_LCDC_DrawRect( 0, 0, LCDC_PANEL_WIDTH-1, LCDC_PANEL_HEIGHT-1, 48, 48, LS_SOLID, FS_SOLID );while( 1 ){OSSemPend( pLCDSem, 0, &err );MX1_LCDC_DrawRect(x,y,x+20,y+20,0,0, LS_SOLID, FS_SOLID );if(x<=1 || x>=299)directX=-directX;if(y==0 || y==220)directY=-directY;x+=directX;y+=directY;MX1_LCDC_DrawRect(x,y,x+20,y+20,15,15, LS_SOLID, FS_SOLID );OSTimeDlyHMSM( 0, 0, 0, speed );OSSemPost( pLCDSem );}}/* 此函数定义了一个任务*/void Y ourTask2( void *pdata ){INT8U err;int i;SWITCH_Init( SW6 ); /* 初始化开关*/SWITCH_Init( SW7 );LED_Init( LED3 );LED_Init( LED4 );LED_Init( LED5 );LED_Init( LED6 );LED_Init( LED7 );LED_Init( LED8);//unsigned int t;/* 在下面添加任务内容*/while( 1 ){OSSemPend( pLCDSem, 0, &err );if( SWITCH_IS_ON( SW6 ) && speed>=35 )speed-=5;if( SWITCH_IS_ON( SW7 ) && speed<=70)speed+=5;switch(speed/10){case3:LED_On(LED3);LED_Off(LED4);LED_Off(LED5);LED_Off(LED6);break;case4:LED_On(LED4);LED_Off(LED3);LED_Off(LED5);LED_Off(LED6);break;case5:LED_On(LED5);LED_Off(LED3);LED_Off(LED4);LED_Off(LED6);break;case6:LED_On(LED6);LED_Off(LED4);LED_Off(LED5);LED_Off(LED3);break;default:LED_Off(LED6);LED_Off(LED4);LED_Off(LED5);LED_Off(LED3);break;}OSSemPost( pLCDSem );}}/* 初始化后,从这里开始执行C代码*/int __main( void ){unsigned int palette[LCDC_CMRAM_SIZE];int i;MX1_AITC_Init(); /* 初始化中断控制器*/IRQ_Init(); /* 初始化中断管理*///初始化LCDMX1_LCDC_Init(LCDC_PANEL_WIDTH, LCDC_PANEL_HEIGHT,LCDC_INIT_STARTX, LCDC_INIT_STARTY, LCDC_VPW, LCDC_PANEL_CONF, LCDC_BPP );// 初始化调色板for( i=0; i<16; i++ ){palette[i] = RGB( i, 0, 0 );palette[i+16] = RGB( 0, i, 0 );palette[i+32] = RGB( 0, 0, i );palette[i+48] = RGB( i, i, i );}MX1_LCDC_CMRAM_Set( palette );OSInit(); /* 初始化uC/OS-II内核数据结构*//* 初始化信号量,必须在OSInit()之后*/pLCDSem = OSSemCreate( 1 );/* 建立任务*/OSTaskCreate( Y ourTask1, 0, &StkTask1[STK_SIZE_TASK1-1], PRIO_TASK1 );OSTaskCreate( Y ourTask2, 0, &StkTask2[STK_SIZE_TASK2-1], PRIO_TASK2 );OSStart(); /* 开始调度*/return 0;}任务调度发生于:1)开启多任务,OSStart();2)新建一个任务,OSTaskCreate 或OSTaskCreateEx3)中断返回,OSIntExit4)时间延迟,OSTimeDly 或OSTimeDlyHMSM5)任务请求事件而未得到,OSSemPend OSMboxPend OSFlagPend OSMutexPend OSQPend OSEbentPendMulti6)任务释放事件且有任务正在请求,OSSenPost OSMboxPost OSMboxPostOpt OSMutexPost OSQPost OSQPostFront OSQPostOpt OSFlagPost7)任务被挂起或恢复,OSTaskSuspend OSTaskResume8)任务被删除,OSTaskDel9)任务延时被取消,OSTimeDlyResume10)调用系统时钟节拍函数,OSTimeTick。
课程设计报告题目基于UCOSII的LCD驱动设计专业通信工程学号授课班号学生姓名指导教师摘要近年来,嵌入式系统的应用已经越来越普及,对人类社会产生了巨大的影响。
μC/OS-II作为一种高可靠性的实时嵌入式操作系统已经被广泛使用在实际中,并且其具有简单易学、便于移植等特点。
本文综述了嵌入式系统发展现况,分析了μC/OS-II内核及其应用在8051单片机上的特点,并介绍了μC/OS-II编写驱动的方法和规则。
本设计以Keil C51为开发环境,通过修改函数使其可重入、修改堆栈设计等步骤,将μC/OS-II移植到了89C51单片机上,并编写了单片机上的LED模块、键盘模块及串行通讯模块的驱动,验证了移植μC/OS-II的正确性。
LCD是嵌入式操作系统的重要组成部分,是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
用户可以只通过LCD监测系统内部运行状态,然后作出相应的处理。
因而具有良好的人机界面的嵌入式操作系统能过很好的完成系统开发、生产生活的需要!关键词:μC/OS-II;8051单片机;移植;驱动程序绪言1.ucos-II的简介及特点(1)简介μC/OS-II由Micrium公司提供,是一个可移植、可固化的、可裁剪的、占先式多任务实时内核,作者是Micrium公司总裁Jean brosse。
由于μC/OS-II 的绝大部分代码是用ANSI C写的,因此可以较为方便的移植到多种微处理器,微控制器和数字处理芯片中(目前已经移植到超过100种以上的微处理器应用中)。
同时,该系统源代码开放、整洁、一致,注释详尽,适合系统开发。
μC/OS-II 已经通过联邦航空局(FAA)商用航行器认证,符合航空无线电技术委员会(RTCA)DO-178B标准,虽然这一特性对用户的需求并不一定实用,但却可在一定程度上证明该系统的稳定和安全性。
(2)特点1、公开源代码:源代码完全公开;2、可移植性强:和处理器硬件相关的部分是用汇编些的,绝大部分是用C语言写的,可移植性很强;可以移植到8、16、32、64位处理器上运行;3、可固化:可固化到产品中,称为嵌入式产品的一部分;4、可裁剪:应用程序可以只使用需要的系统服务。
AN1201 UCOSII实例讲解扩展实验14:UCOSII多任务运行LED+KEY+LCD+触摸画笔1.实验目的:测试UCOSII多任务的创建和运行。
2.实现现象:LED0,LED1循环闪烁,LCD部分区域循环变色,触摸屏下半部分具有触摸画板功能,按下KEY0按键可以进入触摸校准界面。
3.用到的UCOSII函数简析:UCOSII初始化函数:void OSInit (void) //UCOSII初始化任务创建函数:INT8U OSTaskCreate (void (*task)(void *pd),void*pdata,OS_STK *ptos,INT8U prio);启动任务函数:void OSStart (void);//启动任务延时函数 OSTimeDlyHMSM(0,0,0,200);这里我们着重介绍一下OSTaskCreate()函数和OSTimeDlyHMSM()函数: 这个函数的入口参数是任务指针,任务传递参数,任务堆栈栈顶指针以及任务优先 级。
在这里我们介绍一下这几个入口参数的作用:1)任务优先级:多任务执行的时候,操作系统必须选择一个任务来执行,因为一个CPU同一时间只能执行一个任务,这里UCOSII是按优先级抢占式规则来选择任务的,所以对于每个任务,都会定义一个优先级,而且优先级是唯一的。
2)任务堆栈:存储器中按先进后(LIF0)出原则组织的连续存储空间,作用是满足任务切换和相应中断时保存CPU寄存器的内容和任务调用其他函数的需要。
这里学过单片机的人都知道中断的时候有一个现场保护的概念,现场保护就是用到堆栈。
定义堆栈的方式:OS_STK TASK_START_STK[START_STK_SIZE];其中START_STK_SIZE是我们宏定义的任务堆栈的大小。
3)任务指针:就是指向任务执行入口地址的指针了。
C语言里面函数名字就可以看做函数的入口地址了。
4)任务传递参数:这个就不用讲解,顾名思义就是传递给任务的参数了。
基于μC/OS- II的键盘驱动的实现第一章绪论一.嵌入式系统简介嵌入式系统着眼于应用,己被人们定义为“以应用为中心、以计算机技术为基础、软件硬件可裁减、适应于应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”。
嵌入式系统是将先进的计算机技术、半导体技术、电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。
嵌入式系统具有一般计算机组成的共性,都是由硬件和软件组成的。
嵌入式系统的硬件部分,是以嵌入式处理器为中心,配合存储器、I/O设备、通信模块、扩展设备接口以及电源等必要的辅助接口组成。
嵌入式系统软件部分,一般是按3层划分的:设备驱动层、实时操作系统层、应用程序层。
嵌入式系统的硬件是嵌入式系统的基础,决定了嵌入式系统的运算速度和扩展功能等,提供了嵌入式软件运行的物理平台和通信接口;嵌入式系统的软件是嵌入式系统的灵魂,包括嵌入式操作系统和嵌入式应用软件,决定了硬件的操作模式,通过操作系统和应用程序发挥硬件装置的功能。
嵌入式系统是应用于特定环境下,面对专业领域、针对特定用途的系统,所以与通用计算机系统的多样化和适用性不同。
与通用计算机系统相比,它具有以下显著的特点:1)嵌入式系统通常是面向特定应用的,是“专用”的计算机系统;2)嵌入式系统一般使用实时操作系统;3)嵌入式系统是技术密集、资金密集、高度分散、不断创新的知识集成系统;4)嵌入式系统具有功耗低、体积小、集成度高、成本低的特点;5)嵌入式系统的硬件和软件通过量体裁衣、去除冗余,可以用较少的软硬件资源实现较高的性能;6)嵌入式系统与具体的行业应用相结合;7)嵌入式系统的软件一般都固化在非易失性存储器中,提高了执行速度和系统可靠性。
二.本课题的主要研究工作本课题采用高性能嵌入式处理器S3C2410X和μC/OS-II 操作系统,开发了一个轻型嵌入式串行通信系统。
实验一、一个简单的μC/OS-II应用程序设计一、实验目的1、熟悉μC/OS-II应用程序编写的实验环境设置;2、掌握μC/OS-II应用程序的编写、编译、下载、运行的基本步骤;3、了解μC/OS-II操作系统源码的基本结构;4、熟练掌握编写μC/OS-II应用程序的基本要求和步骤。
二、实验设备2.1硬件本实验采用的奋斗版STM32 MINI开发板,该开发板的硬件图如图1所示,该板可外接触摸屏。
请仔细观测开发板上的主要器件,在下面的实验中尤其要注意【启动模式选择】插针,当插针接上时为开发板运行模式,断开时为开发板烧录模式。
图1-1、奋斗STM32 MINI开发板硬件示意图本实验中需要将硬件的串口接USB转串口线,电源是通过USB接口进行供电,烧录时需要将【启动模式选择】插针拔掉。
2.2软件Windows XP/Windows 7、RealView MDK、μC/OS-Ⅱ版本2.86 与移植包、ST 官方标准库V3.2 版、STM32™ and STM8™Flash loader demonstrator,串口调试工具等。
三、实验内容3.1 实验环境搭建本实验是第一次使用μC/OS-II操作系统,在实验之前首先需要熟悉μC/OS-II实验系统的环境设置。
在2.1节已经介绍奋斗mini ARM板的线路连接方式,由于现在的PC机上一般不提供串口,所以需要使用USB转串口线,并安装相应的USB转串口驱动程序包,可根据USB转串口线的型号在互联网上搜索找到需要的驱动程序(注意:可能需要多试验几次才会找到合适的驱动程序包)。
安装完成后可以在设备管理器中看到虚拟串口信息,如图1-2所示。
鼠标右键点击电脑桌面【我的电脑】,点击【设备管理器】可弹出设备管理器界面。
虚拟串口名字可以通过点击端口查看,例如图1-3中显示的虚拟串口名是COM8。
图1-2、打开设备管理器界面图1-3、设备管理界面接下来需要安装μC/OS-II编辑、编译开发工具。
天津电子信息职业技术学院课程设计课题名称基于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);}}。