一、概念1.实时系统:指系统能够在限定的响应时间内提供所需水平的服务2.ucos-ii最多管理64个任务3.其中OS_TaskStat的优先级占62,OS_TaskIdle的优先级是634.ucos-ii的优先级号是0~63,值越小优先级越高5.临界区的两个宏OS_ENTER_CRITICAL、OS_EXIT_CRITICAL:a)第一种方式:OS_ENTER_CRITCAL被定义成关中断,OS_EXIT_CRITICAL被定义成开中断,这种方式有一个问题,如果在禁止中断的情况下调用uc/os-ii函数,那么从uc/os-ii函数返回时,中断可能会变成允许的了。b)第二种方式:OS_ENTER_CRITICAL被定义为先将中断状态保存到堆栈中,然后关中断,OS_EXIT_CRITICAL被定义为再从堆栈中恢复原来中断开/关状态。这种方式也有一个问题,因为编译器不知道堆栈指针已经被OS_ENTER_CRITICAL中的push指令改变了。那么所有采用栈指针相对寻址模式的局部变量都会出现偏差并导致严重问题。c)第三种方式:执行OS_ENTER_CRITICAL,将中断状态字保存在了局部变量中,执行OS_EXIT_CRITICAL时,将中断状态字从局部变量中恢复过了,这样即能保存执行OS_ENTER_CRITICAL时的程序中断状态,又不会影响栈指针。6.OSRdyTbl就绪表的大小由OS_RDY_TBL_SIZE来定义,由OS_LOWEST_PRIO来决定的,OS_RDY_TBL_SIZE=(((OS_LOWEST_PRIO)/8u)+1u)7.TCB的内部定义:structos_tcb{OS_STK*OSTCBStkPtr,指向当前任力的堆栈栈顶的指针structos_tcb*OSTCBNext,指向下一个任务控制块structos_tcb*OSTCBPrev,指向上一个任务控制块OS_EVENT*OSTCBEventPtr,指向事件控制块的指针。void*OSTCBMsg,指向传递给任务的消息的指针OS_FLAG_NODE*OSTCBFlagNode,指向事件标志结点的指针OS_FLAGSOSTCBFlagsRdy,当任务等待事件标志组时,OSTCBFlagRdy是使任务进入就绪态的事件标志INT16UOSTCBDly当需要把任务延时若干时钟节拍时,或者需要把任务挂起一段时间以等待某个事件的发生时,须用到这个变量。INT8UOSTCBStat,用于指示任务状态INT8UOSTCBPrio用于指示任务的优先级INT8UOSTCBXOSTCBYOSTCBBitXOSTCBBitY,用于加速就绪态的计算过程}8.TCB内部最重要的元素放在第一个单元叫OSTCBStkPtr,因数这个变量是惟一一个能用汇编语言处置的变量,将其放在结构最前面,使得在汇编语言中处理这个变量时较为容易。9.启动过程:OSInit(),OSTaskCreate(),OSStart(),开始时钟使能节拍。10.中断服务流程:保存全部CPU寄存器;调用OSIntEnter或OSIntNesting直接加1;执行用户代码做中断服务;调用OSIntExit();恢复所有CPU寄存器;执行中断返回指令;11.异步串行通信:单工:信息在两点之间只能单方向发送的工作方式。双工:信息在两点之间能够在两个方向上发送的工作方式起始位:下降沿起始位,空闲电平是1波特率单位:bpsbit/s12.键盘什么时候用矩形键盘:当键盘多于5个时,键盘的核心问题是去抖。13.可以被4整除且不能被100整除即为闰年;可以被400整除的为闰年;二、名词解释什么叫前后台系统:前后台系统又叫超循环系统,是由应用程序和中断服务程序组成。应用程序是一个无限循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。中断服务程序处理异步事件,这部分时间相关性很强的关键操作靠中断服务来保证,可以看成前台行为。什么叫多任务系统:多任务系统是靠CPU在许多任务之间转换和调度,以达到所有任务并发执行的功能的系统。什么叫时钟节拍?时钟节拍是特定的周期性中断。这个中断可以看做是系统心脏的脉动。操作系统通过时钟节拍为任务提供时间管理。什么叫任务状态?任务状态是任务当前所处于的一种状态。共有5种状态:睡眠态:任务驻留在程序空间,还没有交给uc/os-ii来管理。把任务交给uc/os-ii是通过OSTaskCreate()或OSTaskCreateExt()来实现的。这些调用只是用于告诉uc/os-ii任务的起邕地址在哪里;任务建立时,用户给作协务赋予的优先级是多少,任务要使用多少栈空间用等等。就绪态:任务一量建立,这个任务就进入了就绪态,准备运行。运行态:调用OSStart()可以启动多任务。该函数运行用户初始化代码中已经建立的、进入就绪态的优先级最高的任务。优先级最高的任务就这样进入了运行态。等待状态:正在运行的作任务延迟一段时间或等待某一事件的发生将进入就等待状态。中断服务态:正在运行的任务是可以被中断的,除非该任务中断关闭,或者uc/os-ii将中断关闭。被中断了的任务于是进入了中断服务态。什么是量化?将时间和空间的连续的模拟信号转换为数字信号叫量化。三、简答题:1.ECB中完整的数据结构描述。typedefstruct{INT8UOSEventType;/*事件类型*/INT8UOSEventGrp;/*等待任务所在的组*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务所在的列表,与OSEventGrp相配合构成与就绪表相同的结构*/INT16UOSEventCnt;/*当事件控制块用于信号量时,此变量用于信号量计数;当事件控制块用于互斥信号量时,此变量用于互斥型信号量和优先级继承优先级(PIP)的计数器。void*OSEventPtr;/*指向消息或消息队列的指针*/}OS_EVENT;2.就绪表中完整的数据结构描述就绪表中有2个变量,OSRdyGrp和OSRdyTbl[]。OSRdyGrp中任务按优先级分组,8个任务为一组。OSRdyGrp的每一位表示8组作任务中每一组是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中相应的元素的相应位被置1。3.TMR的数据结构structTMR{BOOLEANTmrEn;/*用于启动或禁止倒计数过程*/INT16UTmrCtr;/*计数器当前值*/INT16UTmrInit;/*计数器初始值*/void(*TmrFnct)(void*);/*计数器为0时被调用的函数的指针*/void*TmrFnctArg;/*函数TmrFnct的参数*/};4.OS_TCB*OSTCBPrioTbl[OS_LOWEST_PRIO+1u];OSTCBPrioTbl[OS_LOWEST_PRIO–1]里面存放的是OS_TaskStat任务。OSTCBPrioTbl[OS_LOWEST_PRIO]里面存放的是OS_TaskIdle任务。uc/os-ii建议保留4个最高优先级和4个最低优先级的任务,供心后uc/os-ii的版本使用。5.行列式矩形扫描算法①所有的行(输出端口)被强行设置为低电平;②扫描每一列,若全为高电平,则没有键按下;否则,找到为低电平的列;③锁定该低电平的列,行逐次送低电平0;④若锁定的列为低电平,则按下的键必在此行。6.任务状态转换图7.时钟负载重的情况下的两种解决方法:1.那么可以从任务级等待调用OSTimeTick();代码如下:TickTask的优先级必须大于应用程序中所有其他作任务优先级的任务。voidTickTask(void*pdata){pdata=pdata;for(;;){OSMboxPend(…);OSTimeTick();OS_Sched();}}voidOSTickISR(void){保存处理器寄存器的值;调用OSIntEnter(),或是将OSIntNesting加1;if(OSIntesting==1)OSTCBCur-OSTCBStkPtr=SP;发哑消息(即(void*)1)给时钟节拍邮箱;调用OSIntExit();恢复处理器寄存器的值;执行中断返回指令;}2.使用计数信号,信号会“记住”时钟脉冲数,因此在处理器的负载减少时,时钟任务最终会追上来。每个时钟脉冲或一整秒过去后,时钟脉冲ISR给计数信号发送一个信号。四、程序填充1.闰年的判断逻辑表达式If((!(year%4)&&(year%100))||!(year%400))闰年Else平年2.生成时间戳函数代码如下:TSClkMakeTS(INT8Umonth,INT8Uday,INT16Uyr,INT8Uhr,INT8Umin,INT8Usec){TSts;yr-=CLK_TS_BASE_YEAR;ts=((INT32U)yr26)|((INT32U)month22)|((INT32U)day17);ts|=((INT32U)hr12)|((INT32U)min6)|(INT32U)sec;return(ts);}3.异步串行通信发送缓冲区和接收缓冲区图下图列出了使用环状缓冲区的输入缓冲。在接收字节时,ISR从串行端口读入字节(①),将其放入环状缓冲区(②);应用程序(后台)监测环状缓冲区是否收到了字节(③)。如果环状缓冲区不是空的,就从环状缓冲区中取出最“旧”的字节(最早收到的)。当应用程序从ISR或接口函数以独占方式访问环状缓冲区时,中断将会停止。如果应用程序不及时取出环状缓冲区中的字节,环状缓冲区将会被填满而导致接收字节丢失。对输入数据的响应依赖于后台进程执行速度。如果是实时内核,处理输人数据的速度就与ISR只接收数据(不处理)的速度差不多一样快。为此,环状缓冲区的管理中加入了一个信号量,见下图。应用程序在信号量处等待(①);收到一个字节后,ISR从串行端口读人字节(②),将其存入环状缓冲区(③)。然后ISR通知信号量,等待任务已收到一个字节(④)。信号发送给信号量,等待任务就准备运行。ISR完成后,内核决定等待任务是否成为占有CPU的最优先任务。如果是的话,并且内核为占先内核,则ISR恢复等待字节的任务。应用程序从环状缓冲区中取出字节,执行所要求的进程。传输字节有时类似于接收字节。后台进程将字节存储于输出缓冲区中。当UART的发送端准备发送字节时,产生一个中断,字节从缓冲区中取出,并由ISR输出。在串行端口传输大量数据时,数据的缓冲有着重要意义,如对于磁盘文件的内容。下图列出了使用环状缓冲区的输出缓冲。发送一个或多个字节时,字节置于环状缓冲区(①)。在字节送人缓冲区后传输中断开始启动(②)。当UART发送字节准备就绪后,产生中断,ISR将最旧的字节(最远期的)从环状缓冲区取出(③)。字节向串行端口输出(④)。如果环状缓冲区已清空,则禁止传输中断。下图展示了怎样利用实时内核的机制。当缓冲区已满时,信号量作为交通信号灯暂停发送任务。为发送数据,任务等待信号量(①)。如果环状缓冲区未满,则任务继续向环状缓冲区存储数据(②)。如果存储的字节是环状缓冲区的第一个字节,则传输中断开始启动(③)。传输中断ISR从环状缓冲区中取出最旧的字节(④),同时通知信号量(⑤),表明环状缓冲区有空间接收另外的字符。接着ISR将字节输出给UART。TxSem需要作为一个计数信号量,信号量需要初始化为环状缓冲区的大小。3.键盘状态机用来扫描键盘及实现以前描述过的所有特征最简单的方法就是建立一个简单的状态机,如下图所示。该状态机在每次去除回弹周期内就执行一次。4.OSStartHighRdy()函数的示意代码:voidOSStartHighRdy(){调用用户定义的OSTaskSwHook();OSRuning=TRUE;得到将要恢复运行任务的堆栈指针:Stackpointer=OSTCBHighRdy-OSTCBStkPtr;从新任务堆栈中恢复处理器的所有寄存器;执行中断返回指令;}5.OSCtxSw()的