嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计

上传人:E**** 文档编号:89155861 上传时间:2019-05-19 格式:PPT 页数:91 大小:696.51KB
返回 下载 相关 举报
嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计_第1页
第1页 / 共91页
嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计_第2页
第2页 / 共91页
嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计_第3页
第3页 / 共91页
嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计_第4页
第4页 / 共91页
嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计_第5页
第5页 / 共91页
点击查看更多>>
资源描述

《嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计》由会员分享,可在线阅读,更多相关《嵌入式系统设计与开发 教学课件 ppt 作者 马文华 主编 邓耀华 汤秀春 胡伟 副主编 8基于&micro_C OS-II的程序设计(91页珍藏版)》请在金锄头文库上搜索。

1、第8章 基于C/OS-II的程序设计,8.1 基于C/OS-II的应用程序设计方法 8.2 C/OS-II操作系统扩展 8.3 C/OS-II的文件系统 8.4 基于C/OS-II的图形用户界面基础,C/OS-II的编程包括操作系统和外设驱动编程,操作系 统的编程主要是以系统为核心而与外部接口无关所进行的软件 编程,如多任务之间的数据交换,中断与任务的同步和互斥 等。外设驱动程序可以为系统提供访问外围设备的接口,把操 作系统(软件)和外围设备(硬件)分离开来。当外围设备改变的时 候,只需更换相应的驱动程序,不必修改操作系统的内核以及 运行在操作系统中的软件。本章将以实例介绍C/OS-II下的程

2、 序设计。 8.1 基于C/OS-II的应用程序设计方法 C/OS-II操作系统只提供任务运行的内核程序,要进行 C/OS-II的扩展编程,首先要掌握C/OS-II操作系统的编程。,【例8.1】操作系统启动。 void main(void) OSInit(); /*初始化C/OS-II */ OSTaskCreate(myTask,参数指针,任务所分配的堆栈,任务优先级)/*创建任务myTask*/ OSStart();/*开始任务调度,注意OSStart()函数不会返回*/ 例8.1中的程序实现了C/OS-II的启动,在调用C/OS-II 的任务之前,C/OS-II要求用户首先调用系统初始化

3、函数 OSInit()来初始化C/OS-II所有的变量和数据结构。调用 OSInit()后将建立空闲任务OSTaskIdle(),这个任务总是处于就 绪状态,系统自动将其优先级设为最低。当有高优先级的任务 建立时,系统会切换到执行高优先级的任务。,OSTaskCreate()函数用来创建一个名为myTask的任务, 一个任务通常是一个无限循环,相当于一个C语言函数,任务 一旦调用就不会返回,因此任务函数的类型必须定义为void 型。如任务myTask程序。 void myTask(void *pdata) for(;) /*用户程序*/ 函数myTask()的形参 *pdata是用户代码在第一

4、次执行的 时候传过来的,该变量必须为void类型的指针。 OSTaskCreate()函数的参数还包括任务占用的堆栈和规定任务 的优先级等。,OSStart()函数用来启动任务调度,C/OS-II总是运行进入 就绪任务中的优先级最高的那个任务,由调度器来确定哪一个 任务运行。C/OS-II中任务调度所使用的时间是常数,与应用 程序建立的任务数没有关系。 在使用C/OS-II操作系统来开发应用程序时应该注意以下 几方面的内容。 1. 变量类型 C语言变量类型的长度是与编译器类型相关的,C/OS-II为 了在各个平台间移植,没有使用C语言的数据类型,而是定义 了自己的数据类型。具体介绍可以参考本书

5、第5章有关C/OS- 中的基本数据类型这一节的内容。,2. 任务函数的编写与结构 C/OS-操作系统中任务函数相当于C语言函 数,有参数和返回值,但是,实际上任务函数是没有 返回值的。任务函数要么是一个无限循环,要么执行 一次就删除。任务函数结构只能是下面两种结构之 一: 1)任务函数执行完一次就删除。 void myTask(void *pdata) /*用户代码*/ OSTaskDel(OS_PRIO_SELF); ,2)任务函数是一个无限循环。 void myTask(void *pdata) for (;) /*等待邮箱消息 */ OSMboxPend(); /*用户代码*/ 当任务只

