关于嵌入式~ucos的问题~

1、写出ucosii中断服务程序的示意性伪代码。并比较说明与时钟节拍中断服务程序之间的异同。简述普通中断服务程序和时钟中断服务程序各是怎样激活(脱离等待进入就绪)一个任务... 1、 写出ucosii中断服务程序的示意性伪代码。并比较说明与时钟节拍中断服务程序之间的异同。简述普通中断服务程序和时钟中断服务程序各是怎样激活(脱离等待进入就绪)一个任务的。
2、 有3个任务。任务1优先级最高,如果用此任务在屏幕上输出S字符,其它两个任务分别输出M和Y。3个任务如果在循环等待事件中,等待时间事件,请编写代码实现。
分析任务1在什么状况下是出让式调度切换;在什么情况下属于抢占调度。并请用ucosii源代码中的与此相关代码内容,作为你的说明依据。
3、 通过对上述任务代码的适当修改和调整功能(可利用教科书中例9-1中对超级循环中的某次顺序执行时间的特别延长技巧,来增强抢占效果的可视性),并用编译运行的效果,来例证你上述题2的论述。
4、 编写一个有3个任务的应用程序,在调度器每进行一次任务切换后,在显示器上显示正在运行任务的任务堆栈栈顶指针和任务优先级。
展开
 我来答
yuanchunfa143
2011-11-03
知道答主
回答量:1
采纳率:0%
帮助的人:2.8万
展开全部
1、 写出ucosii中断服务程序的示意性伪代码。并比较说明与时钟节拍中断服务程序之间的异同。简述普通中断服务程序和时钟中断服务程序各是怎样激活一个任务的。
答:终端服务程序示意性伪代码如下:
Void ISP_Function(void)
{
CPU寄存器内容进栈;
OSIntEnter();
If(OSintNesting==1)
{
OSTCBCur->OSTCBStkPtr=SP;
}
清中断源的中断申请标志;
重新开放中断;
运行中断服务代码;
OSIntExit();
恢复CPU寄存器内容;
执行中断返回指令;
}
时钟节拍中断服务程序和普通中断服务程序都是抢占式调度,但是两者激活任务的方式不同,而且时钟节拍中断服务程序可以激活所有被延时任务,对于时钟节拍中断服务程序,各任务无差别,而普通中断服务程序只能激活由于等待该事件,而主动放弃处理器被挂起的任务。
时钟节拍中断服务程序通过调用OSTimeTick()函数,修改任务控制块链表中任务控制块OSTCBDly参数,判断该参数是否为0,进而修改就绪表。
而普通中断服务程序是通过OSxxxPost()函数来唤醒被挂起的任务的。
2、 有3个任务。任务1优先级最高,如果用此任务在屏幕上输出S字符,其它两个任务分别输出M和Y。3个任务如果在循环等待事件中,等待时间事件,请编写代码实现。
分析任务1在什么状况下是出让式调度切换;在什么情况下属于抢占调度。并请用源代码的内容作为你的说明依据。
答:代码实现:
#include "includes.h"
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YourTaskStk[TASK_STK_SIZE];
OS_STK HisTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U x=0,y=0;
void MyTask(void *data);
void YourTask(void *data);
void HisTask(void *data);

void main(void)
{
char *s_M="S";

OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
OSTaskCreate(MyTask,s_M,&MyTaskStk[TASK_STK_SIZE-1],0);
OSStart();
}

void MyTask(void *pdata)
{
char *s_Y="M";
#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(YourTask,s_Y,&YourTaskStk[TASK_STK_SIZE-1],1);
for(;;)
{
if(x>10)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,6,0);
}

}

void YourTask(void *pdata)
{
char *s_H="Y";
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif

pdata=pdata;

OSTaskCreate(HisTask,s_H,&HisTaskStk[TASK_STK_SIZE-1],2);
for(;;)
{
if(x>10)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,3,0);
}

}

void HisTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif

pdata=pdata;

