嵌入式系统操作系统大题及上机实验

例子:有4个任务,优先级分别为6,10,11,17,
已知映射表(OSMapTbl[]),判定表(OSUnMapTbl[])如图所示
要求写就绪表,获取最高优先级怎样让任务进入退出就绪.
6对应二进制为:000110
高3位:000=0通过OSMapTbl映射后:OSMapTbl[prio>>3]=OSMapTbl[0]=00000001
低3位:110=6通过OSMapTbl映射后: OSRdyTbl[prio>>3]=OSRdyTbl[0]=010*******

10对应二进制为:001010
高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=00000010
低3位: 010=2通过OSMapTbl映射后 OSRdyTbl[prio>>3]=OSRdyTbl[1]=00000100

11对应二进制为:001011
高三位:001=1通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=00000010
低三位:011=3通过OsMapTbl映射后 OSRdyTbl[prio>>3]=OSRdyTbl[1]=00001000

17对应二进制为:010001
高三位:010=2经过OsMapTbl映射后 OsMapTbl[prio>>3]=OsMapTbl[2]=00000100
低三位:001=1经过OsMapTbl映射后 OsRdyTbl[prio>>3]=OsRdyTbl[2]=00000010

***通过就绪任务算法:
OSRdyGrp|=OSMapTbl[prio>>3] //获取就绪表中的行
OsRdyTbl[prio>>3]|=OSMapTbl[prio&0x07]//获取就绪表中的列

最后OSRdyGrp的值就是将所有OsMapTbl[prio>>3]进行位或运算
OSRdyGrp=00000001|00000010|00000010|00000100
=00000111=0x07

OSRdyTbl[0]=01000000
OSRdyTbl[1]=00000100|00001000=00001100 相同的行列要进行或运算
OSRdyTbl[2]=00000010
然后查询优先级判定表OSUnMapTbl[]
OSRdyGrp=0x07
Y=OSUnMapTbl[0x07]=0说明最高优先级在第0组
OSRdyTbl[0]=01000000=0x40
X=OSUnMapTbl[0x40]=6
最高优先级为:prio=y*8+x=6
//进行任务调度运行就可以了
//退出任务。将对应就绪表位的置1清零ok
if((OSRdyTbl[prio>>3]&=~OSMapTbl[prio&0x07])==0) //
OSRdyGrp&=~OSMapTbl[prio>>3];

优先级反转:(3个任务,TA0,TA1,TA2)
答:1) 系统初始化,之后进入main 函数;
2) 在 main 函数中,首先创建一个二值的信号量mutex;
3) 在 main 函数中创建TaskStart 任务,由TaskStart 任务创建所有的应用任务(TA0、
TA1、TA2)。优先级较高的任务TA0、TA1 先延时若干个时钟节拍,以便低优先级
任务TA2 运行。
4) t1 时刻,任务TA2 运行并首先申请到信号量mutex;
5) t2 时刻,任务TA1 延时到期,任务TA1 的优先级高于任务TA2 的优先级,因此任
务TA1 立刻抢占TA2 执行,任务TA2 由执行态转为就绪态;
6) t3 时刻,任务TA0 延时到期,任务TA0 的优先级高于任务TA1 的优先级,所以任
务TA0 立刻抢占执行,任务TA1 由执行态转为就绪态,任务TA0 申请二值信号量
mutex 被阻赛;
7) t4 时刻,任务TA1 由就绪态转回为执行态;此时TA0 在等待TA2 保持的mutex , 而
TA2 又因为优先级低于TA1 被阻塞。如果TA1 一直执行而TA2 没有机会被调度的
话,那么TA2 将一直等到TA1 执行完后才能执行,而TA0 更要等到TA2 释放它所
占有的信号量资源后才能执行,这

样就出现了优先级高的TA0 任务等待优先级低的
TA1 任务的现象;
8) t5 时刻,任务TA1 挂起自己,而TA0 又因为申请二值信号量mutex 而处于阻塞状态,
所以任务TA2 由就绪态转为执行态,任务TA2 释放信号量mutex;
uC/OS-II 实验指导书
- 30 -
9) t6 时刻,TA0 获得信号量并立刻抢占执行,任务TA2 由执行态转为就绪态;
10) t7 时刻,任务TA0 将自己延时一段时间,而TA1 仍然处于挂起状态,TA2 是当前最
高优先级的就绪任务,它又转为执行状态,任务TA2 因申请二值信号量mutex 而阻
塞;
11) t8 时刻,任务TA1 延时到期转为执行态,任务TA1 又因等待一个事件而阻塞;
12) t9 时刻,任务TA0 延时到,释放二值信号量mutex,mutex 被TA2 得到后,内核自
动切换任务;
13) t10 时刻,在就绪队列中,TA0 优先级最高,TA0 执行,又因为任务TA0 等待一事
件而阻塞;
14) t11 时刻,任务TA1 延时到期,立刻抢占执行,又由于任务TA1 等待一事件而阻塞;;
15) t12 时刻,任务TA2 执行,保持信号量mutex;以后系统再次出现优先级反转现象;
16) 系统如此周而复始地运行……

