UCOSII学习笔记.docx
《UCOSII学习笔记.docx》由会员分享,可在线阅读,更多相关《UCOSII学习笔记.docx(61页珍藏版)》请在冰豆网上搜索。
UCOSII学习笔记
////////////////////////////////////////////////////////////////////////////////////////////////////////
//学校:
成都理工大学
//系:
应用数学系
//专业:
应用数字专业。
//日期:
2009年3月
//说明:
本简要合成程序是uCOS-II提供的EX1_X86
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include"includes.h"
/*
*********************************************************************************************************
*CONSTANTS(宏定义)
*********************************************************************************************************
*/
#defineTASK_STK_SIZE512/*任务堆栈尺寸=512(单位=WORD)*/
#defineN_TASKS10/*任务数量=10(不包括TaskStart()任务)*/
/*
*********************************************************************************************************
*VARIABLES(变量)
*********************************************************************************************************
*/
OS_STKTaskStk[N_TASKS][TASK_STK_SIZE];/*10个任务的堆栈区域*/
OS_STKTaskStartStk[TASK_STK_SIZE];/*任务TaskStart()的堆栈*/
charTaskData[N_TASKS];/*每个任务显示字符存储区域*/
OS_EVENT*RandomSem;/*信号量*/
/*
*********************************************************************************************************
*FUNCTIONPROTOTYPES
*********************************************************************************************************
*/
voidTask(void*data);/*其余10个任务,这10个任务共用一个函数名称*/
voidTaskStart(void*data);/*起始任务(负责uCOS-II初始化,修改中断向量*/
/*调用TaskStartCreateTasks()创建其余10个任务*/
/*然后若检测“ESC”键,则返回MSDOS*/
staticvoidTaskStartCreateTasks(void);/*创建其余10个任务的任务*/
staticvoidTaskStartDispInit(void);/*界面显示初始化*/
staticvoidTaskStartDisp(void);/*多任务显示子程序*/
voidmain(void)
{
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);/*清屏幕*/
OSInit();/*uC/OS-II初始化*/
/*包括
(1)、初始化任务就绪表*/
/*
(2)、初始化任务控制块链表*/
/*(3)、初始化事件表*/
/*(4)、初始化内存管理*/
/*(5)、初始化消息队列*/
/*(6)、初始化空闲任务*/
/*(5)、初始化统计任务*/
PC_DOSSaveReturn();/*保存MSDOS环境*/
/*包括
(1)、保存BIOS硬件定时中断向量(0x08)*/
/*
(2)、将保留中断号0x81指向硬件定时*/
/*中断*/
PC_VectSet(uCOS,OSCtxSw);/*InstalluC/OS-II'scontextswitchvector*/
RandomSem=OSSemCreate
(1);/*Randomnumbersemaphore*/
OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);
OSStart();/*Startmultitasking*/
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
//学校:
成都理工大学
//系:
应用数学系
//专业:
应用数字专业。
//日期:
2009年3月
//说明:
本简要合成程序是uCOS-II提供的EX1_X86
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include"includes.h"
/*
*********************************************************************************************************
*CONSTANTS(宏定义)
*********************************************************************************************************
*/
#defineTASK_STK_SIZE512/*任务堆栈尺寸=512(单位=WORD)*/
#defineN_TASKS10/*任务数量=10(不包括TaskStart()任务)*/
/*
*********************************************************************************************************
*VARIABLES(变量)
*********************************************************************************************************
*/
OS_STKTaskStk[N_TASKS][TASK_STK_SIZE];/*10个任务的堆栈区域*/
OS_STKTaskStartStk[TASK_STK_SIZE];/*任务TaskStart()的堆栈*/
charTaskData[N_TASKS];/*每个任务显示字符存储区域*/
OS_EVENT*RandomSem;/*信号量*/
/*
*********************************************************************************************************
*FUNCTIONPROTOTYPES
*********************************************************************************************************
*/
voidTask(void*data);/*其余10个任务,这10个任务共用一个函数名称*/
voidTaskStart(void*data);/*起始任务(负责uCOS-II初始化,修改中断向量*/
/*调用TaskStartCreateTasks()创建其余10个任务*/
/*然后若检测“ESC”键,则返回MSDOS*/
staticvoidTaskStartCreateTasks(void);/*创建其余10个任务的任务*/
staticvoidTaskStartDispInit(void);/*界面显示初始化*/
staticvoidTaskStartDisp(void);/*多任务显示子程序*/
voidmain(void)
{
PC_DispClrScr(DISP_FGND_WHITE+DISP_BGND_BLACK);/*清屏幕*/
OSInit();/*uC/OS-II初始化*/
/*包括
(1)、初始化任务就绪表*/
/*
(2)、初始化任务控制块链表*/
/*(3)、初始化事件表*/
/*(4)、初始化内存管理*/
/*(5)、初始化消息队列*/
/*(6)、初始化空闲任务*/
/*(5)、初始化统计任务*/
PC_DOSSaveReturn();/*保存MSDOS环境*/
/*包括
(1)、保存BIOS硬件定时中断向量(0x08)*/
/*
(2)、将保留中断号0x81指向硬件定时*/
/*中断*/
//------------------------------------------------------------------------------------------------
//#defineuCOS0x80/*Interruptvector#usedforcontextswitch*/
//宏定义uCOS的路径=\SOFTWARE\uCOS-II\Ix86L\BC45\OS_CPU.H(文件中)
//------------------------------------------------------------------------------------------------
PC_VectSet(uCOS,OSCtxSw);/*InstalluC/OS-II'scontextswitchvector*/
/*设置中断号=0x80自定义中断服务程序的向量*/
/*地址指向OSCtxSw,即指向普通任务切换子程序*/
/*说明:
任务切换包括:
*/
/*
(1)、普通任务切换*/
/*
(2)、中断任务切换*/
RandomSem=OSSemCreate
(1);/*Randomnumbersemaphore*/
/*创建一个信号量,保护BorlandC++产生的随机*/
/*数。
信号量的作用是防止多个任务同时访问同*/
/*一个资源*/
OSTaskCreate(TaskStart,(void*)0,&TaskStartStk[TASK_STK_SIZE-1],0);
/*创建任务TaskStart*/
OSStart();/*在就绪表中查找最高优先级的任务号*/
}/*然后调用OSStartHighRdy()执行最高*/
/*优先级任务*/
/*
*********************************************************************************************************
*STARTMULTITASKING(启动多任务操作系统)
*
*Description:
ThisfunctionisusedtostartthemultitaskingprocesswhichletsuC/OS-IImanagesthe
*taskthatyouhavecreated.BeforeyoucancallOSStart(),youMUSThavecalledOSInit()
*andyouMUSThavecreatedatleastonetask.
*描述:
当已经调用了OSStart(),则这个函数可以启动多任务操作系统,让uC/OS-II管理你已经创建的任务。
*前提是你已经调用了OSInit(),并且已经至少创建了一个任务(只需要创建系统提供的空闲任务即可)。
*Arguments:
none
*入口参数:
无
*Returns:
none
*出口参数:
无
*Note:
OSStartHighRdy()MUST:
*a)CallOSTaskSwHook()then,
*b)SetOSRunningtoTRUE.
*c)LoadthecontextofthetaskpointedtobyOSTCBHighRdy.
*d_Executethetask.
*注释:
OSStartHighRdy()函数执行的动作是:
*a)调用CallOSTaskSwHook(),然后
*b)设置OSRunning=TRUE
*c)根据任务控制块OSTCBHighRdy,作任务切换动作。
*实际上任务切换的实质:
*
(1)、从当前任务的私栈中恢复SS:
SP
*
(2)、从当前任务的私栈中恢复AX,BX,CX,DX,SI,DI,BP
*(3)、执行IRET,从堆栈中弹出CS:
IP
*d)自动跳转到CS:
IP处,执行这个最高优先级任务
*OSStartHighRdy()函数的存储路径=\SOFTWARE\uCOS-II\Ix86L\BC45\OS_CPU_A.ASM
*********************************************************************************************************
*/
voidOSStart(void)
{
INT8Uy;
INT8Ux;
if(OSRunning==FALSE)/*如果多任务操作系统还没有运行*/
{
y=OSUnMapTbl[OSRdyGrp];/*Findhighestpriority'staskprioritynumber*/
x=OSUnMapTbl[OSRdyTbl[y]];/*查找优先级最高的任务号*/
OSPrioHighRdy=(INT8U)((y<<3)+x);/*优先级最高的任务号=(y<<3)+x)*/
OSPrioCur=OSPrioHighRdy;/*OSPrioCur中保存优先级最高的任务号*/
OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];/*Pointtohighestprioritytaskreadytorun*/
/*得到优先级最高任务的任务控制块OSTCB*/
OSTCBCur=OSTCBHighRdy;/*OSTCBCur中保存优先级最高任务的任务控制块*/
OSStartHighRdy();/*Executetargetspecificcodetostarttask*/
/*调用OSStartHighRdy(),执行这个最高优先级任务*/
}
}
/*
*********************************************************************************************************
*CREATEASEMAPHORE(创建一个信号量)
*
*Description:
Thisfunctioncreatesasemaphore.
*
*Arguments:
cntistheinitialvalueforthesemaphore.Ifthevalueis0,noresourceis
*available(ornoeventhasoccurred).Youinitializethesemaphoretoa
*non-zerovaluetospecifyhowmanyresourcesareavailable(e.g.ifyouhave
*10resources,youwouldinitializethesemaphoreto10).
*
*Returns:
!
=(void*)0isapointertotheeventcontrolclock(OS_EVENT)associatedwiththe
*createdsemaphore
*==(void*)0ifnoeventcontrolblockswereavailable
*********************************************************************************************************
*/
OS_EVENT*OSSemCreate(INT16Ucnt)
{
#ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/
OS_CPU_SRcpu_sr;
#endif
OS_EVENT*pevent;
if(OSIntNesting>0)/*SeeifcalledfromISR...*/
{/*如果当前正在执行中断服务程序*/
return((OS_EVENT*)0);/*...can'tCREATEfromanISR*/
}/*创建失败,返回(OS_EVENT*)0*/
/*注:
中断服务子程序中不能调用创建信号量*/
OS_ENTER_CRITICAL();/*关全局中断*/
pevent=OSEventFreeList;/*Getnextfreeeventcontrolblock*/
/*从空闲事件控制块链表中获得一个事件控制块*/
if(OSEventFreeList!
=(OS_EVENT*)0)/*SeeifpooloffreeECBpoolwasempty*/
{/*如果获得一个事件控制块成功*/
OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;
}/*修正空闲事件控制块链表头指针,使它指向*/
/*下一个空闲控制块*/
OS_EXIT_CRITICAL();/*开放全局中断*/
if(pevent!
=(OS_EVENT*)0){/*如果获得的事件控制块可用*/
pevent->OSEventType=OS_EVENT_TYPE_SEM;/*登记事件控制块的类型=信号量*/
pevent->OSEventCnt=cnt;/*信号量的初始值存入申请的事件控制块中*/
pevent->OSEventPtr=(void*)0;/*UnlinkfromECBfreelist*/
OS_EventWaitListInit(pevent);/*Initializeto'nobodywaiting'onsem.*/
}
return(pevent);
}
/*
*********************************************************************************************************
*INITIALIZEATASK'SSTACK
*
*Description:
ThisfunctioniscalledbyeitherOSTaskCreate()orOSTaskCreateExt()toinitializethe
*stackframeofthetaskbeingcreated.Thisfunctionishighlyprocessorspecific.
*
*Arguments:
taskisapointertothetaskcode
*
*pdataisapointertoausersupplieddataareathatwillbepassedtothetask
*whenthetaskfirstexecutes.
*
*ptosisapointertothetopofstack.Itisassumedthat'ptos'pointsto
*a'free'entryonthetaskstack.IfOS_STK_GROWTHissetto1then
*'ptos'willcontaintheHIGHESTvalidaddressofthestack.Similarly,if
*OS_STK_GROWTHissetto0,the'ptos'willcontainstheLOWESTvalidaddress
*ofthestack.
*(指向任务堆栈栈顶的指针,它是指向