UCOSII学习笔记.docx

上传人:b****7 文档编号:23736036 上传时间:2023-05-20 格式:DOCX 页数:61 大小:36.67KB
下载 相关 举报
UCOSII学习笔记.docx_第1页
第1页 / 共61页
UCOSII学习笔记.docx_第2页
第2页 / 共61页
UCOSII学习笔记.docx_第3页
第3页 / 共61页
UCOSII学习笔记.docx_第4页
第4页 / 共61页
UCOSII学习笔记.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

UCOSII学习笔记.docx

《UCOSII学习笔记.docx》由会员分享,可在线阅读,更多相关《UCOSII学习笔记.docx(61页珍藏版)》请在冰豆网上搜索。

UCOSII学习笔记.docx

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.

*(指向任务堆栈栈顶的指针,它是指向

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1