文档介绍:计算机软件 09级 2011-2012 上学期期中考试题姓名:吴洋学号: 8000609098 班级:计算机软件 092 班专业:计算机软件 1、写出 ucosii 中断服务程序的示意性伪代码。并比较说明与时钟节拍中断服务程序之间的异同。简述普通中断服务程序和时钟中断服务程序各是怎样激活(脱离等待进入就绪) 一个任务的。答:(1) ucosii 中断服务程序示意性伪代码如下: void OSIRS(void) { 中断服务程序入口地址即中断向量设置; 保存处理器寄存器; 调用 OSIntEnter(); // 通知系统进入中断服务程序,记录中断嵌套层数 if(OSIntNesting==1) { OSTCBCur->OSTCBStkPtr=SP; } 清除中断源的中断申请标志; 重新开放中断; 运行终端服务代码; 调用 OSIntExit(); // 中断嵌套层数减 1 ,通知系统退出中断服务程序恢复处理器寄存器; 中断返回;}(2) 相同点:普通中断服务程序和时钟节拍中断服务程序的入口地址都是通过中断向量指定的,在中断服务程序中,以相同的方式保存处理器寄存器,调用 OSIntEnter() 函数记录并处理中断嵌套层, 同时当且仅当( OSIntNesting==1 ) 时把 SP 的值赋给 OSTCBCur->OSTCBStkPtr ( OSTCBCur->OSTCBStkPtr=SP ), 清除中断源的中断标志, 重新开放中断, 且都需调用 OSIntExit() 函数通知系统退出中断服务程序, 恢复处理器寄存器以及中断返回。不同点: 普通中断服务程序在执行开放中断后运行用户编写的中断服务代码, 而时钟节拍中断服务程序,在执行 OSTCBCur->OSTCBStkPtr=SP ;语句后调用 OSTimeTick() 函数在每个时钟节拍了解每个任务的延时状态, 使其中已经到了延时时限的非挂起任务进入就绪状态。(3 )普通中断服务程序通过调用 OSTTaskResume() 函数激活一个任务,而时钟节拍中断服务函数通过调用 OSTimeTick() 函数在每个时钟节拍了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态,开放中断后无相应的中断服务代码。 2、有3 个任务。任务 1 优先级最高, 如果用此任务在屏幕上输出 S 字符, 其它两个任务分别输出 M和Y。3 个任务如果在循环等待事件中,等待时间事件,请编写代码实现。分析任务 1 在什么状况下是出让式调度切换; 在什么情况下属于抢占调度。并请用 ucosi i 源代码中的与此相关代码内容,作为你的说明依据。答:(1 )程序代码如下: #include "" #define TASK_STK_SIZE 512 OS_STK StartTaskStk[TASK_STK_SIZE]; OS_STK MyTaskStk[TASK_STK_SIZE]; OS_STK YouTaskStk[TASK_STK_SIZE]; INT16S key; INT8U y0=0,y1=0,y2=0; void StartTask(void *data); void MyTask(void *data); void YouTask(void *data); void main (void) { OSInit( ); PC_DOSSaveReturn( ); PC_VectSet(uCOS, OSCtxSw); OSTaskCreate(StartTask, (void*)0, &StartTaskStk[TASK_STK_SIZE - 1], 0); OSStart( );} void StartTask (void *pdata) { #if OS_CRITICAL_METHOD == 3 OS_CPU_SR cpu_sr; #endif pdata = pdata; OS_ENTER_CRITICAL( ); PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL( ); OSStatInit( ); OSTaskCreate(MyTask, (void*)0, &MyTaskStk[TASK_STK_SIZE - 1], 1); OSTaskCreate(YouTask, (void*)0, &YouTaskStk[TASK_STK_SIZE - 1], 2); for (;;) { PC_DispStr(5, ++y0, "S", DISP_BGND_BLACK+DISP_FGND_WHITE ); if (PC_GetKey(&key) == TR