您好,欢迎访问三七文档
1.操作系统的作用:操作系统是计算机硬件系统与应用程序之间的接口。它在计算机应用程序与计算机硬件系统之间,屏蔽了计算机硬件工作的一些细节,为应用程序提供了一个界面友好,性能稳定,安全,效率高,操作方便的虚拟计算机,并对系统中的资源进行有效的管理。2.操作系统的功能操作系统其功能主要是对计算机资源进行管理,具体来说其主要功能如下:•处理器的管理•存储的管理•设备的管理•文件的管理•网络和通信的管理•提供用户接口3.C/OS-II的任务就是一个函数。C/OS-II的任务由三个部分组成:任务程序代码(函数)、任务堆栈和任务控制块。4.C/OS-II的任务有两种:用户任务和系统任务。在C/OS-II中,最多可以含有64个任务(包括用户任务和系统任务)。5.C/OS-II系统中的任务共有5种状态:只有运行状态才能到等待状态6.为了有效的对中断进行控制,在任务的代码里可使用uC/OS-II定义的宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来控制何时响应中断,何时屏蔽中断。这两个宏之间的代码时是不会响应中断的,这种受保护的代码段叫临界段。OS_ENTER_CRITICAL();//进入临界段(关中断)OS_EXIT_CRITICAL();//退出临界段(开中断)7.例:如果希望应用程序中任务的优先级别为28个,则表示最低优先级别的常数OS_LOWEST_PRIO值应该是多少?如果应用程序中使用了系统提供的空闲任务和统计任务,则该应用程序最多可以安排多少个任务?答:表示最低优先级别的常数OS_LOWEST_PRIO值应该为27,优先级别分别为0,1,2,3,...,27;由于系统空闲任务占用了优先级别27,统计任务占用了优先级别26,则应用程序中最多可以安排优先级别分别为0,1,2,...,25的26个任务。8.C/OS-II中堆栈的数据类型为为OS_STK,在文件OS_CPU.H中定义:typedunsignedintOS_STK;//该类型长度为16位2个字节9.创建任务函数OSTaskCreate()的原型如下:INT8UOSTaskCreate(void(*task)(void*pd),//指向任务的指针void*pdata,//传递给任务的参数OS_STK*ptos,//任务堆栈栈顶的指针INT8Uprio);//指定任务优先级别的参数);创建一个任务MyTask,任务堆栈的长度为128字节,优先级别为20,任务参数pdata的实参为MyTaskAgu。试写出main()函数的代码。#defineMyTaskStkN64OS_STKMyTaskStk[MyTaskStkN];voidmain(void{……OSTaskCreate(MyTask,//任务的指针&MyTaskAgu,//传递给任务的参数&MyTaskStk[MyTaskStkN-1],//任务堆栈栈顶地址20);//任务的优先级别支持堆栈向下增长方式的处理器设置参数ptos。如果使用的处理器支持堆栈的增长方向向上,则应该为:OSTaskCreate(MyTask,&MytaskAgu,&MyTaskStk[0],20);10.OS_STK*OSTCBStkPtr;//指向任务堆栈栈顶的指针INT8UOSTCBStat;//任务的当前状态标志•其中OSTCBStat:任务状态字,可取下列值:•OS_STAT_RDY:处于就绪状态•OS_STAT_SEM:处于等待信号量状态•OS_STAT_MBOX:处于等待邮箱状态•OS_STAT_Q:处于等待消息队列状态•OS_STAT_SUSPEND:处于被挂起状态•OS_STAT_MUTEX:处于等待互斥信号量状态(看名字知道是什么状态就好了)11.为了加快对任务控制块的访问速度,除了任务控制块链表被创建为双向链表之外,uC/OS-II在uC/OS_II.H文件中还定义了一个数据类型为OS_TCB*的数组OS_TCBPrioTbl[]。该数组以任务的优先级别为顺序在各个元素里存放了指向各个任务控制块的指针12.uC/OS-II还专门定义了一个变量OSTCBCur来存放当前任务控制块指针。13.每个就绪的任务都放入就绪表中(readylist)中,就绪表用两个变量表示:OSRdyGrp、OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置为1。OSRdyGrp和OSRdyTbl[]之间的关系见下图,它们之间的关系是按照以下规则给出的:当OSRdyTbl[0]中的任何一位是1时,OSRdyGrp的第0位置1;当OSRdyTbl[1]中的任何一位是1时,OSRdyGrp的第1位置1;当OSRdyTbl[2]中的任何一位是1时,OSRdyGrp的第2位置1;……•那么如何根据任务的优先级别查找任务在就绪表的位置呢?从图中可以看出,由于优先级别是一个单字节的数字,而且最大值不会超过63,即二进制00111111,因此,可以把优先级别看成是一个6位的二进制数,这样就可以用高3位(Y、Y、Y)来指明变量OSRdyGrp的具体数据位,并用来确定就绪表数组元素的下标;用低3位(X、X、X)来指明该数组元素的具体数据位。•例3-5:已知某一个已经就绪的任务优先级别为prio=30,试判断应该在就绪表的哪一位置上置1。答:30的二进制形式为00011110,其低6位为011110,于是可知应该把变量OSRdyGrp的D3位置1,同时要在OSRdyTbl[3]的D6位上置1。•根据就绪表确定最高优先级两个关键:优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号。13.系统对于就绪表主要有三个操作:登记、注销和从就绪表的就绪任务中得知具有最高优先级任务的标识(优先级prio)。1.登记•登记:指的是当某个任务处于就绪状态时,系统将该任务登记在任务就绪表中,即在就续表中将该任务的对应位置1。•在程序中,可用类似于下面的代码把优先级为prio的任务置为就绪态:OSRdyGrp|=OSMapTbl[prio3];OSRdyTbl[prio3]|=OSMapTbl[prio&0x07];•其中,OSMapTbl[]是C/OS-II为加快运算速度定义的一个数组,各元素为:OSMapTbl[0]=00000001BOSMapTbl[1]=00000010BOSMapTbl[2]=00000100BOSMapTbl[3]=00001000BOSMapTbl[4]=00010000BOSMapTbl[5]=00100000BOSMapTbl[6]=01000000BOSMapTbl[7]=10000000B•例1:使优先级为12的任务进入就绪状态,12=1100b,OSRdyGrp|=OSMapTbl[prio3]|=OSMapTbl[1]|=00000010OSRdyTbl[prio3]|=OSMapTbl[prio&0x07]|=OSMapTbl[100b]|=OSMapTbl[4]|=00010000即OSRdyGrp的第1位置1,OSRdyTbl[1]的第4位置1•例2:使优先级为21的任务进入就绪态,21=10101b,OSRdyGrp|=OSMapTbl[prio3]|=OSMapTbl[10b]=OSMapTbl[2]|=00000100OSRdyTbl[prio3]|=OSMapTbl[prio&0x07]|=OSMapTbl[101b]|=OSMapTbl[5]|=00100000即OSRdyGrp的第2位置1,OSRdyTbl[2]的第5位置1•2.注销•注销:指的是当某个任务需要脱离就绪状态时,系统在就绪表中将该任务的对应位置0。•如果要使一个优先级别为prio的任务脱离就绪状态,则可使用如下代码:If((OSRdyTbl[prio3]&=OSMapTbl[prio&0x07])==0)OSRdyGrp&=OSMapTbl[prio3];脱离就绪态:将任务就绪表OSRdyTbl[prio3]相应元素的相应位清零,而且当OSRdyTbl[prio3]中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。•例:使优先级为12的任务脱离就绪表答:欲使优先级为12的任务进入就绪态优先级为12,即00001100BOSRdyGrp|=OSMapTbl[prio3];(OSMapTbl[1]=00000010)OSRdyTbl[1]|=OSMapTbl[prio&0x07];(OSMapTbl[4]=00010000)欲使优先级为12的任务脱离就绪态OSMapTbl[prio&0x07]=OSMapTbl[4]=11101111OSMapTbl[prio3]=OSMapTbl[1]=11111101如果OSRdyTbl[prio3]&=OSMapTbl[prio&0x07]=0(该行所有任务都是非就绪态)则OSRdyGrp=OSRdyGrp&OSMapTbl[prio3]=03.找出进入就绪态的优先级最高的任务从任务就绪表中获取优先级别最高的就绪任务可用如下代码:y=OSUnMapTbl[OSRdyGrp];//获得优先级别的D5、D4、D3位x=OSUnMapTbl[OSRdyTbl[Y]];//获得优先级别的D2、D1、D0位Prio=(y3)+x;//获得就绪任务的优先级别或y=OSUnMapTbl[OSRdyGrp];Prio=(INT8U)((y3)+OSUnMapTbl[OSRdyTbl[y]]);该代码执行后,得到的是最高优先级就绪任务的优先级别。其中,OSUnMapTbl[]同样是C/OS-II为加快运算速度定义的一个数组,共有256个元素,其定义如下:•INT8UconstOSUnMapTbl[]={•0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x00to0x0F•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x10to0x1F•5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x20to0x2F•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x30to0x3F•6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x40to0x4F•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x50to0x5F•5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x60to0x6F•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x70to0x7F•7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x80to0x8F•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0x90to0x9F•5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0xA0to0xAF•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0xB0to0xBF•6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0xC0to0xCF•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0xD0to0xDF•5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,//0xE0to0xEF•4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0//0xF0to0xFF•};例:已知OSRdyGrp=01101000b,OSRdyTbl[3]=11100100b,找出进入就绪态的优先级最高的任务OSRdyGrp=01101000b=0x68,查OSU
本文标题:嵌入式范围
链接地址:https://www.777doc.com/doc-4169211 .html