ucos-ii操作系统习题(嵌入式方向)(共23页)_第1页
ucos-ii操作系统习题(嵌入式方向)(共23页)_第2页
ucos-ii操作系统习题(嵌入式方向)(共23页)_第3页
ucos-ii操作系统习题(嵌入式方向)(共23页)_第4页
ucos-ii操作系统习题(嵌入式方向)(共23页)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ucos-ii操作系统习题一 填空题1 uC/OS-II是一个简洁、易用的 基于优先级的嵌入式【 抢占式 】多任务实时内核。2 任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的【 最高优先级 】的任务 。3 因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。4 【 任务级 】的调度是由函数OSSched()完成的,而【 中断级 】的调度是由函数OSIntExt() 完成。对于OSSched(),它内部调用的是【 OS_TASK_SW()】 完成实际的调度;OSI

2、ntExt()内部调用的是【 OSCtxSw() 】实现调度。5 任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的【 任务堆栈 】。(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器 】中。6 任务的5种状态。【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。【运行态(task running)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先

3、级最高的任务。【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。7【 不可剥夺型 】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。8当系统响应时间很重要时,要使用【 可剥夺型 】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。9使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【 互斥型

4、信号量 】来实现。10【 可重入型 】函数可以被一个以上的任务调用,而不必担心数据的破坏。11可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【 局部变量 】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【 保护 】。12每个任务都有其优先级。任务越重要,赋予的优先级应【 越高 】。13C/OS-初始化是通过调用系统函数【OSIint()】实现的,完成C/OS-所有的变量和数据结构的初始化。14多任务的启动是用户通过调用【OSStart()】实现的。然而,启动C/OS-之前,用户至少要建立一个应用【任务】。15.

5、C/OS-的参数配置文件名为【OS_CFG.H】。16 删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被C/OS-调用。17C/OS-要求用户提供【定时中断】来实现延时与超时控制等功能。18定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。19. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。20C/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的【等待任务表】。用户要在OS_CFG.H中将OS_SEM_

6、EN开关量常数置成【 1 】,这样C/OS-II才能支持信号量。21. C/OS-II中表示当前已经创建的任务数全局变量名为:【 OSTaskCtr 】。21. C/OS-II中表示当前内核运行的标记全局变量名为:【 OSRunning 】。22在使用OSTaskCreate创建任务时,若需要TaskData作伪参数传递给任务Task,并从任务Task中获得传入的字符参数值,请在下面【 】填上合适的代码。 char TaskData=A; OSTaskCreate(Task, 【(void *)& TaskData 】, &TaskStk0TASK_STK_SIZE - 1, 1);void

7、Task (void *pdata) char value = 【 *(char *)pdata 】; for (;) OSSemPend(RandomSem, 0, &err); y = (int) (*(char *)pdata - A); OSSemPost(RandomSem); PC_DispChar(10, 25, value, DISP_FGND_WHITE + DISP_BGND_BLUE); OSTimeDly(1); 23. 在C/OS-II在任务Task1中使用邮箱函数OSMboxPost()发送字符;而在Task2中接收OSMboxPost()字符, 请在下面【 】填上

8、合适的代码。void Task1 (void *data) char txmsg;INT8U err; txmsg = A; for (;) OSMboxPost(TxMbox, 【 (void *)&txmsg】); /* Send message to Task2*/ OSMboxPend(AckMbox, 0, &err); txmsg+; if (txmsg = Z) txmsg = A; void Task5 (void *data) char *rxmsg; INT8U err; data = data; for (;) rxmsg = 【(char *)】OSMboxPend(T

9、xMbox, 0, &err); PC_DispChar(70, 18, *rxmsg, DISP_FGND_YELLOW + DISP_BGND_BLUE); OSMboxPost(AckMbox, (void *)1); 24. 在Task1中使用消息队列OSQPend()函数接收消息“Hello World!”,而在Task2中使用消息队列OSQPost()函数发送消息“Hello World!”, 请在下面【 】填上合适的代码.void Task1 (void *pdata) char *msg; INT8U err; pdata = pdata; for (;) msg = 【(ch

10、ar *)】OSQPend(MsgQueue, 0, &err); PC_DispStr(70, 13, msg, DISP_FGND_YELLOW + DISP_BGND_BLUE); OSTimeDlyHMSM(0, 0, 0, 100); void Task2 (void *pdata) char msg20; pdata = pdata; strcpy(&msg0, Hello World!); for (;) OSQPost(MsgQueue, 【(void *)】&msg0); OSTimeDlyHMSM(0, 0, 0, 500); 25. C/OS-II操作系统使用OSSche

11、dLock()函数和OSSchedUnlock()函数进行锁定(不允许任务级调度)和解锁(重新允许任务级调度)调度器,在用户应用程序中OSSchedLock()和OSSchedUnlock()是 【成对出现的】,否则系统有可能出错。26.OSTaskSuspend(self)可把正在运行的任务【(_挂起_)】,参数self指【(_任务本身_)】。用此函数挂起的任务可通过【( OSTaskResume )】函数唤醒。27.创建信号量OSSemCreat(0)函数中,参数0表示【( 信号量的初始值 )】。二 名词解释1代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。2资源任何为任务所

12、占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。3共享资源可以被一个以上任务使用的资源叫做共享资源。4任务一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。典型地、每个任务都是一个无限的循环。5任务切换指Context Switch,其含义是CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。6内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。7调度(Schedu

13、ler)内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。8可剥夺型内核最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。 三简答题1. 举例说明COS-II可移植型数据类型的定义方式 答:因为不同的微处理器有不同的字长,C/OS-II的移植文件包括很多类型定义以确保可移植性。COS-II不使用C语言

14、中的short,int,long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。C/OS-II代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;2. COS-I

15、I如何定义全局变量?答:众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。因此,必须在 .C 和 .H 文件中定义。这种重复的定义很容易导致错误。COS-II采用的方法只需用在头文件中定义一次。uC/OS_II.H 头文件中包括以下定义全局宏定义:#ifdef OS_GLOBALS#define OS_EXT#else#define OS_EXT extern#endifOS_EXT INT32U OSIdleCtr;同时,uCOS_II.H有中以下定义:#define OS_GLOBALS#include “includes.h”当编译器处理uCO

16、S_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。INT32U OSIdleCtr;这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。extern INT32U OSIdleCtr;在这种情况下,不产生内存分配,而任何 .C文件都可以使用这些变量。这样的就只需在 .H 文件中定义一次就可以了。3. OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()的含义及作用?答:OS_ENTER_CRITICAL() :关中断;OS_EXIT_C

17、RITICAL():开中断。关中断和开中断是为了保护临界段代码。用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。4基于PC的服务中如何测量PC_DisplayChar()的执行时间?答:测量PC_DisplayChar()的执行时间的代码如下:INT16U time; /定义时间变量PC_ElapsedInit(); /时钟初始化PC_ElapsedStart(); /开始计时PC_DispChar(40, 24, A, DISP_FGND_WHITE); /执行代码time = PC_ElapsedStop()

18、; /结束计时5uC/OS-II的任务框架答:void task_xxx(void *pData)/* 该任务的初始化工作 */* 进入该任务的死循环 */while(1) 每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型”。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片。当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型”。事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:(1)

19、中断服务函数发送的事件(2)系统延时时间到所引起的(3)其它任务发送的事件。6 与共享资源打交道时,使之满足互斥条件最一般的方法包括哪些?答: 包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量等。7. 描述利用C/OS_ 宏调用关中断和开中断处理共享数据的示意性代码程序。答: OS_ENTER_CRITICAL();/*在这里处理共享数据*/OS_EXIT_CRITICAL();8. 信号量的典型应用包括哪些?答:信号量(Semaphores) 是一种约定机制,在多任务内核中的典型应用包括:(1) 控制共享资源的使用权(满足互斥条件);(2) 标志某事件的发生(3) 使两个任务的行

20、为同步9对信号量只能实施哪三种操作?答:一般地说,对信号量只能实施三种操作:(1) 初始化(INITIALIZE),也可称作建立(CREATE);(2) 等信号(WAIT)也可称作挂起(PEND);(3) 给信号(SIGNAL)或发信号(POST)。10.给出C/OS-中如何用信号量处理共享数据的示意代码?答:通过获得信号量处理共享数据的示意代码如下:OS_EVENT *SharedDataSem;void Function (void)INT8U err;OSSemPend(SharedDataSem, 0, &err);/*共享数据的处理在此进行,(中断是开着的)*/OSSemPost(S

21、haredDataSem);11.给出初始化和启动C/OS-的示意代码。答:void main (void) OSInit(); /* 初始化uC/OS-II */ . 通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务; . OSStart(); /* 开始多任务调度!OSStart()永远不会返回 */12 描述建立任务OSTaskCreate()的函数原型。答:建立任务OSTaskCreate()的函数原型为:INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos,

22、INT8U prio)其中,task: 任务代码的指针;pdata: 当任务开始执行时传递给任务的参数的指针;ptos: 分配给任务的堆栈的栈顶指针;prio: 分配给任务的优先级。13任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。请给出示意代码结构。答:C/OS-描述的任务示意代码必须是以下两种结构之一:void YourTask (void *pdata) for (;) /* 用户代码 */ 调用C/OS-的服务例程之一: OSMboxPend(); OSQPend(); OSSemPend(); OSTaskDel(OS_PRIO_SELF); OSTaskSuspend