1.在main函数里创建二值信号量:
OS_EVENT* mutex;
mutex=OSSemCreate(1);
2、在main()函数中创建TaskStart任务
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 4);
3.在TaskStart任务中创建并启动所有的应用任务TA0,TA1,TA2.
void TaskStartCreateTasks(void)(TaskStart中调用)
{
INT8U i;
for(i=0;i{
TaskData[i]=i;

}
OSTaskCreate(Task0,(void*)&TaskData[0],&TaskStk[0][TASK_STK_SIZE-1],5);
OSTaskCreate(Task1,(void*)&TaskData[1],&TaskStk[1][TASK_STK_SIZE-1],6);
OSTaskCreate(Task2,(void*)&TaskData[2],&TaskStk[2][TASK_STK_SIZE-1],7);
}
//任务Task0优先级最高,他需要使用信号量mutex
void Task0(void *pdata)
{
INT8U err;
INT8U id;
id=*(int*)pdata;
for(;;)
{
printf("Task_%d waitting for an EVENT\n\r",id);
OSTimeDly(200);
printf("Task_%d's EVENT CAME!\n\r",id);
printf("Task_%d trying to GET MUTEX\n\r",id);
OSSemPend(mutex,0,&err); //获取信号量
switch(err)
{
case OS_NO_ERR;
printf("Task_%d GOT mutex.\n\r",id);
break;
default:
printf("Task_%d CANNOT get mutext ,the SUPENDED.\n\r",id);

}
OSTimeDly(200);
printf("Task_%d RELEASE mutex\n\r",id);
OSSemPost(mutex);
}
}
//任务TA1具有中等优先级,它不使用信号量
void Task1(void *pdata)
{
INT8U id;
id=*(int*)pdata;
for(;;)
{
printf("Task_%d waitting for an EVBT\n\r",id);
OSTimeDly(100);
printf("Task_%d EVENT CAME!\n\r",id);
OSTimeDly(100);
}
}
//任务TA2的优先级最低,和最高优先级任务TA0共用信号量mutex;
void Task2(void *pdata)
{
INT8U err;
INT8U id;
id=*(int*)pdata;
for(;;)

{
printf("Task_%d trying GET MUTEX\n\r",id);
OSSemPend(mutex,0,&err);
switch(err)
{
case OS_NO_ERR;
printf("Task_%d GOT mutex\n\r",id);
OSTimeDly(200);
break;
default:
printf("Task_%d CANNOT get mutex,then SUSPENDED\n\r",id);
OSTimeDly(200);
break;

}
printf("Task_%d RELEASE mutex\n\r",id);
OSSemPost(mutex); //释放mutex
}
}

shell程序:从键盘输入月份,显示当月的日历(假定为2013年)
#!/bin/bash
echo "Please input month:"
read num
year=2013
cal $num $year

shell:从键盘输入学生的成绩,实时判断并显示其对应的成绩等级,例如60分以下为“Failed!”,
60-70分为“Passed!”,70-80分为“Medium!”,80-90分为“Good!”,90-100为“Excellent!”。
#!/bin/bash
echo "Please input grade:"
read grade
if [ "$grade" -ge "0" ] && [ "$grade" -lt "60" ]
then
echo "Failed!"
fi
if [ "$grade" -ge "60" ] && [ "$grade" -lt "70" ]
then
echo "Passed!"
fi
if [ "$grade" -ge "70" ] && [ "$grade" -lt "80" ]
then
echo "Medium!"
fi
if [ "$grade" -ge "80" ] && [ "$grade" -lt "90" ]
then
echo "Good!"
fi
if [ "$grade" -ge "90" ] && [ "$grade" -le "100" ]
then
echo "Excellent!"
fi

填空题:
功能查询指定命令或资源的联机手册:main
查询指定命令使用参数:--help
显示工作目录:pwd
切换目录:cd
列出目录的内容:ls
建立目录:mkdir
删除目录:rmdir
复制文件或目录:cp
删除文件或目录:rm
移动或更名现有的文件或目录:mv
建立或更新文件的修改日期:touch
查找指定文件或命令:locate
查看文件内容,合并文件:cat
分页显示内容:more
分页显示文件内容:less
在目录中搜索满足查询条件的文件:find
查找文件中包含有指定字符串的行:grep
统计文件内容:wc
对文本文件的各行进行排序:sort
建立链接:in
改变文件或目录的许可权限:chmod
该命令用于设置别名或显示已有的别名命令:alias
使一个普通的使用者拥有超级用户或其他使用者的权限:su
用来归档、备份、压缩和解压缩:tar
压缩、解压文件(压缩文件成.gz的压缩文件):gzip
压缩、解压文件(压缩文件成.bz2的压缩文件):bzip2
挂上文件系统:mount
报告程序状况:ps
删除执行中的程序或工作:kill
vi的使用:yy复制当前行,nyy复制n行
x删除一个字符,dd删除当前行,ndd删除n行。dw删除一个单词





相关文档
最新文档