pdata: 当任务开始执行时传递给任务的参数的指针; ptos: 分配给任务的堆栈的栈顶指针; prio: 分配给任务的优先级。
13.任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。 请给出示意代码结构。
答:μC/OS-Ⅱ描述的任务示意代码必须是以下两种结构之一: void YourTask (void *pdata) {
for (;;) {
/* 用户代码 */
调用μC/OS-Ⅱ的服务例程之一:
OSMboxPend(); OSQPend(); OSSemPend();
OSTaskDel(OS_PRIO_SELF);
OSTaskSuspend(OS_PRIO_SELF); OSTimeDly();
OSTimeDlyHMSM(); /* 用户代码 */ } } 或
void YourTask (void *pdata) {
/* 用户代码 */
OSTaskDel(OS_PRIO_SELF); }
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()
9
(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();
10
(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
#define TASK_STK_SIZE 128
OS_STK AppStk_one[TASK_STK_SIZE]; //任务one的堆栈 OS_STK AppStk_two[TASK_STK_SIZE]; //任务two的堆栈 OS_STK AppStk_three[TASK_STK_SIZE]; //任务three的堆栈 static void App_one(void *p_arg); //任务one代码 static void App_two(void *p_arg); //任务two代码 static void App_three(void *p_arg); //任务three代码 void main(int argc, char *argv[]) {
OSInit(); //初始化系统
11
//依次创建三个任务
OSTaskCreate(App_one,NULL,(OS_STK*)&AppStk_one[TASK_STK_SIZE-1],(INT8U)10);
OSTaskCreate(App_two,NULL,(OS_STK*)&AppStk_two[TASK_STK_SIZE-1],(INT8U)20); OSTaskCreate(App_three,NULL,(OS_STK*)&AppStk_three[TASK_STK_SIZE-1],(INT8U)30);
OSStart(); //启动多任务,将CPU控制权交给系统 }
25. μ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, INT16U timeout, INT8U *err)
四.论述题
1. 论述μC/OS-Ⅱ控制下的任务状态转换图
答:μC/OS-Ⅱ控制下的任务状态转换图如下图所示。
12