ucosii操作系统习题嵌入式方向Word下载.docx
- 文档编号:20607459
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:27
- 大小:70.94KB
ucosii操作系统习题嵌入式方向Word下载.docx
《ucosii操作系统习题嵌入式方向Word下载.docx》由会员分享,可在线阅读,更多相关《ucosii操作系统习题嵌入式方向Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
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】。
C/OS-II中表示当前内核运行的标记全局变量名为:
【OSRunning】。
22.在使用OSTaskCreate创建任务时,若需要TaskData作伪参数传递给任务Task,并从任务Task中获得传入的字符参数值,请在下面【】填上合适的代码。
charTaskData=’A’;
OSTaskCreate(Task,【(void*)&
TaskData】,&
TaskStk[0][TASK_STK_SIZE-1],1);
voidTask(void*pdata)
{
charvalue=【*(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()字符,请在下面【】填上合适的代码。
voidTask1(void*data)
chartxmsg;
INT8Uerr;
…
txmsg='
OSMboxPost(TxMbox,【(void*)&
txmsg】);
/*SendmessagetoTask2*/
OSMboxPend(AckMbox,0,&
txmsg++;
if(txmsg=='
Z'
}
voidTask5(void*data)
char*rxmsg;
INT8Uerr;
data=data;
rxmsg=【(char*)】OSMboxPend(TxMbox,0,&
PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW+DISP_BGND_BLUE);
OSMboxPost(AckMbox,(void*)1);
24.在Task1中使用消息队列OSQPend()函数接收消息“HelloWorld!
”,而在Task2中使用消息队列OSQPost()函数发送消息“HelloWorld!
”,请在下面【】填上合适的代码.
voidTask1(void*pdata)
char*msg;
pdata=pdata;
msg=【(char*)】OSQPend(MsgQueue,0,&
PC_DispStr(70,13,msg,DISP_FGND_YELLOW+DISP_BGND_BLUE);
OSTimeDlyHMSM(0,0,0,100);
voidTask2(void*pdata)
charmsg[20];
strcpy(&
msg[0],"
HelloWorld!
"
OSQPost(MsgQueue,【(void*)】&
msg[0]);
OSTimeDlyHMSM(0,0,0,500);
25.µ
C/OS-II操作系统使用OSSchedLock()函数和OSSchedUnlock()函数进行锁定(不允许任务级调度)和解锁(重新允许任务级调度)调度器,在用户应用程序中OSSchedLock()和OSSchedUnlock()是【成对出现的】,否则系统有可能出错。
(self)可把正在运行的任务【(____挂起____)】,参数self指【(__任务本身____)】。
用此函数挂起的任务可通过【(OSTaskResume)】函数唤醒。
27.创建信号量OSSemCreat(0)函数中,参数0表示【(信号量的初始值)】。
二.名词解释
1.代码的临界段
代码的临界段也称为临界区,指处理时不可分割的代码。
2.资源
任何为任务所占用的实体都可称为资源。
资源可以是输入输出设备;
资源也可以是一个变量,一个结构或一个数组等。
3.共享资源
可以被一个以上任务使用的资源叫做共享资源。
4.任务
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。
典型地、每个任务都是一个无限的循环。
5.任务切换
指ContextSwitch,其含义是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代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;
typedefsignedcharINT8S;
typedefunsignedintINT16U;
typedefsignedintINT16S;
typedefunsignedlongINT32U;
typedefsignedlongINT32S;
2.µ
COS-II如何定义全局变量
答:
众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。
因此,必须在.C和.H文件中定义。
这种重复的定义很容易导致错误。
COS-II采用的方法只需用在头文件中定义一次。
uC/头文件中包括以下定义全局宏定义:
#ifdefOS_GLOBALS
#defineOS_EXT
#else
#defineOS_EXTextern
#endif
OS_EXTINT32UOSIdleCtr;
同时,有中以下定义:
#defineOS_GLOBALS
#include“”
当编译器处理时,它使得头文件变成如下所示,因为OS_EXT被设置为空。
INT32UOSIdleCtr;
这样编译器就会将这些全局变量分配在内存中。
当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。
externINT32UOSIdleCtr;
在这种情况下,不产生内存分配,而任何.C文件都可以使用这些变量。
这样的就只需在.H文件中定义一次就可以了。
3.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的含义及作用
OS_ENTER_CRITICAL():
关中断;
OS_EXIT_CRITICAL():
开中断。
关中断和开中断是为了保护临界段代码。
用户的应用代码可以使用这两个宏来开中断和关中断。
很明显,关中断会影响中断延迟,所以要特别小心。
用户还可以用信号量来保护临界段代码。
4.基于PC的服务中如何测量PC_DisplayChar()的执行时间
答:
测量PC_DisplayChar()的执行时间的代码如下:
INT16Utime;
描述利用μC/OS_Ⅱ宏调用关中断和开中断处理共享数据的示意性代码程序。
OS_ENTER_CRITICAL();
/*在这里处理共享数据*/
OS_EXIT_CRITICAL();
8.信号量的典型应用包括哪些
信号量(Semaphores)是一种约定机制,在多任务内核中的典型应用包括:
(1)控制共享资源的使用权(满足互斥条件);
(2)标志某事件的发生
(3)使两个任务的行为同步
9.对信号量只能实施哪三种操作
一般地说,对信号量只能实施三种操作:
(1)初始化(INITIALIZE),也可称作建立(CREATE);
(2)等信号(WAIT)也可称作挂起(PEND);
(3)给信号(SIGNAL)或发信号(POST)。
10.给出μC/OS-Ⅱ中如何用信号量处理共享数据的示意代码
通过获得信号量处理共享数据的示意代码如下:
OS_EVENT*SharedDataSem;
voidFunction(void)
{
INT8Uerr;
OSSemPend(SharedDataSem,0,&
/*共享数据的处理在此进行,(中断是开着的)*/
OSSemPost(SharedDataSem);
11.给出初始化和启动μC/OS-Ⅱ的示意代码。
voidmain(void)
OSInit();
/*初始化uC/OS-II*/
.
通过调用OSTaskCreate()或OSTaskCreateExt()创建至少一个任务;
OSStart();
/*开始多任务调度!
OSStart()永远不会返回*/
12.描述建立任务OSTaskCreate()的函数原型。
建立任务OSTaskCreate()的函数原型为:
INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)
其中,
task:
任务代码的指针;
pdata:
当任务开始执行时传递给任务的参数的指针;
ptos:
分配给任务的堆栈的栈顶指针;
prio:
分配给任务的优先级。
13.任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。
请给出示意代码结构。
C/OS-Ⅱ描述的任务示意代码必须是以下两种结构之一:
voidYourTask(void*pdata)
{
){
/*用户代码*/
调用µ
C/OS-Ⅱ的服务例程之一:
OSMboxPend();
OSQPend();
OSSemPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF);
OSTimeDly();
OSTimeDlyHMSM();
/*用户代码*/
}
或
voidYourTask(void*pdata)
14.μC/OS-Ⅱ任务管理提供哪些服务
μC/OS-Ⅱ任务管理提供的服务包括:
(1)建立任务:
OSTaskCreate()或OSTaskCreateExt();
(2)删除任务:
OSTaskDel();
(3)请求删除任务:
OSTaskDelReq();
(4)改变任务的优先级:
OSTaskChangePrio();
(5)挂起任务:
OSTaskSuspend();
(6)恢复任务:
OSTaskResume();
(7)获得有关任务的信息:
OSTaskQuery()。
15.μC/OS-Ⅱ时间任务管理提供哪些服务
μC/OS-Ⅱ时间任务管理提供的服务包括:
(1)任务延时函数:
OSTimeDly()
(2)按时分秒延时函数:
OSTimeDlyHMSM()
(3)让处在延时期的任务结束延时:
OSTimeDlyResume()
(4)设置系统时间:
OSTimeGet()
(5)获得系统时间:
OSTimeSet()
16.μC/OS-Ⅱ提供的数据共享和任务通讯的方法包括哪些
μC/OS-Ⅱ提供的数据共享和任务通讯的方法包括五种方法:
(1)利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断。
(2)利用函数OSSchedLock()和OSSchekUnlock()对µ
C/OS-II中的任务调度函数上锁和开锁。
(3)信号量。
(4)邮箱。
(5)消息队列。
17.对于事件控制块进行的一些通用包括哪些操作
对于事件控制块进行的一些通用操作包括:
(1)初始化一个事件控制块:
OSEventWaitListInit();
(2)使一个任务进入就绪态:
OSEventTaskRdy();
(3)使一个任务进入等待该事件的状态:
OSEventTaskWait();
(4)因为等待超时而使一个任务进入就绪态:
OSEventTO()。
18.μC/OS-Ⅱ信号量提供哪些服务
μC/OS-Ⅱ信号量提供的服务包括:
(1)建立一个信号量:
OSSemCreate();
(2)等待一个信号量:
OSSemPend();
(3)发送一个信号量:
OSSemPost();
(4)无等待地请求一个信号量:
OSSemAccept();
(5)查询一个信号量的当前状态:
OSSemQuery()。
19.μC/OS-Ⅱ邮箱提供哪些服务
μC/OS-Ⅱ邮箱提供的服务包括:
(1)建立一个邮箱:
OSMboxCreate();
(2)等待一个邮箱中的消息:
OSMboxPend();
(3)发送一个消息到邮箱中:
OSMboxPost();
(4)无等待地从邮箱中得到一个消息:
OSMboxAccept();
(5)查询一个邮箱的状态:
OSMboxQuery()
20.μC/OS-Ⅱ消息队列提供哪些服务
μC/OS-Ⅱ消息队列提供的服务包括:
(1)建立一个消息队列:
OSQCreate();
(2)等待一个消息队列中的消息:
OSQPend();
(3)向消息队列发送一个消息(FIFO):
OSQPost();
(4)向消息队列发送一个消息(LIFO):
OSQPostFront();
(5)无等待地从一个消息队列中取得消息:
OSQAccept();
(6)清空一个消息队列:
OSQFlush();
(7)查询一个消息队列的状态:
OSQQuery()。
21.μC/OS-Ⅱ内存管理提供哪些服务
μC/OS-Ⅱ内存管理提供的服务包括:
(1)建立一个内存分区:
OSMemCreate();
(2)分配一个内存块:
OSMemGet();
(3)释放一个内存块:
OSMemPut();
(4)查询一个内存分区的状态:
OSMemQuery()。
22.移植µ
C/OS-Ⅱ时,要使µ
C/OS-Ⅱ正常运行,处理器必须满足哪些基本要求
要使µ
C/OS-Ⅱ正常运行,处理器必须满足以下要求:
(1)处理器的C编译器能产生可重入代码。
(2)用C语言就可以打开和关闭中断。
(3)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。
(4)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
(5)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。
23.描绘不可剥夺型内核中断响应示意图
24.举例描述µ
C/OS-II基于任务的应用程序设计方法
#include<
>
#defineTASK_STK_SIZE128
OS_STKAppStk_one[TASK_STK_SIZE];
µ
C/OS-II调度算法原理及其和调度方式
(1)优先级调度算法原理为:
给每一个任务分配一个惟一优先级,各优先级用一个整形数值标识,某优先级的值越大,其优先级越低:
某优先级的值越小,其优先级越高。
也就是说,如果当前操作系统准备进行调度,当有两个任务处于就绪状态,系统将优先执行优先级别高的任务。
(2)µ
C/OS-II操作系统有两种调度方式:
任务级任务调度和中断级任务调度,µ
C/OS-II操作系统在完成中断后允许进行新的调度。
26.描述µ
C/OS-II操作系统的任务级任务调度OS_Sched()的主要功能
(1)查找当前就绪表中最高优先级任务的优先级值;
(2)调用OS_TASK_SW()进行任务切换,切换到新任务执行。
27.从消息邮箱中读取消息的方式及其函数原型
(1)从消息邮箱中读取消息的方式包括:
非阻塞式读取和阻塞式读取两种方式。
(2)非阻塞式读取是指无论消息邮箱中是否有数据,读取操作也不阻塞,直接返回。
显然,如果有数据,将读取出来;
如果没有数据,将读取为NULL。
其函数原型为:
void*OSMboxAccept(OS_EVENT*pevent)
(3)阻塞式读取是指在消息邮箱中有数据时,直接读取出来;
如果没有数据,则使当前任务进入等待状态,系统执行调度程序执行新的任务,当下一次消息到来时将激活等待表中的最高优先级任务,从而使该任务进入就绪状态。
为了避免任务一直处于等待状态(所等待的资源一直未分配),可以设置一个等待的时间范围,当超过该延迟时,则直接返回。
void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)
四.论述题
1.论述μC/OS-Ⅱ控制下的任务状态转换图
μC/OS-Ⅱ控制下的任务状态转换图如下图所示。
在任一给定的时刻,任务的状态一定是在这五种状态之一。
(1)睡眠态(DORMANT):
指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理。
一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
(2)就绪态(READY):
当任务一旦建立,这个任务就进入就绪态准备运行。
把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:
OSTaskCreate()或OSTaskCreateExt()。
(3)运行态(RUN):
调用OSStart()可以启动多任务。
OSStart()函数运行进入就绪态的优先级最高的任务。
(4)等待状
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ucosii 操作系统 习题 嵌入式 方向