版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式操作系统
uC/OS第二章μC/OS-II的任务处理本章主要内容:什么是任务uC/OS-II是如何得到用户任务的;任务是如何调度的;uC/OS-II是如何知道应用程序CPU利用率的;uC/OS-II是如何完成初始化的;怎样启动多任务;uC/OS-II的文件结构及使用2.0临界段,OS_ENTER_CRITICAL()和
OS_EXIT_CRITICAL()临界段处理的一个主要问题就是关中断,处理完毕后再开中断。开关中断的时间是内核的一个重要的指标。取决于微处理器的结构或是编译器所生成的代码质量。通常借助于插入汇编指令来实现开/关中断效率最高。uC/OS使用两个预定义的宏(OS_CPU.H)来实现开关中断:
OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()2.0.1.临界段的使用…{…OS_ENTER_CRITICAL();
//临界段代码
OS_EXIT_CRITICAL();
…}注意:在临界段不应调用uC/OS-II的功能函数,尤其是与时间相关的函数。或者说在必须调用系统的功能函数时,应该开中断。2.0.2OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
的不同实现方法:使用在OS_CPU.H中预定义(#define)的常数OS_CRITICAL_METHOD可用来选择具体的实现方法:方法一,OS_CRITICAL_METHOD==1;采用处理器指令开/关中断。优点:简单、快捷,对某些处理器也许是唯一的选择。缺点:需要调用系统功能函数时,函数返回时会自动开中断。示意性代码:
#defineOS_ENTER_CRITICAL()asm(“DI”)
#defineOS_EXIT_CRITICAL()asm(“EI”)方法二,OS_CRITICAL_METHOD==2;采用在堆栈中保存开/关中断的状态,然后用处理器指令开/关中断。优点:在调用系统功能函数前后,中断标志在临界段的前后均不发生改变。缺点:稍微复杂一些。示意性代码:
#defineOS_ENTER_CRITICAL()asm(“PUSHPSW”)
asm(“DI”)
#defineOS_EXIT_CRITICAL()asm(“POPPSW”)
asm(“EI”)
方法三,OS_CRITICAL_METHOD==3;如果编译器提供了扩展功能,则利用OS_CPU.H中预定义的变量来保存和恢复PSW。优点:适用于各种微处理器。缺点:需要编译器提供支持。示意性代码:
OS_CPU_SRcpu_sr;……#defineOS_ENTER_CRITICAL()cpu_sr=get_processor_psw();disable_interrupts();//依赖于编译器
#defineOS_EXIT_CRITICAL()set_processor_psw(cpu_sr);//依赖于编译器
2.1uC/OS中的任务
将一个大的、复杂的应用程序分解成多个小程序,可简化解决问题的过程。这些小的程序实体就称其为“任务”,或称为“线程”。
uC/OS的一个主要功能就是对任务的管理、调度。从程序设计的角度看,任务就是为解决特定问题而建立的C语言函数及相关联的数据结构。
从存储结构来看任务的构成为:
任务代码、任务堆栈和任务控制块。从功能分:系统任务和用户任务2.1.0任务的组织形式2.1用户任务代码的一般结构
任务的代码通常是一个无限循环结构,或者说是一个超循环结构。在该循环中可以响应中断。voidMyTask(void*pdata)//形参必须定义成void的指针,以便参数传递{for(;;){
可被中断的代码;
OS_ENTER_CRITICAL();//
不可被中断的代码;//临界区
OS_EXIT_CRITICAL();//
可被中断的代码;
}}说明:在多任务系统中,用户任务看起来就是一个C语言函数,但该函数并不是被主函数或是其他函数调用的,而是由主函数创建和启动,然后交由操作系统负责调度和运行。
任务可以自我删除,但删除的代码仅仅是操作系统不再理会该代码,或者说操作系统“看不到”该代码。uC/OS提供了两个用来创建用户任务的函数:
OSTaskCreate()和OSTaskCreateExt()
其功能就是将任务的起始地址与任务控制块联系起来。其中后者提供了一些附加的功能。OSTaskCreateExt()的函数头;INT8UOSTaskCreateExt( void(*task)(void*pd),//指向任务的指针
void*pdata,//传递给任务的参数
OS_STK*ptos,//指向任务堆栈栈顶的指针
INT8Uprio//任务的优先级
INT16Uid//任务的标识符
OS_STK*pbos,//指向任务堆栈栈底的指针
INT32Ustk_size,//任务堆栈的容量
void*pext,//指向附加数据域的指针
INT16Uopt//用于设定操作选项
)OSTaskCreateExt()创建任务更为灵活,但会增加一些开销。//********************************************************************************************//CREATETASKS//********************************************************************************************/staticvoidTaskStartCreateTasks(void){INT8Ui;for(i=4;i<N_TASKS;i++)//CreateN_TASKSidenticaltasks{TaskData[i]='0'+i;//EachtaskwilldisplayitsownletterOSTaskCreate(Task,(void*)&TaskData[i],&TaskStk[i][TASK_STK_SIZE-1],i+1);}}睡眠态:用户任务代码驻留程序空间,但操作系统“看不见”。需“创建”后即入就绪态。创建需给出起始地址、优先级、栈空间。2.2任务状态就绪态:可在多任务运行之前通过“创建”进入,亦可由运行的任务建立。运行态:OSStart()可以启动多任务,但只能启动一次。OSStart()使最高级的任务进入运行态。等待状态:处于运行态的任务可由OSTimeDly()或OSTimeDlyHMSM()函数“带入”等待状态。亦可通过OSFlagPend(),OSSemPend(),
OSMutexPend(),
OSMboxPend()或OSQPend()来等待某事件的发生。OSTaskDel()可使一个任务由就绪态回到睡眠态。中断服务态:被ISR中断运行,除非该任务将中断关闭或者是操作系统关闭中断。2.3任务控制块
(OS_TCB)任务控制块的功能是:当一个任务的CPU使用权被剥夺时,操作系统用它来保存任务的状态。OS_TCB永远驻留内存。2.3.1任务控制块的数据结构(注意各成员之间的逻辑分组):typedefstructos_tcb{OS_STK*OSTCBStkPtr;//当前任务的栈顶指针,唯一的可用汇编处理的变量
#ifOS_TASK_CREATE_EXT_EN>0void*OSTCBEXTPtr;//指向用户定义的任务控制块扩展
OS_STK*OSTCBStkBottom;//指向任务堆栈的栈底指针,注意栈生长方向
INT32UOSTCBStkSize;//栈中可容纳的指针元数量,而非字节数
INT16UOSTCBOpt;//控制块扩展所定义的操作
INT16UOSTCBId;//任务识别码,目前未用
#endif任务控制块在任务建立时由创建函数建立structos_tcb*OSTCBNext;structos_tcb*OSTCBPrev;#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)||(OS_SEM_EN>0)||(OS_MUTEX_EN>0)OS_EVENT*OSTCBEventPtr;#endif#if((OS_Q_EN>0)&&(OS_MAX_QS>0))||(OS_MBOX_EN>0)OS_EVENT*OSTCBMsg;#endif#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)#ifOS_TASK_DEL_EN>0OS_FLAG_NODE*OSTCBFlagNode;#endifOS_FLAGSOSTCFlagsRdy;#endif
...…}OS_TCB;2.3.2任务控制块链表
uC/OS-II用两个链表来管理任务控制块,一条是空链表(缓冲池),在用户调用函数OSInit()对uC/OS-II初始化时建立;另一条是任务块链表(所有控制块均已分配给任务),是由创建函数OSTaskCreate()创建。
OSInit()对uC/OS-II初始化时,首先在RAM中创建OSTCB结构的OSTCBTbl[]数组,然后连结成下图所示的链表。初始化的空链表数=用户任务数+系统任务数
每当使用OSTaskCreate()或OSTaskCreateExt()创建一个任务时,系统会将OSTCBFreeList指向的任务快分配给该任务,在对各成员赋值后,按照任务控制块链表的头指针OSTCBList将其加入任务控制链表。下图是任务控制块链表的建立过程:uC/OS允许用函数OSTaskDel()删除一个任务。即将其从任务控制块链表中删掉,并归还空任务控制块链表。2.3.3任务控制块的初始化
当使用OSTaskCreate()或OSTaskCreateExt()创建一个任务时,该函数会自动调用系统函数OSTCBInit()来为任务控制块初始化。OSTCBInit()的函数原形为:2.4就绪表在OSRdyTbl[]中的“位”任务的优先级(prio):在OSRdyGrp中的“位”这是一个为加快运算速度预先建立起来的表表内填写的数字是任务的优先级号,其实际值是“0/1”使优先级别为prio的任务进入就绪态的操作:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];使优先级别为prio的任务脱离就绪态的操作:If((OSRdyTbl[prio>>3]&=-OSMapTbl[prio&0x7])==0)OSRdyGrp&=-OSMapTbl[prio>>3];应用实例:优先级判定表(OSUnMapTbl[256]):为加快运算速度在OS_CORE.H中定义的表假定OSRdyGrp==0x64,查表OSUnMapTbl[OSRdyGrp]=2即OSRdyTbl第二组对应的任务的优先级最高;假定OSRdyTbl[2]的值为0xE4,则查表OSUnMapTbl[0xE4]=2,得到任务的优先级prio=(2<<3)+2=18为当前的最高级中断。获得最高优先级任务运算:y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];prio=(y<<3)+x;2.5任务调度调度:即确定哪个任务的优先级最高,则该任务进入运行态。调度由调度器(scheduler)来完成;任务级的调度:OSSched()中断级的调度:OSIntExt()以下为任务调度器(taskscheduler)代码清单:voidOS_Sched(void){#ifOS_CRITICAL_METHOD==3OS_CPU_SRcpu_sr;#endifINT8Uy;OS_ENTER_CRITICAL();if((OSIntNesting==0&&(OSLockNesting==0)){y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+OSUnMapTbl[OSRdyTbl[y]);if(OSPrioHighRdy!=OSPrioCur{OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
OS_TASK_SW();}}OS_Exit_CRITICAL();}任务调度所执行的任务切换为:1)将被挂起任务的处理器、寄存器推入堆栈。然后将高优先级任务的寄存器从栈中恢复到寄存器中。2)在uC/OS中,就绪任务的栈结构总是看起来跟刚刚发生过中断一样,所有寄存器都保存在栈中。即其运行只是恢复所有的CPU寄存器并运行中断返回指令。3)OS_TASK_SW()为模拟一次中断,从而挂起当前正在执行的任务,执行更重要的任务。4)OS_Sched()的所有代码均为临界段代码。2.6任务级的任务切换OS_TASK_SW()
当有更高优先级的任务进入就绪态时,调用OS_TASK_SW(),完成任务切换(context–switch)(具体函数是OSCtxSw(),也就是CPU中的全部寄存器内容。OS_TASK_SW()是一个宏调用,通常包含有软中断指令,一般来讲是移植时需要修改的内容。我们虚构一个如下的CPU:1个堆栈指针(SP)1个程序寄存器(PC)1个处理器状态寄存器4个通用寄存器(R1、R2、R3及R4)切换前的状态:1)调用OS_TASK_SW(),强制处理器保存PC、PSW
2)软中断指令保存R1~R4重新装入要运行的任务任务切换函数OSCtxSw()的示意性代码(通常由汇编完成):voidOSCtxSw(void){asm(“pushR1”);asm(“pushR2”);asm(“pushR3”);asm(“pushR4”);OSTCBCur->OSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBCur->OSTCBStkPtr;
asm(“popR1”);asm(“popR2”);asm(“popR3”);asm(“popR4”);asm(“reti”);}2.7给调度器上锁和开锁
给调度器上锁(OSSchedLock())用于禁止任务调度,直到任务完成后,调用给调度器开锁函数(OSSchedUnlock())。
调度器上锁后,任务保持对CPU的使用权,而不管是否有更高级的任务进入就绪态。但如果此时是开中断状态,则中断依然可以被识别,且可以进入中断服务。给调度器上锁函数程序清单1给调度器开锁函数程序清单2给调度器上锁和开锁函数的应用应十分慎重uC/OS-II允许嵌套的最大深度为255。
变量OSLockNesting用来跟踪OSSchedLock()
被调用的次数,uC/OS-II只有在OSLockNesting==0时方允许任务调度打开。2.8空闲任务(ideltask)
空闲任务永远是最低级任务,即OS_LOWEST_PRIO。空闲任务不可能被应用软件删除。voidOS_TaskIdel(void*pdata){#ifOS_CRITICAL_METHED==3OS_CPU_SRcpu_sr;#endifpdata=pdata;for(;;){OS_ENTER_CRITICAL();OSIdelCtr++;//32bit,许多低端CPU需多条指令完成
OS_EXIT_CRITICAL();OSTaskIdelHook();//可执行使CPU进入低功耗模式等命令
}}3.9统计任务OSTaskStat()(在OS_CORE.C中)
如果系统配置常数OS_TASK_STAT_EN(在OS_CFG.H)设为1,该任务即可建立。一旦得到允许,则每秒运行一次。该任务的输出:CPU的使用率(OSCPUUage),用百分比表示,精度1%。说明:如果需要使用统计任务,则必须在初始化时建立的第一个任务中调用统计任务初始化函数OSStatInit(),即在启动OSStart()开始多任务调度之前先建立一个任务来调用统计任务的初始化函数OSStatInit(),然后再建立应用程序中的其他任务。3.10uC/OS中的中断ISR的结构用户中断服务子程序结构:中断服务程序的执行过程voidOSIntEnter(void){if(OSRunning==TRUE)if(OSIntNesting<255)OSIntNesting++;}voidOSIntExit(void){#ifOS_CRITICAL_METHED==3OS_CPU_SRcpu_sr;#endifOS_ENTER_CRITICAL();if(OSRunning==TRUE)if(OSIntNesting>0)OSLockNesting--;if((OSIntNesting==0)&&(OSLockNesting==0)){OSIntExitY=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((OSIntExitY<<3))+OsunMapTbl[OSRdyTbl[OSIntExitY];if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=OSPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OSIntCtxSw();//与OS_TASK_SW()不同,ISR已将寄存器压栈
}}OS_EXIT_CRITICAL();}任务级的任务切换和中断级的任务切换:OSCtxSw():PUSH将当前CPU各寄存器值压入栈OSTCBCur->OSTCBStkPtr=sp在当前任务的TCB中保存当前任务的sp指针OSTCBCur=OSTCBHighRdy将指向当前任务的指针指向新任务OSPrioCur=OSPrioHighRdy将新任务的优先级复制给当前任务的优先级sp=OSTCBCur->OSTCBStkPtr将新任务的堆栈指针赋值给CPU的spPOP从新任务堆栈中恢复CPU各寄存器IRET执行中断返回,弹出程序指针PC和状态寄存器PSWOSIntSw():OSTCBCur=OSTCBHighRdy将指向当前任务的指针指向新任务OSPrioCur=OSPrioHighRdy将新任务的优先级复制给当前任务的优先级sp=OSTCBCur->OSTCBStkPtr将新任务的堆栈指针赋值给CPU的spPOP从新任务堆栈中恢复CPU各寄存器IRET执行中断返回,弹出程序指针PC和状态寄存器PSW2.11时钟节拍
许多任务需要时钟来实现延时或确认超时,uC/OS的节拍为10~100Hz。其节拍源可以是专门的硬件定时器,或是来自工频交流电。注意:定时器中断必须放在多任务系统启动之后,即在OSStart()之后要做的第一件事就是初始化定时器中断。而不应该放到系统初始化OSInit()之后,OSStart()之前。
uC/OS-II的时钟节拍服务是通过在中断服务子程序中调用OSTimeTick()实现的。OSTimeTick()跟踪所有任务的定时器及超时时限。时钟节拍中断服务子程序的一个示意性代码:voidOSTickISR(void){
保存全部CPU寄存器;
OSIntNesting++;//或用OSIntEnter()通知操作系统在做中断服务
if(OSIntNesting==1)
OSTCBCur->OSTCBStkPtr=SP;OSTimeTick();清发出中断的设备的中断标志;重新允许中断以及其他需要的服务;
OSIntExit();//通知操作系统已退出中断服务恢复所有CPU寄存器;执行中断返回指令;}2.12uC/OS-II初始化
在使用系统的所有服务之前,必须调用OSInt()对uC/OS-II自身的运行环境进行初始化。该初始化主要完成以下工作:1)对uC/OS-II所有的全局变量和数据结构进行初始化;2)创建空闲任务,并赋之以最低的优先级和永远的就绪态;3)如果用户程序需要统计任务(OS_TASK_STAT_EN=1),则以OS_LOWEST_PRIO-1创建统计任务。假定:OS_TASK_STAT_EN==1;OS_FLG_EN==1;OS_LOWEST_PRIO==63;最多任务数OS_MAX_TASKS为62,则初始化后的系统数据结构为:1)uC/OS的全局变量2)uC/OS-II的初始化voidOSInit(void){#ifOS_VERSION>=204OSInitHookBegin();#endifOS_InitMisc();
//初始化系统需要的一些变量
OS_InitRdyList();//初始化就绪列表
OS_InitTCBList();//初始化TCB列表
OS_InitEventList();//初始化事件列表#if(OS_VERSION>=251)&&(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)OS_FlagInit();//初始化事件标志#endif启动后的内存映像:#if(OS_MEM_EN>0)&&(OS_MAX_MEM_PART>0)OS_MemInit();//初始化内存管理#endif#if(OS_Q_EN>0)&&(OS_MAX_QS>0)QS_Init();//初始化消息队列#endifOS_InitTaskIdle();//建立空闲任务#ifOS_TASK_STAT_EN>0OS_InitTaskStat();//建立统计任务#endif#ifOS_VERSION>=204OSInitHookEnd();#endif}typedefstructOS_TCB{OS_STK*OSTCBStKPtr;/*指向任务独立堆栈的栈顶指针*/#ifOS_TASK_CREATE_EXT_ENvoid*OSTCBExtPtr;/*指向用户定义的任务控制块拓展*/OS_STK*OSTCBStkBottom;/*指向任务栈区栈底的指针*/INT32UOSTCBStkSize;/*栈区中可容纳的存储单元个数*/INT16UOSTCBopt;/*创建TCB的类型选择*/INT16UOSTCBId;/*任务识别号*/#endifstructOS_TCB*OSTCBNEXT;/*指向OS_TCB联表中下一个元素*/structOS_TCB*OSTCBPre;/*指向OS_TCB联表中前面一个元素*/#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_ENOS_EVENT*OSTCBEvent;/*指向事件控制块的的指针*/#endifuc/os-II的任务控制块的数据结构的定义#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_ENvoid*OSTCBMsg;/*指向传给任务的消息指针*/#endifINT16UOSTCBDly;/*任务允许等待事件发生的最多时钟节拍数*/INT8UOSTCBStat;/*任务的状态字*/INT8UOSTCBPrio;/*任务的优先级*/INT8UOSTCBX;/*任务就绪表位图矩阵的X坐标*/INT8UOSTCBY;/*任务就绪表位图矩阵的Y坐标*/INT8UOSTCBBitX;/*任务就绪表位图矩阵的X坐标操作掩码*/INT8UOSTCBbitY;/*任务就绪表位图矩阵的Y坐标操作掩码*/#ifOS_TASK_DEL_EN
BOOLEANOSTCBDelReg;/*表示该任务是否删除*/#endif}OS_TCB;2.13uC/OS-II的启动
多任务系统在完成初始化之后,通过调用OSStart()实现启动。然而在uC/OS-II启动之前,必须至少建立一个任务。voidOSStart(void){INT8Ux,y;if(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((y<<3)+x);OSPrioCur=OSPrioHighRdy;OSTCBCtr=OSTCBHighRdy;OSStartHighRdy();//该函数永远不会返回到OSStart()}}OSStartHighRdy()函数需要用户移植实现,是由汇编来完成,主要的工作是:OSRunning=TRUE;调用OSTaskSwHook()函数;设置处理器的堆栈指针寄存器为OSTCBHighRdy->OSTCBStkPtr;恢复所有处理器的寄存器内容(不包括堆栈指针寄存器和PC寄存器);恢复PC寄存器并开始执行PC指向的指令。
OSTCBHighRdy:指向处于就绪状态的优先级最高的任务的TCB的指针。
OSTCBStkPtr:指向当前任务堆栈栈顶的指针。说明:uC/OS-II的初始化及启动例程:#include“includes.h”#defineMY_TASK_STK_SIZE512voidmain(void){OSInt();……OSTaskCreate(MyTask,(void*)0,&MyTaskStk[MY_TASK_STK_SIZE–1,6//任务的优先级
);OSStart();//启动uC/OS-II}voidTask(void*pdata){INT8Ux;INT8Uy;INT8Uerr;for(;;){OSSemPend(RandomSem,0,&err);//Acquiresemaphoretoperformrandomnumbersx=random(80);//FindXpositionwheretasknumberwillappeary=random(16);//FindYpositionwheretasknumberwillappearOSSemPost(RandomSem);//ReleasesemaphorePC_DispChar(x,y+5,*(char*)pdata,DISP_FGND_BLACK+DISP_BGND_LIGHT_GRAY);//DisplaythetasknumberonthescreenOSTimeDly(1);//Delay1clocktick}}TaskStartCreateTasks();//Createalltheapplicationtasksfor(;;){TaskStartDisp();//Updatethedisplayif(PC_GetKey(&key)==TRUE){//Seeifkeyhasbeenpressedif(key==0x1B)//Yes,seeifit'stheESCAPEkey{PC_DOSReturn();//ReturntoDOS}}OSCtxSwCtr=0;//ClearcontextswitchcounterOSTimeDlyHMSM(0,0,1,0);//Waitonesecond}}看一个实际嵌入实时操作系统的例子:
在PC的DOS下工作,共建立了十个任务,每个任务在屏幕的随机位置分别显示0~9的数字。程序的清单如下:TEST.C例题:
显示μC
/
OS的堆栈检查功能#include"includes.h"#defineTASK_STK_SIZE512//Sizeofeachtask'sstacks#defineTASK_START_ID0//ApplicationtasksIDs#defineTASK_CLK_ID1#defineTASK_1_ID2#defineTASK_2_ID3#defineTASK_3_ID4#defineTASK_4_ID5#defineTASK_5_ID6#defineTASK_START_PRIO10//Applicationtaskspriorities#defineTASK_CLK_PRIO11#defineTASK_1_PRIO12#defineTASK_2_PRIO13#defineTASK_3_PRIO14#defineTASK_4_PRIO15#defineTASK_5_PRIO16#include"includes.h"#defineTASK_STK_SIZE512//Sizeofeachtask'sstacks(#ofWORDs)#defineN_TASKS10//Numberofidenticaltasks//*********************************************************************************************//OS_STKandOS_EVENTistheDATA_TYPEthatdefinedin“includes.h”//*********************************************************************************************OS_STKTaskStk[N_TASKS][TASK_STK_SIZE];//Task’sstacksOS_STKTaskStartStk[TASK_STK_SIZE];//pointofTask’sstackcharTaskData[N_TASKS];//ParameterstopasstoeachtaskOS_EVENT*RandomSem;//FUNCTIONPROTOTYPES//************************************************************************************voidTask(void*data);//FunctionprototypesoftasksvoidTaskStart(void*data);//FunctionprototypesofStartuptaskstaticvoidTaskStartCreateTasks(void);//StaticfunctionstaticvoidTaskStartDispInit(void);staticvoidTaskStartDisp(void);voidmain(void){
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);//ClearthescreenOSInit();//InitializeuC/OS-IIPC_DOSSaveReturn();//SaveenvironmenttoreturntoDOSPC_VectSet(uCOS,OSCtxSw);//InstalluC/OS-II'scontextswitchvectorRandomSem=OSSemCreate(1);//RandomnumbersemaphoreOSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);OSStart();//Startmultitasking}voidTaskStart(void*pdata){#ifOS_CRITICAL_METHOD==3//AllocatestorageforCPUstatusregisterOS_CPU_SRcpu_sr;#endifchars[100];INT16Skey;pdata=pdata;//PreventcompilerwarningTaskStartDispInit();//InitializethedisplayOS_ENTER_CRITICAL();PC_VectSet(0x08,OSTickISR);//InstalluC/OS-II'sclocktickISRPC_SetTickRate(OS_TICKS_PER_SEC);//ReprogramtickrateOS_EXIT_CRITICAL();OSStatInit();//InitializeuC/OS-II'sstatistics//******************************************************************************************//VARIABLES//******************************************************************************************OS_STK
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新苏教版科学四年级上册 第二单元 物体的运动教学设计
- 奥迪汽车年主题试驾
- ms的免疫病理机制及免疫干预治疗
- 骨折儿童心理护理
- 肺心病病人宣教
- 铣工高级工模拟考试题与答案
- 泵站运行工(初级)理论考试题及答案
- linux开发面试题及答案
- 初中七年级数学分式运算暑假衔接教学设计
- access数据库试题及答案
- 2026年船舶专业正高级船舶电子员考试练习题及答案
- 2026年德惠市公益性岗位人员招聘(378人)笔试参考题库及答案详解
- (一检)2026-2027学年福州市高三年级适应性练习地理试题(含答案)
- 2025年通信工程师中级通信专业实务(终端与业务)考试真题及答案
- 进入新时代的意义(课件)-2026-2027学年统编版道德与法治九年级上册
- 2026年从业人员健康证管理题库及答案
- 2026年广西壮族自治区贺州市法检系统书记员招聘笔试备考题库及答案详解
- 2026教科版六年级科学上册第一单元《健康生活》全部教案
- 钢结构凉亭施工方案
- 上海绿色施工方案格式文本(2026版)
- 《传感器与检测技术》课件 第十章光纤传感器
评论
0/150
提交评论