第七讲 基于UCOSⅡ的软件设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1嵌入式系统设计与实例开发——ARM与C/OS-Ⅱ第七讲基于C/OS-Ⅱ的软件设计2本节提要132546基于COS-II扩展RTOS图形用户接口设计外设及驱动文件系统的设计系统的消息嵌入式GUI简介3基于COS-II扩展RTOS将COS-II移植到自己的硬件平台以后,接下来的工作就是对操作系统本身的扩充。介绍如何对COS-II进行必要的扩展,建立一个简单实用的实时操作系统(RTOS)4为什么要扩展uCOS-IICOS-II仅仅一个实时多任务的内核,移植了COS-II以后,离实际的应用还是有一段距离的。要想实现一个相对完整、实用的嵌入式的实时多任务操作系统(RTOS),还需要相当多的扩展性的工作。5具体的扩展工作建立文件系统;外设及驱动程序的实现;基于Unicode汉字库的实现方法;基本绘图函数的实现;其它实用API函数;6基于COS-II扩展RTOS的体系结构LCDUSB键盘海量存储器硬件LCD240.hUSB.hKeyboard16.hFlash.h时钟日历Rtc.h驱动程序drv.h基于uCOS-II的RTOS内核消息队列信号量邮箱API函数绘图函数Display.h文件管理函数File.h文件读写函数OSFile.h后台缓冲区任务调度模块双向链表函数List.h动态内存管理系统消息队列OSMessage.hLCD刷新键盘扫描用户任务1主任务用户任务2用户任务n系统任务信号量系统消息用户应用程序系统控件函数Control.h任务之间的通讯用户界面71.系统外围设备的硬件部分系统外围设备的硬件部分包括:液晶显示屏(LCD)、USB通信模块、键盘、海量Flash存储器、系统的时钟和日历。外围设备的硬件部分是保证系统实现指定任务的最底层的部件。2、驱动程序模块驱动程序是连接底层的硬件和上层的API函数的纽带,有了驱动程序模块,就可以把操作系统的API函数和底层的硬件分离开来。硬件的改变、删除或者添加,只需要随之改变、删除或者添加提供给操作系统的相应的驱动程序就可以了。而不会影响到API函数的功能,更不会影响到用户的应用程序。83.操作系统的API函数在操作系统中提供标准的应用程序接口(API)函数,可以加速用户应用程序的开发,统一应用程序的标准,同时也给操作系统版本的升级带来了方便。在API函数中,提供了大量的常用模块,可以大大简化用户应用程序的编写。4.实时操作系统的多任务管理C/OS-Ⅱ作为操作系统的内核,主要的任务就是完成多任务之间的调度和同步。5.系统的消息队列这里所说的系统的消息队列是以C/OS-Ⅱ的消息队列派生出来的系统消息传递机制,用来实现系统的各个任务之间、用户应用程序的各个任务之间以及用户应用程序和系统的各个任务之间的通信。96.系统任务系统任务主要包括液晶显示屏(LCD)的刷新任务、系统键盘扫描任务。这两个任务是操作系统的基本任务,随着操作系统的启动而运行。7.用户应用程序用户的应用程序建立在系统的主任务(Main_Task)基础之上。用户应用程序主要通过调用系统的API函数对系统进行操作,完成用户的要求。在用户的应用程序中也可以创建用户自己的任务。任务之间的协调主要依赖于系统的消息队列。10用户应用程序的建立在嵌入式硬件平台的基础上,有了实时多任务操作系统来管理硬件资源、进行任务协调,在操作系统平台上使用操作系统所提供的GUI(图形用户接口)及API(应用程序接口)函数来编制自己相应的用户应用程序了。11嵌入式系统上运行的应用程序的结构以ARM7TDMI结构的处理器为例,它不带有MMU(内存管理单元)。所以,操作系统和应用程序是编译在一起运行的。12系统的启动和运行过程嵌入式控制器硬件初始化操作系统初始化LCD初始化装载字库调用系统配置文件创建任务初始化用户界面、时钟启动多任务调度主任务用户程序消息处理任务1任务n……13intMain(intargc,char**argv){ARMTargetInit();//开发板初始化OSInit();//操作系统初始化uHALr_ResetMMU();//复位MMULCD_Init();//初始化LCD模块LCD_printf(LCDinitializationisOK\n);//向液晶屏输出数据initOSGUI();//初始化图形界面LoadFont();//调Unicode字库LoadConfigSys();//使用config.sys文件配置系统设置LCD_printf(CreatetaskonuCOS-II...\n);OSTaskCreate(Main_Task,(void*)0,………..);//创建系统任务OSTaskCreate(AD_Check_Task,(void*)0,……….);//AD检测任务OSAddTask_Init();//创建系统附加任务LCD_printf(StartinguCOS-II...\n);LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式InitRtc();//初始化系统时钟Nand_Rw_Sem=OSSemCreate(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//OSStart();//操作系统任务调度开始return0;//不会执行到这里}14voidinitOSGUI()//初始化操作系统的图形界面{initOSMessage();initOSList();initOSDC();initOSCtrl();initOSFile();}15多任务uCOS-II操作系统上允许同时运行64个任务每一个任务都要有其独立的栈空间和唯一的任务优先级其中,有8个任务被系统的内核使用。另外还有,4个任务被操作系统使用。16任务的资源下面的代码定义了一个New_Task任务所需要的资源:OS_STKNew_Stack[STACKSIZE]={0,};//New_Task堆栈voidNew_Task(void*Id);//任务函数#defineNew_Task_Prio20//任务优先级17任务的创建下面的代码用于创建New_Task任务:OSTaskCreate(New_Task,(void*)0,(OS_STK*)&New_Stack[STACKSIZE-1],New_Task_Prio);任务创建以后,就会处于就绪状态。系统在任务调度的时候,总是执行处于最高优先级的任务。18任务的同步在uCOS-II中有三种方法可以在任务之间传递信息,保证任务的同步:信号量邮箱消息队列19信号量以信号量为例,讲解两个任务之间是如何同步的。创建信号量等待信号量发送信号量20创建信号量(P203)下面的代码定义并创建了一个信号量:OS_EVENT*Rtc_Updata_Sem;……Rtc_Updata_Sem=OSSemCreate(1);OSSemCreate的参数为1,表示信号量的计数值是1,即在同一个时间只能有一个资源被独占。21等待信号量下面的代码用来在一个任务中等待一个信号量(比如:Rtc_Updata_Sem):INT8Uerr;……OSSemPend(Rtc_Updata_Sem,0,&err);因为定义了Rtc_Updata_Sem中信号量的计数器为1,所以,一旦用OSSemPend获得了信号量的控制权,其他的任务就无法得到Rtc_Updata_Sem信号量的控制权了。22发送信号量下面的代码用来在一个任务中发送一个信号量(比如:Rtc_Updata_Sem):OSSemPost(Rtc_Updata_Sem);使信号量的计数器的值加1,因为Rtc_Updata_Sem在创建的时候计数器的值为1,相当于释放了一个资源的占有权23本节提要132546基于COS-II扩展RTOS图形用户接口设计外设及驱动文件系统的设计系统的消息嵌入式GUI简介24图形用户接口函数基于32位嵌入式处理器的硬件平台,有着较高的运算速度和大容量的内存。为人机交互建立GUI无疑为最首选的方式。本小节将建立针对常用的图形界面的应用建立相应的API函数。主要包括:基本绘图函数。基于Unicode的汉字字库典型的控件25绘图API函数绘图是操作系统的图形界面的基础,本系统为图形界面提供了丰富的绘图函数。在多任务操作系统中,绘图设备上下文(DC)是绘图的关键。绘图设备上下文(DC)保存了每一个绘图对象的相关参数(比如:绘图画笔的宽度、绘图的原点坐标等)。在多任务操作系统中,通过绘图设备上下文(DC)来绘图,可以保证在不同的任务绘图的参数是相互独立的,不会互相影响。26DC的定义typedefstruct{intDrawPointx;intDrawPointy;//绘图所使用的坐标点intPenWidth;//画笔宽度U32PenMode;//画笔模式U32PenColor;//画笔的颜色intDrawOrgx;//绘图的坐标原点位置intDrawOrgy;intDrawRangex;//绘图的区域范围intDrawRangey;U8bUpdataBuffer;//是否更新后台缓冲区U32Fontcolor;//字符颜色}DC,*PDC;27DC的初始化在绘图设备上下文(DC)中保存了每一个绘图对象的相关参数。在系统启动的时候,通过调用initOSDC()函数初始化绘图设备上下文(DC),为以后创建绘图设备上下文(DC)分配存储空间。28DC的使用创建DCCreatDC设置DCSet…利用DC绘图删除DCDestoryDC29典型的绘图函数(a)voidinitOSDC();PDCCreateDC();voidDestoryDC(PDCpdc);voidMoveTo(PDCpdc,intx,inty);voidLineTo(PDCpdc,intx,inty);voidDrawRectFrame(PDCpdc,intleft,inttop,intright,intbottom);voidCircle(PDCpdc,intx0,inty0,intr);30典型的绘图函数(b)voidSetDrawOrg(PDCpdc,intx,inty,int*oldx,int*oldy)设置绘图设备上下文(DC)的原点XY(原点)31典型的绘图函数(c)voidSetDrawRange(PDCpdc,intx,inty,int*oldx,int*oldy)设置绘图设备上下文(DC)的绘图范围x,y:设定的横向、纵向绘图的范围,如果x(或者y)为1,则表示x(或者y)方向的比例随着y(或者x)方向的范围按比例缩放。如果参数为-1,表示方向相反32DC创建PDCpdc;pdc=CreateDC();33DC设置举例PDCpdc;pdc=CreateDC();SetDrawOrg(pdc,170,50,&oldx,&oldy);SetDrawRange(pdc,800,-1,&oldxrange,&oldyrange);上面的程序代码创建一个绘图设备上下文(DC),将原点坐标设定在液晶屏设备坐标的(170,50),并把绘图的逻辑坐标的水平值设置成800,垂直范围按照液晶屏实际的横纵比例缩放。相关绘图函数(P99)34基于Unicode的字库什么是Unicode使用Unicode的优点字符的存储方式编写Unicode的程序Unicode字模的提取Unicode字库的显示及相关函数35什么是UnicodeUnicode是统一编码的紧缩写法世界上常用的编码系统有数百种之多,但所有的这些编码系统,没有哪一个能有足够的字符,可以适用于多种语言文本由于编码不统一,这些编码系统之间经常相互冲突Unicode出现改变了这一切在Unicode的双字节版本中(UTF-16)使用的是16位编码方式,可提供65,000多个字符代码指针36

1 / 152
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功