6、需要执行一次时采用第一种形式,对于多次执行的任务采用第二种形式。,3. 代码的可重入性 在多任务系统中,有些函数可能会被多个任务调 用,此时就要考虑函数的可重入性。由于每一个任务 的局部变量都是放在当前的任务堆栈中,而任务是独 立的,所以只要不使用全局变量就可以保证函数代码 的可重入性。 4. 消息机制的实现 熟悉Windowns编程的用户都知道,在Windowns 操作下不同进程(任务)之间的数据通信主要是通过 消息传递实现的。同样在C/OS-II编程中,消息是系 统各个任务之间通信的最常用手段,下面给出C/OS- II下系统主任务中如何实现信息循环的例子。,【例8.2】消息循环。 void

7、 myTask(void *pdata) /*初始化*/ void *Presult; for(;) /*消息循环*/ Presult = OSQPend(); switch(Presult) /*用户代码*/ ,例8.2中程序首先完成任务初始化,然后在 消息循环过程中,等待某个消息,当其他任务或者中 断服务程序返回消息后,程序根据消息内容调用相应 的函数模块,处理完后重新回到消息循环,继续等待 消息。 【例8.3】多任务之间同步。 C/OS-II版本允许同时运行64个任务,而且每一 个任务都有独立的栈空间和唯一一个优先级。64个任 务中,有8个任务给系统内核使用,有4个任务被操作 系统使用,

8、因此用户最大只能创建和使用52个任务。,任务的创建在例8.1中已经介绍,下面着重介绍任务之间 的同步。 /* 给任务分配堆栈*/ #ifdef SEMIHOSTED #define STACKSIZE (64+SEMIHOSTED_STACK_NEEDS) #else #define STACKSIZE 256 #endif /*初始化堆栈*/ OS_STK Stack1STACKSIZE= 0, ; OS_STK Stack2STACKSIZE= 0, ; OS_STK Stack3STACKSIZE= 0, ; /* 定义消息邮箱控制指针 */ OS_EVENT *Mbox1;,OS_EV

