ucos-ii操作系统复习大纲
一. 填空题
1. uC/OS-II是一个简洁、易用的 基于优先级的嵌入式【 抢占式 】多任务实时内核。
2. 任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的【 最高优先级 】的任务 。
3. 因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。
4. 【 任务级 】的调度是由函数OSSched()完成的,而【 中断级 】的调度是由函数OSIntExt() 完成。对于OSSched(),它内部调用的是【 OS_TASK_SW()】 完成实际的调度;OSIntExt()内部调用的是【 OSCtxSw() 】实现调度。
5. 任务切换其实很简单,由如下2步完成:
(1)将被挂起任务的处理器寄存器推入自己的【 任务堆栈 】。
(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器 】中。
6. 任务的5种状态。
【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。
【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。
【运行态(task running)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。
【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。
【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。
7.【 不可剥夺型 】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。
8.当系统响应时间很重要时,要使用【 可剥夺型 】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。
9.使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【 互斥型信号量 】来实现。
10.【 可重入型 】函数可以被一个以上的任务调用,而不必担心数据的破坏。
11.可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【 局部变量 】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【 保护 】。
12.每个任务都有其优先级。任务越重要,赋予的优先级应【 越高 】。
13.μC/OS-Ⅱ初始化是通过调用系统函数【OSIint()】实现的,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。
14.多任务的启动是用户通过调用【OSStart()】实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用【任务】。
15. μC/OS-Ⅱ的参数配置文件名为【】。
16. 删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被µC/OS-Ⅱ调用。
17.µC/OS-Ⅱ要求用户提供【定时中断】来实现延时与超时控制等功能。
18.定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。
19. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。
20.µC/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的【等待任务表】。用户要在中将OS_SEM_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 】,
&TaskStk[0][TASK_STK_SIZE - 1], 1);
void 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()字符, 请在下面【 】填上合适的代码。
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(TxMbox, 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 = 【(char *)】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 msg[20];
pdata = pdata;
strcpy(&msg[0], " Hello World!");
for (;;) {
OSQPost(MsgQueue, 【(void *)】&msg[0]);
OSTimeDlyHMSM(0, 0, 0, 500);
}
}
二. 名词解释
1.代码的临界段
代码的临界段也称为临界区,指处理时不可分割的代码。
2.资源
任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。
3.共享资源
可以被一个以上任务使用的资源叫做共享资源。
4.任务
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。典型地、每个任务都是一个无限的循环。
5.任务切换
指Context Switch,其含义是CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(Context),即CPU寄存器中的全部内容。
6.内核
多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。
7.调度(Scheduler)
内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。
8.可剥夺型内核
最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。
三.简答题
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;