ucos-ii操作系统习题(嵌入式方向) 下载本文

27.创建信号量OSSemCreat(0)函数中,参数0表示【( 信号量的初始值 )】。

二. 名词解释

1.代码的临界段

代码的临界段也称为临界区,指处理时不可分割的代码。

2.资源

任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。

3.共享资源

可以被一个以上任务使用的资源叫做共享资源。

4.任务

一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。典型地、每个任务都是一个无限的循环。

5.任务切换

指Context Switch,其含义是CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。

6.内核

多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。

7.调度(Scheduler)

内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。

8.可剥夺型内核

最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。

三.简答题

5

1. 举例说明μCOS-II可移植型数据类型的定义方式

答:因为不同的微处理器有不同的字长,μC/OS-II的移植文件包括很多类型定义以确保可移植性。μCOS-II不使用C语言中的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-II如何定义全局变量? 答:众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。因此,必须在 .C 和 .H 文件中定义。这种重复的定义很容易导致错误。μCOS-II采用的方法只需用在头文件中定义一次。 uC/OS_II.H 头文件中包括以下定义全局宏定义: #ifdef OS_GLOBALS #define OS_EXT #else

#define OS_EXT extern #endif

OS_EXT INT32U OSIdleCtr;

同时,uCOS_II.H有中以下定义: #define OS_GLOBALS #include “includes.h”

当编译器处理uCOS_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_CRITICAL():开中断。

关中断和开中断是为了保护临界段代码。

用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。

6

4.基于PC的服务中如何测量PC_DisplayChar()的执行时间? 答:

测量PC_DisplayChar()的执行时间的代码如下: INT16U time; //定义时间变量 PC_ElapsedInit(); //时钟初始化

PC_ElapsedStart(); //开始计时

PC_DispChar(40, 24, ?A?, DISP_FGND_WHITE); //执行代码 time = PC_ElapsedStop(); //结束计时

5.uC/OS-II的任务框架 答:

void task_xxx(void *pData) { /* 该任务的初始化工作 */ ??

/* 进入该任务的死循环 */ while(1) { ?? } }

每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型”。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片。当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型”。事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:

(1)中断服务函数发送的事件 (2)系统延时时间到所引起的 (3)其它任务发送的事件。

6. 与共享资源打交道时,使之满足互斥条件最一般的方法包括哪些? 答:

包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量等。

7. 描述利用μC/OS_Ⅱ 宏调用关中断和开中断处理共享数据的示意性代码程序。 答:

OS_ENTER_CRITICAL(); /*在这里处理共享数据*/ OS_EXIT_CRITICAL();

7

8. 信号量的典型应用包括哪些? 答:

信号量(Semaphores) 是一种约定机制,在多任务内核中的典型应用包括:

(1) 控制共享资源的使用权(满足互斥条件); (2) 标志某事件的发生 (3) 使两个任务的行为同步

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(SharedDataSem);

}

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, INT8U prio) 其中,

task: 任务代码的指针;

8