9、ENT *Mbox2; OS_EVENT *Mbox3; char PassMsg = “Example 1“; void Task1(void *Id) char *Msg; INT8U err; for (;) /*等待邮箱消息 */ Msg = (char *)OSMboxPend(Mbox1, 0, uHALr_printf(“%c”, *(char *)Id);/*用户函数,实现 向pc机发送数据Id*/,/* 将接收到的邮箱信息发送到Mbox2 */ OSMboxPost(Mbox2, Msg); void Task2(void *Id) char *Msg; INT8U err;

10、 for (;) /*等待邮箱消息 */ Msg = (char *)OSMboxPend(Mbox2, 0, ,/* 将接收到的邮箱信息发送到Mbox3 */ OSMboxPost(Mbox3, Msg); void Task3(void *Id) char *Msg; INT8U err; for (;) /*等待邮箱消息 */ Msg = (char *)OSMboxPend(Mbox3, 0, ,/* 将接收到的邮箱信息发送到Mbox1 */ OSMboxPost(Mbox1, Msg); /* 主函数*/ int Main(int argc, char *argv) char Id1

11、 = 1; char Id2 = 2; char Id3 = 3; /* C/OS-II初始化*/ OSInit(); /*创建邮箱Mbox1并赋值PassMsg */ Mbox1 = OSMboxCreate(PassMsg);,/* 创建空邮箱Mbox2和Mbox3 */ Mbox2 = OSMboxCreate(void *)0); Mbox3 = OSMboxCreate(void *)0); /* 创建3个任务,Task3的任务级别最高*/ OSTaskCreate(Task1, (void *) ,以上例子任务间同步是通过邮箱来传递 信息(当然也可以在主任务中通过例8.1所介 绍的

12、消息机制来实现),在主函数中语句 “Mbox1= OSMboxCreate(PassMsg)”先给 Mbox1指针赋值,而Mbox2、Mbox3赋值为0。 通过OSTaskCreate()函数创建任务Task1、 Task2和Task3,并分配任务的优先级为3、2、 1。当调用OSStart()函数启动任务调度后, Task3、Task2和Task1依次执行。,每一个任务都是一个无限循环,当运行任务Task1的时候,由 于Mbox1已经有初值,因此调用执行语句“Msg =(char *) OSMboxPend(Mbox1,0, &err)”后,Msg获得了返回值,程 序往下执行,当执行“OSM

13、boxPost(Mbox2,Msg)”时,通过 函数OSMboxPost()将返回的信息传给Mbox2,这样Mbox2就 有了值,任务Task2中由于邮箱收到信息,它又将这个信息传 给Mbox3,同样的Task3任务中接收信息后,又通过 “OSMboxPost(Mbox1,Msg)”与任务Task1实现通信。如此 循环就实现了多个任务之间的同步。在使用邮箱实现同步的时 候要注意,邮箱一旦建立,是不能被删除的,比如,有任务正 在等待一个邮箱的信息,这时删除该邮箱将会产生严重的后 果。,因为C/OS-II只是一个实时多任务的操作系统内核,要 编写基于C/OS-II的应用程序还需对C/OS-II进行

14、扩展,这样 才能使C/OS-II成为一个实用的实时操作系统。本节将介绍如 何在C/OS-II操作系统的基础上扩展成实用的操作系统,扩展 内容包括:为外设建立驱动程序及相应的API函数、创建图形 界面函数、文件系统以及其他实用的应用程序接口函数。图8.1 给出了C/OS-II内核扩展整体框图。 1操作系统的API函数 操作系统中提供标准的应用程序接口(API)函数,可以 加速用户应用程序的开发,统一应用程序的标准,同时也给操 作系统版本的升级带来了方便。在API函数中,提供了大量的 常用模块,可以大大简化用户应用程序的编写。,8.2 C/OS-II操作系统扩展,2实时操作系统的多任务管理 C/O

15、S-II作为操作系统的内核,主要的任务就是完成多任 务之间的调度和同步。 图8.1 C/OS-II内核扩展整体框图,3消息队列 系统的消息队列是以C/OS-II的消息队列派生出来的系统 消息传递机制,用来实现系统的各个任务之间、用户应用程序 的各个任务之间以及用户应用程序和系统的各个任务之间的通 信。 4系统外围设备的硬件部分 系统外围设备的硬件部分包括:串行通信模块、LED显示 模块、键盘、Flash存储器和系统时钟。外围设备的硬件部分 是保证系统实现指定任务的最底层的部件。 5驱动程序模块 驱动程序是连接底层的硬件和上层的API函数的纽带,有了 驱动程序模块,就可以把操作系统的API函数和

16、底层的硬件分 离开来。硬件的改变、删除或者添加,只需要把改变、删除或 者添加提供给操作系统的相应驱动程序就可以,而不会影响到 API函数的功能,更不会影响到用户的应用程序。,6系统任务 系统任务主要包括LED的显示任务、系统键盘扫描任 务和串行通信任务。 7用户应用程序 用户的应用程序建立在系统的主任务基础之上, 主要通过调用系统的API函数对系统进行操作,完成 用户的要求。在用户的应用程序中也可以创建用户自 己的任务。任务之间的同步通过信号量来实现。 下面给出一个例子来介绍C/OS-II的扩展编程。 程序以S3CEV40 实验教学系统为硬件基础,并已经 调试通过。,【例8.4】综合应用实例。 实例有两大部分组成: (1)C/OS-II例程 ucos-ii

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号