嵌入式程序设计复习题_第1页
嵌入式程序设计复习题_第2页
嵌入式程序设计复习题_第3页
嵌入式程序设计复习题_第4页
嵌入式程序设计复习题_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统程序设计练习题;1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式抢占式多任务实时内核。2.任务是一个执行体,包括:代码、控制块和任务堆栈。3.任务代码可是无返回的无穷循环,也可以是一次性代码,但最后一定要删除执行操作的一次性代码;4.因为uc/os-ii总是运行进入就绪状态中任务优先级最高,下面该哪个任务运行,这个工作就由调度器进行切换调度操作来完成的;5.任务级的调度是由函数OSSched()和函数OSIntExt()完成6.任务级的调度是由函数OSSched()完成的,而【中断级】的调度是由函数OSIntExt()完成。对于OSSched(),它内部调用的是OS_TASK_SW()完成实际的调度;OSIntExt()内部调用的是OSCtxSw()实现调度。7.任务切换其实很简单,由如下2步完成:〔1〕将被挂起任务的处理器存放器推入自己的任务堆栈。〔2〕然后将进入就绪状态的最高优先级的任务的存放器值从堆栈中恢复到存放器中。8.任务的5种状态。【睡眠态(taskdormat)】:任务驻留于程序空间〔rom或ram〕中,暂时没交给ucos-ii处理。【就绪态〔taskready〕】:任务一旦建立,这个任务就进入了就绪态。【运行态〔taskrunning〕】:调用OSStart〔〕可以启动多任务。OSStart〔〕函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。【等待状态〔taskwaiting〕】:正在运行的任务,通过延迟函数或pend〔挂起〕相关函数后,将进入等待状态。【中断状态〔ISRrunning〕】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。9.【不可剥夺型】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务调度法,各个任务彼此合作共享一个CPU。10.当系统响应时间很重要时,要使用【可剥夺型】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。11.使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。(可重入〔reentrant〕函数可以由多于一个任务并发使用,而不必担忧数据错误。相反,不可重入〔non-reentrant〕函数不能由超过一个任务所共享,除非能确保函数的互斥〔或者使用信号量,或者在代码的关键局部禁用中断〕。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丧失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。)12.【可重入型】函数可以被一个以上的任务调用,而不必担忧数据的破坏。13.可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丧失。可重入型函数或者只使用【局部变量】,即变量保存在CPU存放器中或堆栈中。如果使用全局变量,那么要对全局变量予以【保护】。14.每个任务都有其优先级。任务越重要,赋予的优先级应【越高】。15.μC/OS-Ⅱ初始化是通过调用系统函数【OSIint()】实现的,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。16.多任务的启动是用户通过调用【OSStart()】实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用【任务】。17μC/OS-Ⅱ的参数配置文件名为【OS_CFG.H】。18.删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被μC/OS-Ⅱ调用。19.μC/OS-Ⅱ要求用户提供【定时中断】来实现延时与超时控制等功能。20.定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。21.时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。22.μC/OS-II中的信号量由两局部组成:一个是信号量的【计数值】,它是一个16位的无符号整数〔0到65,535之间〕;另一个是由等待该信号量的任务组成的【等待任务表】。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成【1】,这样μC/OS-II才能支持信号量。23.μC/OS-II中表示当前已经创立的任务数全局变量名为:【OSTaskCtr】。24.μC/OS-II中表示当前内核运行的标记全局变量名为:【OSRunning】。25.在使用OSTaskCreate创立任务时,假设需要TaskData作伪参数传递给任务Task,并从任务Task中获得传入的字符参数值,请在下面【】填上适宜的代码。charTaskData=?A?;OSTaskCreate(Task,【(void*)&TaskData】,&TaskStk[0][TASK_STK_SIZE-1],1);voidTask(void*pdata){charvalue=【*(char*)pdata】;for(;;){OSSemPend(RandomSem,0,&err);y=(int)(*(char*)pdata-'A');OSSemPost(RandomSem);PC_DispChar(10,25,value,DISP_FGND_WHITE+DISP_BGND_BLUE);OSTimeDly(1);}}26.在μC/OS-II在任务Task1中使用邮箱函数OSMboxPost〔〕发送字符;而在Task2中接收OSMboxPost〔〕字符,请在下面【】填上适宜的代码。voidTask1(void*data){chartxmsg;INT8Uerr;…txmsg='A';for(;;){OSMboxPost(TxMbox,【(void*)&txmsg】);/*SendmessagetoTask2*/OSMboxPend(AckMbox,0,&err);txmsg++;if(txmsg=='Z'){txmsg='A';}}}voidTask5(void*data){char*rxmsg;INT8Uerr;data=data;for(;;){rxmsg=【(char*)】OSMboxPend(TxMbox,0,&err);PC_DispChar(70,18,*rxmsg,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSMboxPost(AckMbox,(void*)1);}}27.在Task1中使用消息队列OSQPend〔〕函数接收消息“HelloWorld!〞,而在Task2中使用消息队列OSQPost〔〕函数发送消息“HelloWorld!〞,请在下面【】填上适宜的代码.voidTask1(void*pdata){char*msg;INT8Uerr;pdata=pdata;for(;;){msg=【(char*)】OSQPend(MsgQueue,0,&err);PC_DispStr(70,13,msg,DISP_FGND_YELLOW+DISP_BGND_BLUE);OSTimeDlyHMSM(0,0,0,100);}}voidTask2(void*pdata){charmsg[20];pdata=pdata;strcpy(&msg[0],"HelloWorld!");for(;;){OSQPost(MsgQueue,【(void*)】&msg[0]);OSTimeDlyHMSM(0,0,0,500);}}28μC/OS-II操作系统使用OSSchedLock()函数和OSSchedUnlock()函数进行锁定〔不允许任务级调度〕和解锁〔重新允许任务级调度〕调度器,在用户应用程序中,OSSchedLock()和OSSchedUnlock()是【成对出现的】,否那么系统有可能出错。29.代码的临界段代码的临界段也称为临界区,指处理时不可分割的代码。30.资源任何为任务所占用的实体都可称为资源。资源可以是输入输出设备;资源也可以是一个变量,一个结构或一个数组等。31.共享资源可以被一个以上任务使用的资源叫做共享资源。32.任务一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属该程序自己。典型地、每个任务都是一个无限的循环。33.任务切换指ContextSwitch,其含义是CPU存放器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态〔Context〕,即CPU存放器中的全部内容。34.内核多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的根本效劳是任务切换。35.调度〔Scheduler〕内核的主要职责之一,就是要决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。36.可剥夺型内核最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断效劳子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。37.任务根本信息内涵(1)CPU中的PC存放器:任务〔程序〕当前执行的位置;(2)CPU中的通用存放器:任务当前执行代码所涉及的临时数据;(3)CPU中的状态存放器:存储当前CPU的状态。38.任务切换任务切换是指从一个任务直接切换到另一个任务,引起该次切换是由于某一个非中断引起的事件或主动放弃或调用节拍函数时,使一个更高优先级的任务处于就绪状态,暂停正在运行着的任务,转而切换去执行更高优先级任务;也可由中断后,中断退出时进行任务调度,重新去执行更高优先级任务。39.举例说明μCOS-II可移植型数据类型的定义方式答:因为不同的微处理器有不同的字长,μC/OS-II的移植文件包括很多类型定义以确保可移植性。μCOS-II不使用C语言中的short,int,long等数据类型的定义,因为它们与处理器类型有关,隐含着不可移植性。μC/OS-II代之以移植性强的整数数据类型,这样,既直观又可移植(该数据类型不依赖于编译),举例如下:typedefunsignedcharBOOLEAN;typedefunsignedcharINT8U;typedefsignedcharINT8S;typedefunsignedintINT16U;typedefsignedintINT16S;typedefunsignedlongINT32U;typedefsignedlongINT32S;40.μCOS-II如何定义全局变量?答:众所周知,全局变量应该是得到内存分配且可以被其他模块通过C语言中extern关键字调用的变量。因此,必须在.C和.H文件中定义。这种重复的定义很容易导致错误。μCOS-II采用的方法只需用在头文件中定义一次。uC/OS_II.H头文件中包括以下定义全局宏定义:#ifdefOS_GLOBALS#defineOS_EXT#else#defineOS_EXTextern#endifOS_EXTINT32UOSIdleCtr;同时,uCOS_II.H有中以下定义:#defineOS_GLOBALS#include“includes.h〞当编译器处理uCOS_II.C时,它使得头文件变成如下所示,因为OS_EXT被设置为空。INT32UOSIdleCtr;这样编译器就会将这些全局变量分配在内存中。当编译器处理其他.C文件时,头文件变成了如下的样子,因为OS_GLOBAL没有定义,所以OS_EXT被定义为extern。externINT32UOSIdleCtr;在这种情况下,不产生内存分配,而任何.C文件都可以使用这些变量。这样的就只需在.H文件中定义一次就可以了。41.OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的含义及作用?答:OS_ENTER_CRITICAL():关中断;OS_EXIT_CRITICAL():开中断。关中断和开中断是为了保护临界段代码。用户的应用代码可以使用这两个宏来开中断和关中断。很明显,关中断会影响中断延迟,所以要特别小心。用户还可以用信号量来保护临界段代码。42.基于PC的效劳中如何测量PC_DisplayChar()的执行时间?答:测量PC_DisplayChar()的执行时间的代码如下:INT16Utime;//定义时间变量PC_ElapsedInit();//时钟初始化PC_ElapsedStart();//开始计时PC_DispChar(40,24,?A?,DISP_FGND_WHITE);//执行代码time=PC_ElapsedStop();//结束计时43.uC/OS-II的任务框架答:voidtask_xxx(void*pData){/*该任务的初始化工作*/??/*进入该任务的死循环*/while(1){??}}每个用户的任务都必须符合事件驱动的编程模型,即uC/OS-II的应用程序都必须是“事件驱动的编程模型〞。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片。当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型〞。事件驱动模型也涵盖了中断驱动模型,uC/OS-II事件归根结底来自三个方面:(1)中断效劳函数发送的事件(2)系统延时时间到所引起的(3)其它任务发送的事件。44.与共享资源打交道时,使之满足互斥条件最一般的方法包括哪些?答:包括:关中断、使用测试并置位指令、禁止做任务切换、利用信号量等。45.描述利用μC/OS_Ⅱ宏调用关中断和开中断处理共享数据的示意性代码程答:OS_ENTER_CRITICAL();/*在这里处理共享数据*/OS_EXIT_CRITICAL();46.信号量的典型应用包括哪些?答:信号量(Semaphores)是一种约定机制,在多任务内核中的典型应用包括:〔1〕控制共享资源的使用权(满足互斥条件);〔2〕标志某事件的发生〔3〕使两个任务的行为同步47.对信号量只能实施哪三种操作?答:一般地说,对信号量只能实施三种操作:〔1〕初始化(INITIALIZE),也可称作建立(CREATE);〔2〕等信号(WAIT)也可称作挂起(PEND);〔3〕给信号(SIGNAL)或发信号(POST)。48.给出μC/OS-Ⅱ中如何用信号量处理共享数据的示意代码?答:通过获得信号量处理共享数据的示意代码如下:OS_EVENT*SharedDataSem;voidFunction(void){INT8Uerr;OSSemPend(SharedDataSem,0,&err);/*共享数据的处理在此进行,(中断是开着的)*/OSSemPost(SharedDataSem);}49.给出初始化和启动μC/OS-Ⅱ的示意代码。答:voidmain(void){OSInit();/*初始化uC/OS-II*/.通过调用OSTaskCreate()或OSTaskCreateExt()创立至少一个任务;.OSStart();/*开始多任务调度!OSStart()永远不会返回*/}50.描述建立任务OSTaskCreate()的函数原型。建立任务OSTaskCreate()的函数原型为:INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)其中,task:任务代码的指针;pdata:当任务开始执行时传递给任务的参数的指针;ptos:分配给任务的堆栈的栈顶指针;prio:分配给任务的优先级。51.任务可以是一个无限的循环,也可以是在一次执行完毕后被删除掉。请给出示意代码结构。答:μC/OS-Ⅱ描述的任务示意代码必须是以下两种结构之一:voidYourTask(void*pdata){for(;;){/*用户代码*/调用μC/OS-Ⅱ的效劳例程之一:OSMboxPend();OSQPend();OSSemPend();OSTaskDel(OS_PRIO_SELF);OSTaskSuspend(OS_PRIO_SELF);OSTimeDly();OSTimeDlyHMSM();/*用户代码*/}}或voidYourTask(void*pdata){/*用户代码*/OSTaskDel(OS_PRIO_SELF);}52.μC/OS-Ⅱ任务管理提供哪些效劳?答:μC/OS-Ⅱ任务管理提供的效劳包括:〔1〕建立任务:OSTaskCreate()或OSTaskCreateExt();〔2〕删除任务:OSTaskDel();〔3〕请求删除任务:OSTaskDelReq();〔4〕改变任务的优先级:OSTaskChangePrio();〔5〕挂起任务:OSTaskSuspend();〔6〕恢复任务:OSTaskResume();〔7〕获得有关任务的信息:OSTaskQuery()。53.μC/OS-Ⅱ时间任务管理提供哪些效劳?答:μC/OS-Ⅱ时间任务管理提供的效劳包括:〔1〕任务延时函数:OSTimeDly()〔2〕按时分秒延时函数:OSTimeDlyHMSM()〔3〕让处在延时期的任务结束延时:OSTimeDlyResume()〔4〕设置系统时间:OSTimeGet()〔5〕获得系统时间:OSTimeSet()54.μC/OS-Ⅱ提供的数据共享和任务通讯的方法包括哪些?答:μC/OS-Ⅱ提供的数据共享和任务通讯的方法包括五种方法:(1)利用宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来关闭中断和翻开中断。(2)利用函数OSSchedLock()和OSSchekUnlock()对μC/OS-II中的任务调度函数上锁和开锁。(3)信号量。(4)邮箱。(5)消息队列。55.对于事件控制块进行的一些通用包括哪些操作?答:对于事件控制块进行的一些通用操作包括:〔1〕初始化一个事件控制块:OSEventWaitListInit();〔2〕使一个任务进入就绪态:OSEventTaskRdy();〔3〕使一个任务进入等待该事件的状态:OSEventTaskWait();〔4〕因为等待超时而使一个任务进入就绪态:OSEventTO()。56.μC/OS-Ⅱ信号量提供哪些效劳?答:μC/OS-Ⅱ信号量提供的效劳包括:〔1〕建立一个信号量:OSSemCreate();〔2〕等待一个信号量:OSSemPend();〔3〕发送一个信号量:OSSemPost();〔4〕无等待地请求一个信号量:OSSemAccept();〔5〕查询一个信号量的当前状态:OSSemQuery()。57.μC/OS-Ⅱ邮箱提供哪些效劳?答:μC/OS-Ⅱ邮箱提供的效劳包括:〔1〕建立一个邮箱:OSMboxCreate();〔2〕等待一个邮箱中的消息:OSMboxPend();〔3〕发送一个消息到邮箱中:OSMboxPost();〔4〕无等待地从邮箱中得到一个消息:OSMboxAccept();〔5〕查询一个邮箱的状态:OSMboxQuery()58.μC/OS-Ⅱ消息队列提供哪些效劳?答:μC/OS-Ⅱ消息队列提供的效劳包括:;〔1〕建立一个消息队列:OSQCreate();;〔2〕等待一个消息队列中的消息:OSQPend(;〔3〕向消息队列发送一个消息〔FIFO〕:OSQ;〔4〕向消息队列发送一个消息〔LIFO〕:OSQ;〔5〕无等待地从一个消息队列中取得消息:OSQA;〔6〕清空一个消息队列:OSQFlush();;〔7〕查询一个消息答:μC/OS-Ⅱ消息队列提供的效劳包括:〔1〕建立一个消息队列:OSQCreate();〔2〕等待一个消息队列中的消息:OSQPend();〔3〕向消息队列发送一个消息〔FIFO〕:OSQPost();〔4〕向消息队列发送一个消息〔LIFO〕:OSQPostFront();〔5〕无等待地从一个消息队列中取得消息:OSQAccept();〔6〕清空一个消息队列:OSQFlush();〔7〕查询一个消息队列的状态:OSQQuery()。59.μC/OS-Ⅱ内存管理提供哪些效劳?答:μC/OS-Ⅱ内存管理提供的效劳包括:〔1〕建立一个内存分区:OSMemCreate();〔2〕分配一个内存块:OSMemGet();〔3〕释放一个内存块:OSMemPut();〔4〕查询一个内存分区的状态:OSMemQuery()。60.移植μC/OS-Ⅱ时,要使μC/OS-Ⅱ正常运行,处理器必须满足哪些根本要求?答:要使μC/OS-Ⅱ正常运行,处理器必须满足以下要求:(1)处理器的C编译器能产生可重入代码。(2)用C语言就可以翻开和关闭中断。(3)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。(4)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。(5)处理器有将堆栈指针和其它CPU存放器读出和存储到堆栈或内存中的指令。61.举例描述μC/OS-II基于任务的应用程序设计方法答:#include<includes.h>#defineTASK_STK_SIZE128OS_STKAppStk_one[TASK_STK_SIZE];//任务one的堆栈OS_STKAppStk_two[TASK_STK_SIZE];//任务two的堆栈OS_STKAppStk_three[TASK_STK_SIZE];//任务three的堆栈staticvoidApp_one(void*p_arg);//任务one代码staticvoidApp_two(void*p_arg);//任务two代码staticvoidApp_three(void*p_arg);//任务three代码voidmain(intargc,char*argv[]){OSInit();//初始化系统//依次创立三个任务OSTaskCreate(App_one,NULL,(OS_STK*)&AppStk_one[TASK_STK_SIZE-1],(INT8U)10);OSTaskCreate(App_two,NULL,(OS_STK*)&AppStk_two[TASK_STK_SIZE-1],(INT8U)20);OSTaskCreate(App_three,NULL,(OS_STK*)&AppStk_three[TASK_STK_SIZE-1],(INT8U)30);OSStart();启动多任务,将CPU控制权交给系统}62.μC/OS-II调度算法原理及其和调度方式答:〔1〕优先级调度算法原理为:给每一个任务分配一个惟一优先级,各优先级用一个整形数值标识,某优先级的值越大,其优先级越低;某优先级的值越小,其优先级越高。也就是说,如果当前操作系统准备进行调度,当有两个任务处于就绪状态,系统将优先执行优先级别高的任务。(2)μC/OS-II操作系统有两种调度方式:任务级任务调度和中断级任务调度,μC/OS-II操作系统在完成中断后允许进行新的调度。63.描述μC/OS-II操作系统的任务级任务调度OS_Sched()的主要功能答:〔1〕查找当前就绪表中最高优先级任务的优先级值;〔2〕调用OS_SchedNew()函数进行任务切换,切换到新任务执行。64.从消息邮箱中读取消息的方式及其函数原型?答:(1)从消息邮箱中读取消息的方式包括:非阻塞式读取和阻塞式读取两种方式。(2)非阻塞式读取是指无论消息邮箱中是否有数据,读取操作也不阻塞,直接返回,显然,如果有数据,将读取出来,如果没有数据,将读取为NULL。其函数原型为:void*OSMboxAccept(OS_EVENT*pevent)(3)阻塞式读取是指在消息邮箱中有数据时,直接读取出来;如果没有数据,那么使当前任务进入等待状态,系统执行调度程序执行新的任务,当下一次消息到来时将激活等待表中的最高优先级任务,从而使该任务进入就绪状态。为了防止任务一直处于等待状态〔所等待的资源一直未分配〕,可以设置一个等待的时间范围,当超过该延迟时,那么直接返回。其函数原型为:void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)65.论述μC/OS-Ⅱ控制下的任务状态转换图答:μC/OS-Ⅱ控制下的任务状态转换图如下列图所示。在任一给定的时刻,任务的状态一定是在这五种状态之一。(1)睡眠态〔DORMANT〕:指任务驻留在程序空间之中,还没有交给μC/OS-Ⅱ管理。一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。(2)就绪态(READY):当任务一旦建立,这个任务就进入就绪态准备运行。把任务交给μC/OS-Ⅱ是通过调用下述两个函数之一:OSTaskCreate()或OSTaskCreateExt()。(3)运行态(RUN):调用OSStart()可以启动多任务。OSStart()函数运行进入就绪态的优先级最高的任务。(4)等待状态(WAITING):正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是OSTimeDly()或OSTimeDlyHMSM()。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了CPU的控制权。正在运行的任务期待某一事件的发生时也要等待,手段是调用以下3个函数之一:OSSemPend(),OSMboxPend(),或OSQPend()。调用后任务进入了等待状态〔WAITING〕。(5)中断状态(ISR):正在运行的任务是可以被中断的,除非该任务将中断关了,或者μC/OS-Ⅱ将中断关了。被中断了的任务就进入了中断效劳态〔ISR〕。66.论述μC/OS-Ⅱ的核心数据结构任务控制块(OS_TCBs)答:任务控制块(OS_TCBs)是μC/OS-Ⅱ的核心数据结构,当任务的CPU使用权被剥夺时,μC/OS-Ⅱ用它来保存该任务的状态。当任务重新得到CPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。OS_TCBs全部驻留在RAM中。一旦任务建立了,任务控制块OS_TCBs将被赋值。μC/OS-II任务控制块数据结构定义如下:typedefstructos_tcb{OS_STK*OSTCBStkPtr;#ifOS_TASK_CREATE_EXT_ENvoid*OSTCBExtPtr;OS_STK*OSTCBStkBottom;INT32UOSTCBStkSize;INT16UOSTCBOpt;INT16UOSTCBId;#endifstructos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEventPtr;#endif#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;#endifINT16UOSTCBDly;INT8UOSTCBStat;INT8UOSTCBPrio;INT8UOSTCBX;INT8UOSTCBY;INT8UOSTCBBitX;INT8UOSTCBBitY;#ifOS_TASK_DEL_ENBOOLEANOSTCBDelReq;#endif}OS_TCB;其中:OSTCBStkPtr是指向当前任务栈顶的指针。OSTCBExtPtr指向用户定义的任务控制块扩展。OSTCBStkBottom是指向任务栈底的指针。OSTCBStkSize存有栈中可容纳的指针元数目而不是用字节〔Byte〕表示的栈容量总数。OSTCBId用于存储任务的识别码。OSTCBNext和OSTCBPrev用于任务控制块OS_TCBs的双重链接。OSTCBEventPtr是指向事件控制块的指针。OSTCBMsg是指向传给任务的消息的指针。OSTCBStat是任务的状态字。OSTCBPrio是任务优先级。OSTCBDelReq是一个布尔量,用于表示该任务是否需要删除。OSTCBX,OSTCBY,OSTCBBitX和OSTCBBitY用于加速任务进入就绪态的过程或进入等待事件发生状态的过程。3.论述事件控制块ECB数据结构答:μC/OS-II通过uCOS_II.H中定义的OS_EVENT数据结构来维护一个事件控制块的所有信息。该事件控制块ECB数据结构的定义如下:typedefstruct{void*OSEventPtr;/*指向消息或者消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(当事件是信号量时)*/INT8UOSEventType;/*时间类型*/INT8UOSEventGrp;/*等待任务所在的组*/}OS_EVENT;其中:OSEventPtr指针:只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构.OSEventTbl[]和OSEventGrp:两者包含的是系统中处于就绪状态的任务。OSEventCnt:当事件是一个信号量时,用于信号量的计数器。OSEventType:定义了事件的具体类型。67.论述μC/OS-II内存的管理的内存控制块数据结构答:为了便于内存的管理,在μC/OS-II中使用;内存控制块的数据结构定义如下:;typedefstruct{;void*OSMemAddr;;void*OSMemFreeList;;INT32UOSMemBlkSize;;INT32UOSMemNBlks;;INT32UOSMemNFree;;}OS_MEM;;其中:;OSMemAddr是指向内存分区起始地答:为了便于内存的管理,在μC/OS-II中使用内存控制块〔memorycontrolblocks〕的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。内存控制块的数据结构定义如下:typedefstruct{void*OSMemAddr;void*OSMemFreeList;INT32UOSMemBlkSize;INT32UOSMemNBlks;INT32UOSMemNFree;}OS_MEM;其中:OSMemAddr是指向内存分区起始地址的指针。OSMemFreeList是指向下一个空闲内存控制块或者下一个空闲的内存块的指针。OSMemBlkSize是内存分区中内存块的大小,是用户建立该内存分区时指定的。OSMemNBlks是内存分区中总的内存块数量,也是用户建立该内存分区时指定的。OSMemNFree是内存分区中当前可以得空闲内存块数量。68、启动µC/OS-II任务的函数是_OSStart()_。69、OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)功能是_创立任务__。70、µC/OS-II用来记录任务的堆栈指针、任务的当前状态、任务的优先级别的数据结构称为任务控制块〔OS_TCB〕。71、µC/OS-II有两种调度器,一种是任务级的调度器;另一种是中断级的调度器。72、voidOSTimeDly(INT16Uticks)中参数ticks是指_定时计数器确定的时间段,又称节拍_。73、OSTimeDly〔〕或OSTimeDlyHMSM()的作用是___延时操作__。74、如果OSEventGrp的值是01101000〔二进制〕,而对应的OSUnMapTbl[OSEventGrp]值为3,如果.OSEventTbl[3]的值是11100100〔二进制〕,OSUnMapTbl[OSEventTbl[3]]的值为2,那么处于等待状态的任务的最高优先级是3×8+2=26。75、能防止出现优先级反转现象的信号叫做互斥型信号量。76、消息邮箱是能在任务之间传递消息的指针的数据结构。77、µC/OS-II的任务状态有5个状态;分别是:1〕睡眠状态;2〕就绪状态;3〕运行状态;4〕等待状态;5〕中断效劳状态。78、从任务的存储结构来看,µC/OS-II的任务由三个组成局部构成,其三局部为:1〕任务程序代码;2〕任务堆栈;3〕任务控制块。79、µC/OS-II任务优先级最多可建立64级,其中设定0级为最高级。80、操作消息队列时向指针数组中插入消息指针有2种方式,它们是:先进先出(FIFO)方式和后进先出(LIFO)方式。81、µC/OS-II任务的代码结构是〔C〕。对象结构;B〕数据结构;C〕一个带有临界段的无限循环;D〕表结构。82、µC/OS-II的任务控制块是采用〔B〕结构。A〕一条链表;B〕两条链表;C〕三条链表;D〕四条链表;83、µC/OS-II中指向当前正在运行的任务指针为(B)。A〕OSTCBListB)OSTCBCurC)OSTCBFreeListD)OSEVENTList84、µC/OS-II中空任务控制链表的创立是由(B)函数实现的。A〕OSTCBInit()B)OSInit()C)OSTaskCreate()D)OSStart()85、解决任务优先级反转现象的方法是建立〔D〕A〕消息邮箱B〕信号量C〕消息队列D〕互斥型信号量86、变量OSRdyGrp有作用是(C)?记录就绪任务的分组信息B〕记录就绪任务优先级C)记录就绪表分组后组内有否就绪信息C〕记录就绪任务是否就绪87、请求信号量函数是〔D〕。A〕OSFlagPend()B)OSMboxPend()C)OSQPend()D)OSSemPend()88、µC/OS-II中OSTCBDly变量是按〔C〕计算进行的。A〕秒B〕毫秒C〕节拍D〕微秒89、什么是代码的临界区?答:代码的监界区是指处理时不可分割的代码,运行这些代码不允许被打断。一旦这局部代码开始执行,那么不允许任何中断打入。中断不调用任何临界区的代码或不访问任何临界区使用的共享资源时,这个中断是可能可以执行。为确保临界区代码的执行,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。90、什么是嵌入式操作系统?为何要使用嵌入式操作系统?答:运用在嵌入式系统上的实时操作系统,具有事件驱动和任务〔进程〕调度功能,且在有限时隙内能完成事件的响应和任务〔进程〕的切换,能可靠、实时、灵活地管理嵌入式系统上的各种资源和任务。使用嵌入式操作系统,能方便实时应用软件的开发和有机地整合,能有效地管理和协调各项工作,因此是开发和运行非常重要的环境。91、请写出从任务就绪表中获取优先级别最高的就绪任务优先级prio的代码段:答:y=OSUnMapTal[OSRdyGrp];x=OSUnMapTal[OSRdyTbl[y]];prio=(y<<3)+x;或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);92、初始化函数OSInit()对数据结构进行初始化时,请举出4个主要是创立内容?答:主要创立的内容是(1)空的内任务控制块链表〔OSTCBFreeList〕;(2)空的事件控制块链表〔OSEventFreeList〕;(3)空的消息队列控制块链表(OSQFreeList);(4)空的标志控制块链表(OSFlagFreeList);(5)存储控制块链表(OSMemFreeList);93、简述µC/OS-II的中断过程?答:系统接收到中断请求后,如果这时CPU处于中断允许状态〔即中断是开放的〕,系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断效劳子程序;当中断效劳子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行,或者转向运行另一个具有更高优先级别的就绪任务。94、为什么µC/OS-II的中断效劳子程序中不能请求信号量?答:这是由于OSSemPend〔〕的执行同时要执行OSEventTaskWait(),而中断效劳子程序并非任务代码,也就是非任务请求,显然请求的实体不合理,导致程序执行错误。95、任务级切换和中断级任务切换为什么没有使用同一切换函数?答:中断切换时要保护的操作已在中断效劳子程序中完成,因此OSIntCtxSw()中不包含保护代码,即无需压栈操作,而任务级切换OSCtxSw()就多一些保护代码段。96、描述µC/OS-II中的信号量结构组成?µC/OS-II中的信号量由两局部组成:一个是信号量的计数值,它是一个16位的无符号整数〔0到65,535之间〕;另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II才能支持信号量。97、互斥型信号量是如何防止优先级反转现象出现的?答:互斥型信号量是一个二值信号量,其事件控制块中,成员OSEventCnt被分成了低8位和高8位两局部,低8位用来存放信号值〔该值为0xFF时,信号为有效,否那么信号为无效〕,高8位用来存放防止出现优先级反转现象而提升的优先级别prio。当任务占有一个独占式共享资源时,事件控制块的成员OSEventCnt低8位就不再是0xFF,如果任务的优先级不是最高的,此时,就要将成员OSEventCnt高8位作为本任务的prio,以使任务的优先级此时最高,防止优先级反转现象出现。98、什么叫消息邮箱?答:在多任务间需要在任务与任务之间传递一个数据的方式,该数据是在存储空间开出一个缓冲区的内容,建立缓冲区指针,并能传递指针的数据结构称为消息邮箱。99、请描述标志组中的OSFlagFlags和等待任务链表OSFlagNodeFlags作用?答:OSFlagFlags提供信号量集的所有信号状态,每一个信号占据一个二进制位。当所占位为1时,表示此信号量集中该信号量有效,否那么该信号量无效。从而区分信号量集中信号量的分布特点。而等待任务链表OSFlagNodeFlags是任务请求信号集的过滤器,通过该变量,把任务需要的信号量筛选出来,而其余信号屏蔽掉。100、请解释OS_CRITICAL_METHOD=1或2或3的含义?答:OS_CRITICAL_METHOD=1时直接使用处理器的开中断和关中断指令来实现宏;OS_CRITICAL_METHOD=2时带有保存中断允许标志,且直接使用处理器的开中断和关中断指令来实现;OS_CRITICAL_METHOD=3时,使用用C编译器具有扩展功能。关中断的同时将程序状态字保存在全局变量sr中而不必压到堆栈里。101、任务级切换和中断级任务切换为什么没有使用同一切换函数?答:中断切换时要保护的操作已在中断效劳子程序中完成,因此OSIntCtxSw()中不包含保护代码,即无需压栈操作,而任务级切换OSCtxSw()就多一些保护代码段。102、什么是可剥夺型内核?答:CPU总是运行多个任务中优先级别最高的那个任务,即使CPU正在运行某个低优先级别的任务,当有高优先级别的任务准备就绪时,该高级别的任务就会剥夺正在运行任务的CPU使用权,而使自已获得CPU的使用权。这种操作规那么的CPU内核称为可剥夺型内核。103、什么叫可重入函数?答:在多任务操作系统中,系统提供的函数应该能允许同时被多个任务所调用,而不会通过函数中变量的耦合引起任务之间的相互干扰。这样的函数叫做可重入函数。104、请简明分析OSSched〔〕代码每条番号语句的的含义;voidOSSched(void){INT8Uy;OS_ENTER_CRITICAL();(1)if((OSLockNesting|OSIntNesting)==0){(2)y=OSUnMapTbl[OSRdyGrp];(3)OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);(4)if(OSPrioHighRdy!=OSPrioCur){(5)OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];(6)OSCtxSwCtr++;(7)OS_TASK_SW();(8)}}OS_EXIT_CRITICAL();(9)}答:104、请写出µC/OS-II系统启动运行时的示意结构代码(包括主函数及任务函数)答:#include“includes.h〞#defineMy_TASK_STK_SIZE512voidmain(void){OSInit();………OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],6);OSStart();}voidMyTask(void*pdata){OSStatInit();TaskStartCreateTasks();For(;;){}}105、设计一个有两个任务的应用程序,其中一个任务用来进行两个数的加法运算,另一个任务那么用来显示结果。〔采用消息邮箱实现〕〔其显示函数为PC_DispStr(40,0,ss,DIS_BGND_BLACK+DISP_FGND_WHITE)〕答:#include“includes.h〞#defineMy_TASK_STK_SIZE512OS_EVENT*Str_BoxINT8UA=10;INT8UB=20;INT8Uerr;Char*ss;voidMyTask(void*data);voidDispTask(void*data);voidmain(void){OSInit();………Str_Box=OSMboxCreate((void*)0);OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],0);OSStart();}voidMyTask(void*pdata){INT8UC;OSStatInit();OSTaskCreate(DispTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],1);For(;;){C=A+B;Sprintf(s,“%d〞,C);OSMboxPost(Str_Box,s);OSTimeDlyHMSM(0,0,1,0);}}}voidDispTask(void*data){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;;){ss=OSMboxPend(Str_Box,10,&err);PC_DispStr(15,0,ss,DIS_BGND_BLACK+DISP_FGND_WHITE);OSTimeDlyHMSM(0,0,1,0);}}106、设计当有按键操作时,实现一次A/D转换和显示的应用程序,即按一次键,仅实现一次A/D转换,每一次A/D转换任务要求采样200次,采样间隔10ms的共200个数据,并显示出来。〔程序中要求包含采用消息邮箱和信号量以及时间中断进行设计〕〔其显示函数为PC_DispStr(40,0,ss,DIS_BGND_BLACK+DISP_FGND_WHITE)〕解:#include“config.h〞#defineKEY(1<<20)#defineTaskStk100OS_STKTaskKeyStk[TaskStk];OS_STKTaskSamStk[TaskStk];VoidTaskKey(void*pdata);VoidTaskSamp(void*pdata);OS_EVENT*Sem;INT16USamp[200];Intmain(void){OSInit();OSTaskCreate(TaskKey,(void*)0,&TaskKeyStk[TaskStk-1],4);OSStark();Return0;}VoidTaskKey(void*pdata){pdata=pdata;TargetInit();PINSEL1=0x00400000;ADCR=(1<<0|((Fpclk/1000000-1)<<8)|(0<<16)|(0<<17)|(1<<21)|(0<<22)|(1<<24)|(0<<27);T1IR=0xffffffff;T1TC=0x00;T1PR=0x00;T1TCR=0x01;T1MCR=0x03;T1MR0=Fpclk/100;Sem=OSSemCreate(0);While(1){OSTimeDly(2);If((IO0PIN&KEY)!=0)continue;Else{While((IO0PIN&KEY)==0){IO0SET=KEY;OSTimeDLy(1);}OSTaskCreate(TaskSamp,(void*)0,&TaskSampStk[TaskStk-1],2);}}}VoidTaskSamp(void*pdata){INT8Ui,err;INT32UTemp;pdata=pdata;VICIntEnable=1<<5;For(i=0;i<200;i++){OSSemPend(Sem,0,&err);Temp=ADDR;ADCR=(ADCR&0xffffff00|0x01|(1<<24);While((ADDR&0x80000000)==0);ADCR=ADCR|(1<<24);While((ADDR&0x80000000)==0);Temp=ADDR;Temp=3000*(Temp&0x0000ffff);Samp[i]=(INT16U)(Temp>>16);}VICIntEnClr=1<<5;PC_DispStr(40,0,Samp,DIS_BGND_BLACK+DISP_FGND_WHITE);OSTaskDel(OS_PRIO_SELF);}VoidTimer1_Exception(void){OS_ENTER_CRITICAL();T1IR=0x01;VICVectAddr=0;OS_EXIT_CRITICAL();OSSemPost(Sem);}108、µC/OS-II任务的代码结构是_一个带临界段的无限循环_或无循环但执行一次要删除任务__。109、空闲任务的作用_使CPU在没有任务可执行时有事可做__。110、µC/OS-II的任务调度器的主要工作有两项,一是在任务就绪表中查找具有最高优先级别的就绪任务;二是实现任务的切换。111、实现临界段的宏由关中断宏OS_ENTER_CRITICAL()和开中断宏OS_EXIT_CRITICAL()。112、OSTimeTick()完成两个功能,它们是计数器OSTime加1和遍历任务控制块链表中的所有任务控制块,把任务控制块中用来存放任务延时时限的OSTCBDly变量减1,并使该项为0,同时又不使被挂起的任务进入就绪状态。113、通过事件发送事件操作获取消息叫请求事件。114、信号量集由标志组和等待任务链表局部组成。115、µC/OS-II的任务控制块用来保存任务属性;任务堆栈用来保存任务工作环境;任务程序代码是任务执行局部。116、µC/OS-II最多可支持64个任务,其中用户任务最多有56个,系统任务可有4个。117、µC/OS-II用两条链表来管理任务控制块,一条是空任务块链表;别一条是任务块链表。118、指向空任务控制链表的头指针为〔A〕。A〕OSTCBFreeListB)OSTCBCurC)OSEVENTFreeListD)OSEVENTList119、µC/OS-II中指向当前正在运行的任务指针为(B)。A〕OSTCBListB)OSTCBCurC)OSTCBFreeListD)OSEVENTList120、µC/OS-II中任务控制块的初始化是由(A)函数实现的。A〕OSTCBInit()B)OSInit()C)OSTaskCreate()D)OSStart()121、µC/OS-II中记录中断嵌套的层数的全局变量是:〔A〕A〕OSIntNestingB)OSLockNestingC)OSRunningD)OSIntEnter122、变量OSRdyGrp有作用是(C)?记录就绪任务的分组信息B〕记录就绪任务优先级C)记录就绪表分组后组内有否就绪信息C〕记录就绪任务是否就绪123、请求消息邮箱函数是〔B〕。A〕OSFlagPend()B)OSMboxPend()C)OSQPend()D)OSSemPend()124、发送消息队列函数是〔C〕。A〕OSFlagPost()B)OSMboxPost()C)OSQPost()D)OSSemPost()125、解决任务优先级反转现象的方法是建立〔D〕A〕消息邮箱B〕信号量C〕消息队列D〕互斥型信号量126、什么是嵌入式系统?答:嵌入式系统是以应用为中心,以计算机技术为根底,软件硬件可裁剪,适应应用系统对功能、可靠性、本钱、体积及功耗严格要求的专用计算机系统,具有完成复杂功能的硬件和软件且紧密耦合在一起的计算机系统。127、请写出优先级别为Prio的任务置为就绪状态示意代码:答:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];128、请写出使一个优先级别为Prio的任务脱离就绪状态的示意代码:答:if((OSRdyTbl[prio>>3]&=-OSMapTbl[prio&0x07])==0)OSRdyGrp&=-OSMapTbl[prio>>3];129、请写出从任务就绪表中获取优先级别最高的就绪任务优先级prio的代码段:答:y=OSUnMapTal[OSRdyGrp];x=OSUnMapTal[OSRdyTbl[y]];prio=(y<<3)+x;或y=OSUnMapTbl[OSRdyGrp];prio=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]]);130、简要论述任务切换操作是在什么条件下才会发生?答:分两大类,一类主动实现任务切换,包括:主动挂起和恢复调用;主动延迟调用;请求事件调用且事件未满足时和释放事件时;另一类是被动任务切换,包括:各种随机中断响应后在退出中断时。131、初始化函数OSInit()对数据结构进行初始化时,请举出4个主要是创立内容?答:主要创立的内容是(1)空的内任务控制块链表〔OSTCBFreeList〕;(2)空的事件控制块链表〔OSEventFreeList〕;(3)空的消息队列控制块链表(OSQFreeList);(4)空的标志控制块链表(OSFlagFreeList);(5)存储控制块链表(OSMemFreeList);132、任务级切换函数OSCtxSw()与中断级任务切换函数OSIntCtxSw()为什么不一样?答:中断切换时要保护的操作已在中断效劳子程序中完成,因此OSIntCtxSw()中不包含保护代码,即无需压栈操作,而任务级切换OSCtxSw()就多一些保护代码段。133、简述OSTimeTick()作用?134、为什么在高优先级的任务代码里要插入OSTimeDly〔〕或OSTimeDlyHMSM()函数?135、什么是任务优先级反转现象?答:在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象。136、指出操作消息队列时向指针数组中插入消息指针的2种方式及操作特点?答:(1)先进先出(FIFO)方式;指针OSQIn指向的位置插入消息指针,指针OSQOut指向消息指针作为输出。(2)后进先出(LIFO)方式;只使用OSQOut指针,输入和输出都用OSQOut指针。137、什么是消息队列?答:让数组的每个元素都存放一个消息缓冲区指针,任务可通过传递这个指针数组指针的方法来传递多个消息,这种传递多个消息的数据结构叫做消息队列。138、什么是实时系统?实时嵌入式操作系统的特点是什么?答:实时系统就是利用实时操作系统用于过程控制、事务处理等有实时要求的领域的系统。实时嵌入式操作系统特点是实时性和可靠性,实时系统的特征是实时时钟管理,提供系统日期和时间、定时和延时等时钟管理功能;过载保护,缓冲区排队,丢弃某些任务,动态调整任务周期;高度可靠性和平安性,容错能力和冗余备份。139、什么是可剥夺型内核?140、为什么在把µC/OS-II向51单片机上移植时要设立系统堆栈和任务堆栈映像?答:这是由于51单片机的RAM大小只有128个字节,运行任务堆栈只能在这一区域,才能操作,而其它非运行任务的任务堆栈只能在外部RAM存储器中暂时保存,构成内部RAM中任务堆栈的任务堆栈映像。当非运行任务转化为运行任务时,其外部任务堆栈数据也要复制到内部SP指向RAM空间。141、下面程序段有错误,请修改代码。#include“includes.h〞#defineTASK_STK_SIZE512OS_FLAG_GRP*Sem_F;OS_STKMyTaskStk[TASK_STK_SIZE];OS_STKYouTaskStk[TASK_STK_SIZE];voidmain(void){Sem_F=OSFlagCreate(0,&err);OSInit();OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],6);OSStart();}voidMyTask(void*pdata){OSStatInit();For(;;){…..OSTaskCreate(YouTask,(void*)0,&YouTaskStk[TASK_STK_SIZE–1],4);…….}}voidYouTask(void*pdata){OSStatInit();For(;;){………..}}答:142、请写出主函数及任务函数的示意结构代码:答:#include“includes.h〞#defineMy_TASK_STK_SIZE512voidmain(void){OSInit();………OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE-1],6);OSStart();}voidMyTask(void*pdata){OSStatInit();TaskStartCreateTasks();For(;;){}}143、编写一个有3个任务的应用程序,每个任务均会在显示器上显示一个字符,并让3个任务具有不同的等待时间。答:#include“includes.h〞#defineTASK_STK_SIZE512//任务堆栈长度OS_STKMyTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKYouTaskStk[TASK_STK_SIZE];//定义任务堆栈区OS_STKHerTaskStk[TASK_STK_SIZE];//定义任务堆栈区INT16SKey;//用于退出µC/OS-II的键INT8Ux=0,y=0;//字符显示位置VoidMyTask(void*data);//声明一个任务VoidYouTask(void*data);//声明一个任务VoidHerTask(void*data);//声明一个任务Voidmain(void){char*s_M=“M〞;//定义要显示的字符char*s_N=“N〞;//定义要显示的字符char*s_L=“L〞;//定义要显示的字符OSInit();//初始化µC/OS-IIPC_DOSSaveReturn();//保存DOS环境PC_VectSet(uCOS,OSCtxSw);//安装µC/OS-II任务切换中断向量OSTaskCreate(MyTask,s_M,&MyTaskStk[TASK_STK_SIZE-1],0);OSTaskCreate(YouTask,s_N,&YouTaskStk[TASK_STK_SIZE-1],1);OSTaskCreate(HerTask,s_L,&HerTaskStk[TASK_STK_SIZE-1],2);OSStart();//启动多任务管理}VoidMyTask(void*pdata);{#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//安装µC/OS-II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);//设置µC/OS-II时钟频率OS_EXIT_CRITICAL();OSStatInit()//初始化µC/OS-II的统计任务for(;;){if(x>10){x=0;y+=2;}PC_DispChar(x,y,//字符的显示位置*(char*)pdata,//被显示的字符DISP_BGND_BLACK+DISP_FGND_WHITE);x+=1;//如果按下ESC键,那么退出uCOS-IIif(PC_GetKey(&key)==TRUE){if(key==0x1B){PC_DOSReturn();//返回DOS}}OSTimeDlyHMSM(0,0,3,0);//等待1s}}VoidYouTask(void*pdata);{#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifpdata=pdata;OS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//安装µC/OS-II时钟中断向量PC_SetTickRate(OS_TICKS_PER_SEC);//设置µC/OS-II时钟频率OS_EXIT_CRITICAL();OSStatInit()//初始化µC/OS-II的统计任务for(;;){if(x>10){x=0;y+=2;}PC_DispChar(x,y,//字符的显示位置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论