23、(OS_PRIO_SELF); OSTimeDly(); OSTimeDlyHMSM(); /* 用户代码 */ 或void YourTask (void *pdata) /* 用户代码 */ OSTaskDel(OS_PRIO_SELF);14C/OS-任务管理提供哪些服务?答:C/OS-任务管理提供的服务包括:(1)建立任务:OSTaskCreate()或OSTaskCreateExt();(2)删除任务:OSTaskDel();(3)请求删除任务:OSTaskDelReq();(4)改变任务的优先级:OSTaskChangePrio();(5)挂起任务:OSTaskSuspend();(

24、6)恢复任务:OSTaskResume();(7)获得有关任务的信息:OSTaskQuery()。15C/OS-时间任务管理提供哪些服务?答:C/OS-时间任务管理提供的服务包括:(1) 任务延时函数:OSTimeDly()(2) 按时分秒延时函数:OSTimeDlyHMSM()(3) 让处在延时期的任务结束延时:OSTimeDlyResume()(4) 设置系统时间:OSTimeGet()(5) 获得系统时间:OSTimeSet()16. C/OS-提供的数据共享和任务通讯的方法包括哪些?答:C/OS-提供的数据共享和任务通讯的方法包括五种方法:(1) 利用宏OS_ENTER_CRITICA