for(;;)
{
if(x>10)
{
x=0;
y+=2;
}
PC_DispChar(x,y,*(char *)pdata,DISP_BGND_BLACK+DISP_FGND_WHITE);
x+=1;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,2,0);
}
}
MyTask任务优先级最高,在打印一个S后,遇到OSTimeDlyHMSM函数,被挂起,此时是因为延时节拍数被修改不为0,主动放弃处理器,出让式调度。YourTask比HisTask优先级高,打印M后同样因为OSTimeDlyHMSM函数,被挂起,主动放弃处理器挂起,换HisTask执行,MyTask延时6s,YourTask延时3s,HIsTask延时2s,HisTask执行完一次,被挂起,延时节拍结束后,被时钟中断服务程序唤醒,其他两个任务依然被挂起,继续打印Y,这些都是主动放弃处理器,所以都是出让式调度。在MyTask准备执行第二次,YourTask准备执行第三次时,HisTask准备执行第四次时,因为就绪表发生改变,发生任务级调度,MyTask由于具有最高优先级而占有了处理器。
3、 通过对上述任务代码的适当调整和修改,并用编译运行的各种效果,来例证你的上述论述。
答:上述代码大部分的调度都是由于任务延时函数,做出让式调度。如果将YourTask的OSTimeDlyHMSM函数删除掉,则当MyTask挂起后,YourTask长时间占用处理器,HisTask由于优先级不够不能够抢占处理器,当MyTask挂起6s后,从新进入就绪表,进行任务级调度,MyTask由于高优先级重新占有处理器,由于YourTask并没有主动让出处理器,此时便是MyTask的抢占式调度。
4、 编写一个有3个任务的应用程序,在调度器每进行一次任务切换后,在显示器上显示正在运行任务的任务堆栈栈顶指针和任务优先级。
答:代码实现:
#include "includes.h"
#define TASK_STK_SIZE 512
OS_STK MyTaskStk[TASK_STK_SIZE];
OS_STK YourTaskStk[TASK_STK_SIZE];
OS_STK HisTaskStk[TASK_STK_SIZE];
INT16S key;
INT8U x=0,y=0;
void MyTask(void *data);
void YourTask(void *data);
void HisTask(void *data);

void main(void)
{
char *s_M="";

OSInit();
PC_DOSSaveReturn();
PC_VectSet(uCOS,OSCtxSw);
OSTaskCreate(MyTask,s_M,&MyTaskStk[TASK_STK_SIZE-1],0);
OSStart();
}

void MyTask(void *pdata)
{
char s[80];
char *s_Y="";
#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(YourTask,s_Y,&YourTaskStk[TASK_STK_SIZE-1],1);
for(;;)
{
sprintf(s,"%d",OSTCBCur->OSTCBPrio);
PC_DispStr(x,y,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
y++;
sprintf(s,"%d",OSTCBCur->OSTCBStkPtr);
PC_DispStr(x,y,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
y++;
if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,1,0);
}

}

void YourTask(void *pdata)
{
char s[80];
char *s_H="";
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif

pdata=pdata;

OSTaskCreate(HisTask,s_H,&HisTaskStk[TASK_STK_SIZE-1],2);
for(;;)
{
sprintf(s,"%d",OSTCBCur->OSTCBPrio);
PC_DispStr(x,y,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
y++;
sprintf(s,"%d",OSTCBCur->OSTCBStkPtr);
PC_DispStr(x,y,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
y++;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,2,0);
}

}

void HisTask(void *pdata)
{
char s[80];
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif

pdata=pdata;

for(;;)
{
sprintf(s,"%d",OSTCBCur->OSTCBPrio);
PC_DispStr(x,y,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
y++;
sprintf(s,"%d",OSTCBCur->OSTCBStkPtr);
PC_DispStr(x,y,s,DISP_FGND_YELLOW+DISP_BGND_BLUE);
y++;

if(PC_GetKey(&key)==TRUE)
{
if(key==0x1B)
{
PC_DOSReturn();
}
}
OSTimeDlyHMSM(0,0,3,0);
}
}
毛利1111
2011-11-03
知道答主
回答量:26
采纳率:0%
帮助的人:14.1万
展开全部
看见那戳男老师我就想吐,要学会自学,别想靠别人,简单问题别来问我,恶心的要死。最后还是你自己想吧,希望你是天才
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友af8b0cc
2011-11-14 · 超过46用户采纳过TA的回答
知道小有建树答主
回答量:158
采纳率:0%
帮助的人:75.3万
展开全部
期中考试都过iqule
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sf156454
2011-11-03
知道答主
回答量:28
采纳率:100%
帮助的人:17.2万
展开全部
哥们,你是软院的吧,我也等答案呢,这老师吃枪药了,好心人给点提示啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式