永发信息网

关于嵌入式~ucos的问题~

答案:4  悬赏:50  手机版
解决时间 2021-11-11 00:37
关于嵌入式~ucos的问题~
最佳答案
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);
}
}
全部回答
哥们,你是软院的吧,我也等答案呢,这老师吃枪药了,好心人给点提示啊
期中考试都过iqule
看见那戳男老师我就想吐,要学会自学,别想靠别人,简单问题别来问我,恶心的要死。最后还是你自己想吧,希望你是天才
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
27方等于多少吨
如果整个大城市停电了,没有人居住了,会出现
请问美剧“大西洋帝国”中黑人领袖chalky whi
8 4 8 10 14 找规律
已知1<x<2,x+1/(x-1)=7,则√x-1 -1/(
中国邮政储蓄银行(枞阳县支行)地址在什么地方
英语翻译准确的 怎么用英语 表达
电梯五方通话线路过长如何解决
谁有S.H.E的资料?
牡丹峰的烤肉莱州最好吃吗?
42度500 ml 黄瓶迎驾贡酒价格多少
将公司资金挪用了借给他人谁应承担责任?
玩博雅麻将全集时,抢了一个红包,怎么用啊
立式沙袋各部位尺寸。如沙袋的直径,高度,底
一直进不去怎么回事
推荐资讯
清华大学自动化系本系的学生为何读直硕的多
羽を休める
纽曼c58车载mp3怎么设置空频道
南昌徐坊客运站到火车站有多远?
我三十岁.得了焦虑症,很痛苦,想寻求帮助
姓闫的怎么介绍给别人好听
夫妻双方分居多久自动离婚?
费字的音节是什么
联通沃TV多少钱一个月,。?
求例2详细过程
中国移动通信集团黑龙江有限公司集贤分公司怎
3月份签的劳动合同社保4月生效?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?