25、L()和OS_EXIT_CRITICAL()来关闭中断和打开中断。(2) 利用函数OSSchedLock()和OSSchekUnlock()对C/OS-II中的任务调度函数上锁和开锁。(3) 信号量。(4) 邮箱。(5) 消息队列。17对于事件控制块进行的一些通用包括哪些操作?答:对于事件控制块进行的一些通用操作包括:(1) 初始化一个事件控制块: OSEventWaitListInit();(2) 使一个任务进入就绪态:OSEventTaskRdy();(3) 使一个任务进入等待该事件的状态:OSEventTaskWait();(4) 因为等待超时而使一个任务进入就绪态:OSEventTO(

26、)。18C/OS-信号量提供哪些服务?答:C/OS-信号量提供的服务包括:(1) 建立一个信号量:OSSemCreate();(2) 等待一个信号量:OSSemPend();(3)发送一个信号量:OSSemPost();(4)无等待地请求一个信号量:OSSemAccept();(5)查询一个信号量的当前状态:OSSemQuery()。19C/OS-邮箱提供哪些服务?答:C/OS-邮箱提供的服务包括:(1)建立一个邮箱:OSMboxCreate();(2)等待一个邮箱中的消息:OSMboxPend();(3)发送一个消息到邮箱中:OSMboxPost();(4)无等待地从邮箱中得到一个消息:OS

27、MboxAccept();(5)查询一个邮箱的状态:OSMboxQuery()20C/OS-消息队列提供哪些服务?答:C/OS-消息队列提供的服务包括:(1)建立一个消息队列:OSQCreate();(2)等待一个消息队列中的消息:OSQPend();(3)向消息队列发送一个消息(FIFO):OSQPost();(4)向消息队列发送一个消息(LIFO):OSQPostFront();(5)无等待地从一个消息队列中取得消息:OSQAccept();(6)清空一个消息队列:OSQFlush();(7)查询一个消息队列的状态:OSQQuery()。21C/OS-内存管理提供哪些服务?答:C/OS-内

