1. uC/OS-II允许中断嵌套,嵌套层数可达多少层?
A.32 B. 56 C. 128 D. 255
2. uC/OS-II的事件控制块有4种类型,需要使用4种不同的函数来创建。下列哪个函数用于创建事件控制块?
A.OSTaskCreate() B. OSThreadCreate() C. OSQCreate() D. OSCtxSw()
3. 关于uC/OS-II的基本特点,下列叙述中错误的是()
A.uC/OS-II是抢占式实时操作系统内核
B.uC/OS-II不支持时间片轮转调度法,因此赋予每个任务的优先级是相同的
C.uC/OS-II中每个任务拥有自用栈
D.uC/OS-II属于源代码公开的实时操作系统
4. 与通用计算机的操作系统相比较,下列各项中不属于嵌入式操作系统特点的是()
A.实时性 B. 抢占式多任务处理 C. 内核复杂 D. 高可靠性
5. 关于uC/OS-II的叙述正确的是()
A.uC/OS-II系统拥有统一的驱动程序,不需要开发商自行开发
B.uC/OS-II包含基本驱动程序
C.使用uC/OS-II的栈空间校验函数,可以确定每个任务到底需要多少栈空间
D.uC/OS-II是一个单内核操作系统
6. uC/OS-II能够提供周期性的时钟信号(即时钟节拍),用于实现任务的正确延时和超时确认。节拍率应该在什么范围内?
A.10Hz~100Hz B. 10Hz~1000Hz C. 100Hz~1000Hz D. 100Hz~10000Hz
7. 在uC/OS-II中,OS_Sched()函数进行任务调度的条件是()
A. OSIntNesting==0 && OSLockNesting ==0
B. OSIntNesting==0 && OSLockNesting ==1
C. OSIntNesting==1 && OSLockNesting ==0
D. OSIntNesting==1 && OSLockNesting ==1
8. 下列选项中用于完成创建任务的自用栈空间的uC/OS-II程序源代码的是()
A.OS_CPU_C.C B. OS_CORE.C C. OS_MEM D. OS_TASK.C
9. 实时操作系统的主要实时指标不包括()
A.截止时间(Finish Time) B. 吞吐量(Throughput)
C. 生存时间(Survival Time) D. 响应时间(Response Time)
9. 编写uC/OS-II的中断服务子程序主要使用哪种语言()
A.汇编语言或C语言 B. Java语言 C. PASCAL语言 D. C++语言
10. RTOS响应时间的具体指标不包括如下哪一项?
A.中断延迟时间()
B.任务切换时间()
C.进程切换时间()
D.存储器延迟时间()
D.就绪状态的任务表示已经具备运行条件但并不在运行的任务
11. 关于uC/OS-II中处于就绪状态的任务,下面叙述中正确的是()
A.该任务已经可以运行,一旦CPU空闲该任务将立即运行
B.该任务已经可以运行,但由于优先级不够暂时不能运行
C.该任务已经可以运行,一旦得到所需要的资源将立即运行
D.该任务已经可以运行,一旦事件信号量出现将立即运行
12. 在uC/OS-II操作系统下,由中断服务子程序代码完成的操作一定包括()
A.初始化任务的栈空间
B.调用OSIntEnter()或对OSNesting变量加1
C.关闭所有可屏蔽中断
D.利用函数OSSchedLock()给调度器上锁
13. 在uC/OS-II操作系统下,处于运行态的任务因更高优先级的任务就绪而被剥夺CPU使用权后将转入()
A.等待态
B.被中断态
C.就绪态
D.休眠态
14. uC/OS-II能够支持的任务数最多为()
A.16 B. 32 C. 64 D. 128
15. 下列关于uC/OS-II操作系统的描述中,错误的是()
A.在uC/OS-II中,任务是操作系统的基本调度单位
B.为保证内核精简,uC/OS-II不支持中断嵌套
C.uC/OS-II不支持时间片轮转调度法
D.uC/OS-II的事件控制块可以用于对信号量管理
16. 关于uC/OS-II的基本特点,以下说法错误的是()
A. uC/OS-II是抢占式实时操作系统内核
B. 由于存在内核任务,用户编写的应用程序最多可以有60个任务
C. uC/OS-II不支持时间片轮转调度法
D. uC/OS-II允许每个任务有不同的栈空间
17. 在uC/OS-II中有多种方法可以保护任务之间的共享数据和提供任务间的通信。其中不能达到保护目的的方法是()
A. 利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和打开中断
B. 利用函数OSSchedLock()和OSSchedUnlock()对任务调度函数上锁和开锁
C. 利用信号量、互斥信号量、邮箱和消息队列进行任务间通信
D. 利用内存文件进行任务间的大规模数据共享
18. 下列选项中与实时系统无必然联系的属性是()
A.可配置属性 B. 可预测性 C. 时间约束性 D. 确定性
19. 移植uC/OS-II到一个嵌入式系统电路板上正常运行,下面()条件不是必须的。
A.处理器的C编译器能产生可重入代码,且用C语言就可以打开和关闭中断
B.该电路板的处理器必须具备MMU(存储管理单元)
C.处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)
D.处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈
20. uC/OS-II操作系统启动的过程中,Bootloader执行完毕后,调用应用程序主文件(通常是main.c)里的main()函数。main()函数在执行过程中,除了用户函数和硬件初始化函数之外,需要执行以下三个主要的uC/OS-II函数:I.OSStart() II. OSTaskCreate() III. OSInit()
它们的执行顺序是
A.I、II、III
B.III、I、II
C.II、III、I
D.III、II、I
21. 下列关于uC/OS-II任务管理的叙述中错误的是()
A.它可以管理64个任务
B.用户任务最多只能有32个
C.空闲任务是系统所创建的第一个任务
22. uC/OS-II系统中的每个任务都处于以下5种状态之一:休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态。以下哪个说法是错误的?
A.任务处于休眠态,相当于该任务驻留在外存中,但还没有交给内核管理
B.任务处于就绪态,意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行
C.任务处于运行态,指任务得到了CPU的控制权正在运行之中
D.任务处于被中断态,是指发生中断时执行相应的中断服务,原来正在执行的任务暂时停止运行,进入了被中断状态
23. 以下关于嵌入式系统软件的描述中,错误的是()
A.在uC/OS-II操作系统中,各个任务间共享任务堆栈()
B.BootLoader的任务之一是加载和启动操作系统
C.WinCE是一种大型嵌入式操作系统
D.大多数嵌入式系统都是实时系统
24. 在uC/OS-II中,OSIint()函数先建立最初的任务就绪表,然后建立4个空白的数据链表。这4个空白的数据链表是()
A.任务控制块链表、事件控制块链表、消息队列链表和进程控制块链表
B.任务控制块链表、事件控制块链表、消息邮箱链表和进程控制块链表
C.任务控制块链表、事件控制块链表、消息队列链表和内存控制块链表
D.任务控制块链表、事件控制块链表、消息邮箱链表和内存控制块链表
E.任务控制块链表、事件控制块链表、标志链表和内存控制块链表
25. uC/OS-II操作系统内核通过任务控制块管理任务,下列各项中,不属于任务控制块的内容的是()
A.指向任务代码临界区的指针
B.指向任务堆栈栈顶的指针
C.任务的优先级
D.任务的状态字
26. 在uC/OS-II操作系统下,能使运行态任务转入等待态的系统函数是()
(I)OSSemPost() (II)OSTaskCreate()(III)OSSemPend()(IV)OSTimeDly()
A.(I)和(III)
B.(II)和(IV)
C.(III)和(IV)
D.仅(IV)
27. 当满足一定条件时,uC/OS-II操作系统内核将进行任务调度。下列各项中属于中断级任务调度需满足的条件是()
A.空闲任务被挂起
B.处于就绪态的最高优先级任务的优先级比被中断任务的优先级低
C.所有的中断服务程序均已经执行完毕
D.有足够的内存空间保存当前任务的上下文
28. 下列是关于uC/OS-II任务管理中空闲任务的叙述,其中错误的是()
A.它是系统创建的第一个任务
B.它是系统中优先级最低的任务
C.它始终处于等待状态
D.它是必不可少的一个系统任务
29. uC/OS-II的以下4个函数中,只有()与任务调度相关。
A.OSTickISR() B. OS_Sched()C. OSIntExit() D. OSTaskCreate()
30. 进行任务调度的函数是 OS_Sched() 。
31.嵌入式系统的三个基本要素是 嵌入性 、 专用性 、和 计算机系统 .
31. 优先级为29的任务在就绪表中位置的组号是 3 ,组内编号是 4 。
32. 嵌入式操作系统uC/OS-II中的任务状态有 就绪状态 、 运行状态 、 睡眠状态 、 等待状态 、和 中断服务状态。
33. uC/OS-II中用户任务能够使用的优先级最高的优先级是 0 .
1. uC/OS-II操作系统中表示正在运行任务的优先级的全局变量是 OSPrioCur ,指向正在运行任务的任务控制块的指针变量是 OSTCBCur .
34. 队列控制块OS_Q的属性有OSQPtr、 OSQStart 、 OSQSize 、 OSQOut 、 OSQIn 、OSQEnd 和 OSQEntries .
35.下列uC/OS-II的内核文件中:(A)os_core.c(B)os_mbox.c(C)os_sem.c(D)os_cfg.h(E)os_mutex.c(F)ucos_II.c(G)usos_II.h(H)inculudes.h(I)os_cpu.h(J)os_task.c(K)os_cpu_a.asm(L)os_time.c(M)os_cpu_c.c(N)os_q.c(O)os_flag.c,和系统运行的硬件相关的是 I 、 K 、 M 。与应用程序相关有 D 、 H 。
36. 事件控制块OS_EVENT的一个属性是OSEventType,它表示的事件的类型有OS_EVENT_TYPE_UNUSED、OS_EVENT_TYPE_MUTEX 、 OS_EVENT_TYPE_MBOX 、 OS_EVENT_TYPE_SEM 、 OS_EVENT_TYPE_Q 和OS_EVENT_TYPE_FLAG.
37. 一个任务的任务控制块中的指针OSTCBStkPtr指向 任务堆栈栈顶 .任务控制块中的OSTCBDly的作用是 任务等待时限.
38. uC/OS-II的某应用程序通过调用函数OSTaskCreate来创建任务,该函数主要完成哪些工作?
检测任务优先级是否合法和是否被使用;初始化任务堆栈,任务控制块;如果没有错误任务计数器加一,执行调度;否则放弃任务。
39. 什么是事件的等待任务列表?该表的内存结构是如何组成的?在哪些情况下该表的内容会发生变化?
40. 分别介绍信息量SEM和互斥性信号量MUTEX的作用和操作方式以及二者的区别。
信号量SEM是表明一个共享资源被使用情况的标志,该标志实质上是一个计数器;互斥性信号量MUTEX可以使任务以独占方式使用共享资源,防止出现优先级反转现象。
41. 什么是嵌入式系统?列举出三个典型的嵌入式系统。
嵌入式系统是对对象进行自动控制而使其具有智能化并可嵌入对象系统中的专用计算机系统。WindowsCE,uCLinux,uC/OS
42. 简述uC/OS-II内存管理中分配内存的过程。
1)创建动态内存分区;2)请求获得一个内存块;3)释放一个内存块;4)查询一个内存分区的状态
43. 简述uC/OS-II任务切换的过程。
首先把当前任务的断点指针保存到任务堆栈中,然后保存cpu寄存器到任务堆栈中;获取新的任务控制块并将新任务堆栈中的cpu寄存器值和断点值恢复。
44. 一个正在运行的uC/OS-II系统,某时刻OSRdyGrp的值为00100000,OSRdyTbl[5]的值为00000011.
(1)试判断当前最高优先级别的就绪任务的优先级是多少?
(00101001)2 = 43
(2)写出判断依据。
OSRdyGrp值为00100000 可以得出组号为y = 5 ;OSRdyTbl值为00000011可以得出组内编号为x = 3 ;则prio = y<<3 + x; 即43
45. 已知uC/OS-II系统中共有64个任务,某一个已就绪的任务的优先级prio=29,画出任务就绪表,标出该任务所对应的位置,写清依据。
29 = (00011101)2 取低六位011101则组号为3组内编号为5
46. 实时操作系统的设计应尽量满足哪些条件?
1)必须是多任务系统;2)任务的切换时间与系统中的任务数无关;3)中断延迟的时间可预知并尽可能短
47. 下表是uC/OS-II的一个数据结构,请回答:
OS_EVENT_TYPE_MUTEX | OSEventType | |||||||
prio | 0xFF | OSEventCnt | ||||||
NULL | OSEventPtr | |||||||
0x00 | OSEventGrp | |||||||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | OSEventTbl[] 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
(1) 该数据结构描述的是什么事件?
互斥事件OS_EVENT_TYPE_MUTEX
(2) OSEventCnt的高8位prio的作用是什么?对prio的设置在数值上应满足什么要求?OSEventCnt的低8位的作用是什么?
高8位prio的作用是用来存放为了避免出现优先级反转现象而要提升的优先级别prio;低8位的作用是存放信号值。
(3) OSEventGrp和OSEventTbl[]构成了一张表,应用程序创立该事件时,其初值全部为0,在什么情况下,该表中的有1出现?
出现因此事件而等待的任务则表中出现1
48. uC/OS-II任务管理中首先是创建一个任务,在创建任务的过程中,哪些情况会导致任务创建失败?
1.任务优先级不合法
2.任务优先级已经被使用
3.初始化TCB失败
4.初始化堆栈失败
5.。。。 。。。
49. 如果希望应用程序中任务的优先级别为32个,则表示最低优先级别的常数OS_LOWEST_PRIO的值应该是多少。如果应用程序中使用了系统提供的空闲任务和统计任务,则该应用程序最多可安排多少个任务?
31;30
50. 由于嵌入式系统的硬件特点,应用环境的多样性和开发手段的特殊性,使它与普通的操作系统有着很大的不同。其主要特点有哪些?
专用性强;可裁剪性好;实时性与可靠性好;功耗低。
51. 使用微内核嵌入式操作系统的优势是什么。
更好的可裁剪性方便移植;提高了系统的可扩展性,增强了系统的可靠性。
52. 简述在就绪表中登记一个任务的过程和注销一个任务的过程。
登记:当某个任务处于就绪状态时,系统将该任务登记在任务就绪表中,即在就绪表中将该任务的对应位设置为1;
注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务的对应位设置为0
53. 在uC/OS-II中,使得就绪任务表内容发生变化的情况有哪些?
有新任务被创建,并在就绪任务表中进行了登记;
有任务被删除;
有处于等待状态的任务被唤醒;
由于异步事件的发生,在中断服务程序中激活了一个或几个任务;
正在运行的任务需要等待某个事件而进入等待状态;
正在运行的任务调用延时函数而自愿进入等待状态。
54. 嵌入式实时操作系统uC/OS-II的状态有那些?请描述每个状态的主要特点。刚创建的任务处于什么状态?画出任务状态转换图
刚刚创建的任务处于就绪态
55. 什么是内核可剥夺的操作系统?
在可剥夺型内核中,CPU总是运行多个任务中优先级别最高的那个任务,即使CPU正在运行某个低优先级别的任务,当有高优先级别的任务准备就绪时,该高优先级别的任务就会剥夺正在运行任务的CPU使用权,而使自己获得CPU的使用权
56. 什么是优先级反转?引起优先级反转现在的原因是什么?如何避免优先级反转现象?
在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级先于高优先级任务而被运行的现象。使获得信号量任务的优先级别在使用共享资源期间暂时提升到所有任务最高优先级的高一个级别上,以使该任务不被其他任务打断,从而能尽快使用完共享资源并释放信号量,在释放信号量后,再恢复该任务原来的优先级别。
57. 结合uC/OS-II,阐述什么是嵌入式操作系统的可移植性。
为了适应多种多样的平台,嵌入式操作系统应可在不做大量修改的情况下稳定的运行在不同的平台。
58. 结合uC/OS-II,阐述什么是嵌入式操作系统的可裁减性。
嵌入式操作系统运行的硬件平台多种多样,其宿主对象五花八门,所以要求嵌入式操作系统中提供的各个功能模块可以让用户根据需要选择使用,即要求具有良好的可裁剪性。
59. 阅读程序回答问题
void OSTaskIdle(void *pdata)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
pdata = pdata;
for(;;)
{
(1) ;//
OSdleCtr++;
(2) ;//
}
}
问题:
1. 变量OSdleCtr是全局变量,属于临界资源。填写出(1)、(2)处的语句。
(1) OS_ENTER_CRITICAL()
(2) OS_EXIT_CRITICAL()
2. 该任务的优先级是什么?(3分)
63
60. 阅读程序回答问题
#if OS_TIME_GET_SET_EN > 0
INT32U OSTimeGet (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
INT32U ticks;
OS_ENTER_CRITICAL();
ticks = (I) ;
OS_EXIT_CRITICAL();
return ( (II) );
}
#endif
问题:
1. 完成出(I)、(II)处的语句。
(I)OSTickCtr
(II)ticks
2. 语句(I)和(II)的作用分别是什么?
1:获取OSTickCtr系统滴答计数器里面存储的滴答数赋值给ticks;2:返回ticks
61. 以下是嵌入式实时操作系统uC/OS-II中的两个系统函数,阅读源代码并回答问题。
void OSIntEnter (void)
{
if (OSRunning == TRUE) {
if (OSIntNesting < 255){
(1) ;
}
}
}
void OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
if (OSRunning == TRUE){
OS_ENTER_CRITICAL();
if (OSIntNesting > 0){
(2) ;
}
if ((OSIntNesting == 0) && (OSLockNesting == 0)) {
OSIntExitY = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((OSIntExitY << 3) +
OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
if (OSPrioHighRdy != OSPrioCur){
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OSIntCtxSw();
}
}
OS_EXIT_CRITICAL();
}
}
1. 这两个函数分别在什么时候被调用的?
响应中断的时候被调用
2. 填写出(1)、(2)处的语句。
(1) OSIntNesting++
(2) OSIntNesting--
3. 这两个函数的作用分别是什么?
OSIntEnter()的作用是把全局变量OSIntNesting加1用来记录嵌套层数;(进入中断服务程序)
OSIntExit():作用退出中断服务程序
4. 函数中的宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的作用是什么?
OS_ENTER_CRITICAL()关中断
OS_EXIT_CRITICAL()开中断
5. 数组OSTCBPrioTbl[]的下标有什么特殊意义?数组元素值是什么?
下标是优先级,数组元素值代表此优先级对应的tcb指针
6. 简述OSPrioHighRdy的查找过程。
首先使用OSUnMapTab[]数组查找下标为OSRdyGrp的值作为prio的高三位记作y
然后使用OSUnMapTab[]数组查找下标位OSRdyTab[y] 的值作为prio的低三位 x
最后拼接y << 3 + x 作为OSPrioHighRdy
62. 任务控制块结构的定义和创建任务的代码如下,试回答问题。
typedef struct os_tcb {
OS_STK *OSTCBStkPtr;
struct os_tcb *OSTCBNext;
struct os_tcb *OSTCBPrev;
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0)
|| (OS_MUTEX_EN > 0)
OS_EVENT *OSTCBEventPtr;
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
void *OSTCBMsg;
#endif
#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
OS_FLAG_NODE *OSTCBFlagNode;
#endif
OS_FLAGS OSTCBFlagsRdy;
#endif
INT16U OSTCBDly;
INT8U OSTCBStat;
INT8U OSTCBPrio;
INT8U OSTCBX;
INT8U OSTCBY;
INT8U OSTCBBitX;
INT8U OSTCBBitY;
#if OS_TASK_DEL_EN > 0
BOOLEAN OSTCBDelReq;
#endif
} OS_TCB;
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
OS_STK *psp;
INT8U err;
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) {
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {
OSTCBPrioTbl[prio] = (OS_TCB *)1; //………………………. (1)
OS_EXIT_CRITICAL();
psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);
err = OS_TCBInit(prio,psp,(OS_STK *)0,0,0,(void *)0,0);
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++;
OS_EXIT_CRITICAL();
if (OSRunning == TRUE) { OS_Sched(); }
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0; //………………………. (2)
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
1. 在创建一个任务后,指针OSTCBStkPtr、OSTCBNext、OSTCBPrev和OSTCBEventPtr的指向分别是什么?
OSTCBStkPtr:任务堆栈栈顶;OSTCBNext:下一个任务控制块;OSTCBPrev:前一个任务控制块;OSTCBEventPtr:事件控制块
2. 成员OSTCBDly、OSTCBStat、OSTCBPrio、OSTCBX、OSTCBY、OSTCBBitX以及OSTCBBitY的作用分别是什么?
OSTCBDly:任务等待时限;OSTCBStat:任务当前状态;OSTCBPrio:任务优先级;
OSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY用于快速访问就绪表
3. 语句(1)处的OSTCBPrioTbl[prio] = (OS_TCB *)1;起什么作用?
保留优先级
4. 为什么要有(2)处的语句OSTCBPrioTbl[prio] = (OS_TCB *)0;
如果任务创建失败需要归还前面保留的优先级
5. 哪些情况下不能成功创建任务?(5分)
1.任务优先级不合法
2.任务优先级已经被使用
3.初始化TCB失败
4.初始化堆栈失败
5.。。。 。。。
63. 在uC/OS-II应用程序需要一个内存块时,则通过调用函数OSMemGet()向某内存分区请求获得一个内存块,该函数的源代码如下,请画出请求获得一个内存块的流程图。
void *OSMemGet (OS_MEM *pmem, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
void *pblk;
#if OS_ARG_CHK_EN > 0
if (pmem == (OS_MEM *)0) {
*err = OS_MEM_INVALID_PMEM;
return ((OS_MEM *)0);
}
#endif
OS_ENTER_CRITICAL();
if (pmem->OSMemNFree > 0) {
pblk = pmem->OSMemFreeList;
pmem->OSMemFreeList = *(void **)pblk;
pmem->OSMemNFree--;
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
return (pblk);
}
OS_EXIT_CRITICAL();
*err = OS_MEM_NO_FREE_BLKS;
return ((void *)0);
}
64. 阅读以下uC/OS-II操作系统中系统函数源代码并回答问题。
void OSStart (void)
{
INT8U y;
INT8U x;
if (OSRunning == FALSE) {
y = OSUnMapTbl[OSRdyGrp]; (1)
x = OSUnMapTbl[OSRdyTbl[y]]; (2)
OSPrioHighRdy = (INT8U)((y << 3) + x); (3)
OSPrioCur = (4) ;
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSTCBCur = OSTCBHighRdy;
OSStartHighRdy();
}
}
1. 分析函数中(1)、(2)语句中变量x、y所赋值的含义,其算法依据是什么?
Y是获取prio的高三位;x是获取prio的低三位。位图?
2. 语句(3)的作用是什么?合成prio
3. 完成(4)处的语句。
OSPrioHighRdy
5. 程序中变量OSPrioCur的作用是什么?
指向当前正在运行的任务的优先级
6. 数组OSTCBPrioTbl[]的下标和元素值分别表示什么?
下标是优先级,值是该优先级对应的tcb指针
6. 调用函数OSStartHighRdy()的目的是什么?
使得整个系统得以运转
65. 阅读以下uC/OS-II操作系统中系统函数源代码并回答问题。
OS_EVENT *OSSemCreate (INT16U cnt)
{
#if OS_CRITICAL_METHOD == 3
/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_EVENT *pevent;
if (OSIntNesting > 0) {
/* See if called from ISR ... */
return ((OS_EVENT *)0);
/* ... can't CREATE from an ISR */
}
OS_ENTER_CRITICAL();
pevent = OSEventFreeList;
/* Get next free event control block */
if (OSEventFreeList != (OS_EVENT *)0) {
/* See if pool of free ECB pool was empty */
OSEventFreeList = (OS_EVENT *) (1) ;
}
OS_EXIT_CRITICAL();
if (pevent != (OS_EVENT *)0) {
/* Get an event control block */
pevent->OSEventType = OS_EVENT_TYPE_SEM;
pevent->OSEventCnt = (2) ;
/* Set semaphore value */
pevent->OSEventPtr = (void *)0;
/* Unlink from ECB free list */
#if OS_EVENT_NAME_SIZE > 0
(void)strcpy(pevent->OSEventName, "?");
#endif
OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem. */
}
return ( (3) );
}
问题:
1. 完成(1)、(2)、(3)处的语句
1. (OS_EVENT *)OSEventFreeList->OSEventPtr
2. Cnt
3. pevent
2. (1)、(2)、(3)处的语句的功能分别是什么?
1.OSEventFreeList指向下一个空事件
2.置计数器初始值
3.返回事件指针
66. 阅读以下uC/OS-II操作系统中系统函数源代码并回答问题。
void OSTimeDly (INT16U ticks)
{
#if OS_CRITICAL_METHOD == 3
/* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT8U y;
if (ticks > 0) {
/* 0 means no delay! */
OS_ENTER_CRITICAL();
y = OSTCBCur->OSTCBY;
/* Delay current task */
OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
if (OSRdyTbl[y] == 0) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
OSTCBCur->OSTCBDly = (4) ; /* Load ticks in TCB */
OS_EXIT_CRITICAL();
(5) ; /* Find next task to run! */
}
}
问题:
1. 完成(4)、(5)处的语句。
4.ticks;
5.OS_Sched()
2. (4)、(5)处的语句的功能分别是什么?
4.延时节拍数存入tcb中
5.调用OS_Sched()执行下一个任务
67. uC/OS-II通过调用函数OSMemPut()来释放一个内存块,该函数的源代码如下,请画出释放内存块的流程图并分析为什么释放内存块时一定要确保把内存块释放到它原来所属的分区?
INT8U OSMemPut (OS_MEM *pmem, void *pblk)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
#if OS_ARG_CHK_EN > 0
if (pmem == (OS_MEM *)0) {
return (OS_MEM_INVALID_PMEM);
}
if (pblk == (void *)0) {
return (OS_MEM_INVALID_PBLK);
}
#endif
OS_ENTER_CRITICAL();
if (pmem->OSMemNFree >= pmem->OSMemNBlks) {
OS_EXIT_CRITICAL();
return (OS_MEM_FULL);
}
*(void **)pblk = pmem->OSMemFreeList;
pmem->OSMemFreeList = pblk;
pmem->OSMemNFree++;
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
本文来源:https://www.2haoxitong.net/k/doc/30d1771101d8ce2f0066f5335a8102d276a2613a.html
文档为doc格式