28、存管理提供的服务包括:(1) 建立一个内存分区:OSMemCreate();(2) 分配一个内存块:OSMemGet();(3) 释放一个内存块:OSMemPut();(4) 查询一个内存分区的状态:OSMemQuery()。22移植C/OS-时,要使C/OS-正常运行,处理器必须满足哪些基本要求?答:要使C/OS-正常运行,处理器必须满足以下要求:(1) 处理器的C编译器能产生可重入代码。(2) 用C语言就可以打开和关闭中断。(3) 处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。(4) 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。(5) 处理器有将堆栈指针和

29、其它CPU寄存器读出和存储到堆栈或内存中的指令。23. 描绘不可剥夺型内核中断响应示意图答:24. 举例描述C/OS-II基于任务的应用程序设计方法 答:#include #define TASK_STK_SIZE 128 OS_STK AppStk_oneTASK_STK_SIZE; /任务one的堆栈OS_STK AppStk_twoTASK_STK_SIZE; /任务two的堆栈 OS_STK AppStk_threeTASK_STK_SIZE; /任务three的堆栈 static void App_one(void *p_arg); /任务one代码 static void App_

30、two(void *p_arg); /任务two代码 static void App_three(void *p_arg); /任务three代码 void main(int argc, char *argv) OSInit(); /初始化系统 /依次创建三个任务 OSTaskCreate(App_one,NULL,(OS_STK*)&AppStk_oneTASK_STK_SIZE-1,(INT8U)10); OSTaskCreate(App_two,NULL,(OS_STK*)&AppStk_twoTASK_STK_SIZE-1,(INT8U)20); OSTaskCreate(App_th

31、ree,NULL,(OS_STK*)&AppStk_threeTASK_STK_SIZE-1,(INT8U)30); OSStart(); /启动多任务,将CPU控制权交给系统 25. C/OS-II调度算法原理及其和调度方式 答:(1)优先级调度算法原理为:给每一个任务分配一个惟一优先级,各优先级用一个整形数值标识,某优先级的值越大,其优先级越低:某优先级的值越小,其优先级越高。也就是说,如果当前操作系统准备进行调度,当有两个任务处于就绪状态,系统将优先执行优先级别高的任务。 (2) C/OS-II操作系统有两种调度方式:任务级任务调度和中断级任务调度,C/OS-II操作系统在完成中断后允许

32、进行新的调度。26. 描述C/OS-II操作系统的任务级任务调度OS_Sched()的主要功能 答:(1)查找当前就绪表中最高优先级任务的优先级值; (2)调用OS_TASK_SW()进行任务切换,切换到新任务执行。 27.从消息邮箱中读取消息的方式及其函数原型 ? 答:(1) 从消息邮箱中读取消息的方式包括:非阻塞式读取和阻塞式读取两种方式。 (2) 非阻塞式读取是指无论消息邮箱中是否有数据,读取操作也不阻塞,直接返回。显然,如果有数据,将读取出来;如果没有数据,将读取为NULL。 其函数原型为:void *OSMboxAccept (OS_EVENT *pevent) (3) 阻塞式读取是

33、指在消息邮箱中有数据时,直接读取出来;如果没有数据,则使当前任务进入等待状态,系统执行调度程序执行新的任务,当下一次消息到来时将激活等待表中的最高优先级任务,从而使该任务进入就绪状态。为了避免任务一直处于等待状态(所等待的资源一直未分配),可以设置一个等待的时间范围,当超过该延迟时,则直接返回。 其函数原型为:void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)四论述题1. 论述C/OS-控制下的任务状态转换图答:C/OS-控制下的任务状态转换图如下图所示。在任一给定的时刻,任务的状态一定是在这五种状态之一。(1) 睡眠

34、态(DORMANT):指任务驻留在程序空间之中,还没有交给C/OS-管理。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。(2) 就绪态(READY):当任务一旦建立,这个任务就进入就绪态准备运行。把任务交给C/OS-是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。(3) 运行态(RUN): 调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。(4) 等待状态(WAITING): 正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTim

35、eDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态(WAITING)。(5) 中断状态(ISR): 正在运行的任务是可以被中断的,除非该任务将中断关了,或者C/OS-将中断关了。被中断了的任务就进入了中断服务态(ISR)。2. 论述C/OS-的核心数据结构任务控制块(OS_TCBs)答:任务控制块(OS_TCBs)是C/O

36、S-的核心数据结构,当任务的CPU使用权被剥夺时,C/OS-用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。OS_TCBs全部驻留在RAM中。一旦任务建立了,任务控制块OS_TCBs将被赋值。C/OS-II任务控制块数据结构定义如下:typedef struct os_tcb OS_STK *OSTCBStkPtr;#if OS_TASK_CREATE_EXT_EN void *OSTCBExtPtr; OS_STK *OSTCBStkBottom; INT32U OSTCBStkSize; INT16U OSTCBOpt; I

37、NT16U OSTCBId;#endif struct os_tcb *OSTCBNext; struct os_tcb *OSTCBPrev;#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_EN OS_EVENT *OSTCBEventPtr;#endif#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN void *OSTCBMsg;#endif INT16U OSTCBDly; INT8U OSTCBStat; INT8U OSTCBPrio; INT8U OSTCBX; INT8U OSTCB

38、Y; INT8U OSTCBBitX; INT8U OSTCBBitY;#if OS_TASK_DEL_EN BOOLEAN OSTCBDelReq;#endif OS_TCB;其中:OSTCBStkPtr是指向当前任务栈顶的指针。OSTCBExtPtr 指向用户定义的任务控制块扩展。OSTCBStkBottom是指向任务栈底的指针。OSTCBStkSize存有栈中可容纳的指针元数目而不是用字节(Byte)表示的栈容量总数。OSTCBId用于存储任务的识别码。OSTCBNext和OSTCBPrev用于任务控制块OS_TCBs的双重链接。OSTCBEventPtr是指向事件控制块的指针。OSTC

39、BMsg是指向传给任务的消息的指针。OSTCBStat是任务的状态字。OSTCBPrio是任务优先级。OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除。OSTCBX, OSTCBY, OSTCBBitX和 OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程。3论述事件控制块ECB数据结构答:C/OS-II通过uCOS_II.H 中定义的OS_EVENT数据结构来维护一个事件控制块的所有信息。该事件控制块ECB数据结构的定义如下:typedef struct void *OSEventPtr; /* 指向消息或者消息队列的指针 */ INT8U OSEven

40、tTblOS_EVENT_TBL_SIZE; /* 等待任务列表 */ INT16U OSEventCnt; /* 计数器(当事件是信号量时) */ INT8U OSEventType; /* 时间类型 */ INT8U OSEventGrp; /* 等待任务所在的组 */ OS_EVENT;其中:OSEventPtr指针: 只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构.OSEventTbl 和 OSEventGrp: 两者包含的是系统中处于就绪状态的任务。OSEventCnt:当事件是一个信号量时,用于

41、信号量的计数器。OSEventType:定义了事件的具体类型。4论述C/OS-II内存的管理的内存控制块数据结构答:为了便于内存的管理,在C/OS-II中使用内存控制块(memory control blocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。内存控制块的数据结构定义如下:typedef struct void *OSMemAddr; void *OSMemFreeList; INT32U OSMemBlkSize; INT32U OSMemNBlks; INT32U OSMemNFree; OS_MEM;其中:OSMemAddr是指向内存分区起始

42、地址的指针。OSMemFreeList是指向下一个空闲内存控制块或者下一个空闲的内存块的指针。OSMemBlkSize是内存分区中内存块的大小,是用户建立该内存分区时指定的。OSMemNBlks是内存分区中总的内存块数量,也是用户建立该内存分区时指定的。OSMemNFree是内存分区中当前可以得空闲内存块数量。五、uC_OS-II程序题一、编写一个uC/OS-II应用程序,要求:(1)包含两个用户任务(MyTask、YouTask)和两个系统任务(统计任务、空闲任务);(2)把MyTask作为起始任务,MyTask、YouTask的优先级分别为0、2;(3)当MyTask运行10次后对调度器进

43、行加锁,运行到80次时对调度器进行解锁;(4)当MyTask运行的运行次数大于85次后,要求YouTask删除它自己,YouTask接到要求后,等待15s钟,然后删除自己。(这个程序要仔细点看,注释写得最详细,这个看懂了,后面的就应该也能看懂了,这三个程序大部分代码都是差不多的,蓝色粗体字的部分是一些关键语句或可能随着题目要求变化的语句)#include includes.h #define TASK_STK_SIZE 512 /任务堆栈长度 OS_STK MyTaskStkTASK_STK_SIZE; /定义MyTask任务堆栈区 OS_STK YouTaskStkTASK_STK_SIZE

44、; /定义YouTask任务堆栈区 INT8U x=0,y=0;/这两个变量分别用来指定要显示字符的横纵坐标,即列和行,标准的DOS窗口是80x25,也就是可以显示80行、25列字符, /有了这两个变量就可以将字符精确的显示在DOS窗口的某个地方。 INT8U times=0;/这个变量用了记录MyTask任务的运行次数 void MyTask(void* pdata); void YouTask(void* pdata); void main (void) char* s_M=M; OSInit(); /初始化uCOS_II PC_DOSSaveReturn(); /保存Dos环境 PC_V

45、ectSet(uCOS, OSCtxSw); /安装uCOS_II中断 OSTaskCreate(MyTask, s_M, &MyTaskStkTASK_STK_SIZE - 1, 0);/ 创建起始任务(此题中要求将MyTask作为起始任务), 将s_M /作为参数传递给MyTask函数,并将该任务的优先级设置为0(优先级按照题目的规定去设置,一般起始任务要设置为最高数值越小,优先级越高)。 OSStart(); /启动系统 void MyTask (void *pdata)char*s_M=M;OSInit();/初始化uCOS_IIPC_DOSSaveReturn();/保存Dos环境P

46、C_VectSet(uCOS,OSCtxSw);/安装uCOS_II中断OSTaskCreate(MyTask,s_M,&MyTaskStkTASK_STK_SIZE-1,0);/创建起始任务(此题中要求将MyTask作为起始任务),将s_M/作为参数传递给MyTask函数,并将该任务的优先级设置为0(优先级按照题目的规定去设置,一般起始任务要设置为最高数值越小,优先级越高)。OSStart();/启动系统voidMyTask(void*pdata)char*s_Y=Y;char*s=MyTask:IaskingYouTasktodeletehisown!;#ifOS_CRITICAL_MET

47、HOD=3/如果使用的是第3种方法来开关中断,则需要用到cpu_sr这个变量来保存程序状态字OS_CPU_SRcpu_sr;/定义cpu_sr这个变量#endifpdata=pdata;/这句可以不写,仅仅只是为了防止编译器报错OS_ENTER_CRITICAL();/进入临界段(关中断)PC_VectSet(0x08,OSTickISR);/安装uCOS_II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);/设置uCOS_II时钟频率OS_EXIT_CRITICAL();/退出临界段(开中断)OSStatInit();/创建和初始化uCOS_II的统计任务(这条

48、语句一定不能掉,不然会扣很多分的)OSTaskCreate(YouTask,s_Y,&YouTaskStkTASK_STK_SIZE-1,2);/在MyTask任务中创建YouTask任务,优先级为2for(;)if(times85)/如果MyTask任务的运行次数大于了85次,就要求YouTask任务删除它自己(这个数值也是由题目规定的,题目要求/MyTask运行多少次后删除YouTask就将此处改成多少while(OSTaskDelReq(2)!=OS_TASK_NOT_EXIST)/要注意OSTaskDelReq后括号中的2,这个数值是所要删除的任务的/优先级,要删除哪个任务就在此处填入该任务的优先级,该程序中,优先级2对应的任务为YouTaskPC_DispStr(10,8,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);/在屏幕上的第10列、第8行显示s所代表的字符/串,s在上面已经定义了。(这些DOS窗口的打印函数在书本附录Apage263都有介绍)OSTimeDly(1);if(x50)/当一行打印的字符数大于了50个后,换行,换到该行下面的第二行(因为y=y+2),然后从行首开始打印(因为x=0)x=0;y+=2;times+=1; /每运行一次times加1,以记录下MyTask任务的运行次数if(times=10)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论