51单片机操作系统Word格式文档下载.docx

上传人:b****1 文档编号:4471662 上传时间:2023-05-03 格式:DOCX 页数:15 大小:31.41KB
下载 相关 举报
51单片机操作系统Word格式文档下载.docx_第1页
第1页 / 共15页
51单片机操作系统Word格式文档下载.docx_第2页
第2页 / 共15页
51单片机操作系统Word格式文档下载.docx_第3页
第3页 / 共15页
51单片机操作系统Word格式文档下载.docx_第4页
第4页 / 共15页
51单片机操作系统Word格式文档下载.docx_第5页
第5页 / 共15页
51单片机操作系统Word格式文档下载.docx_第6页
第6页 / 共15页
51单片机操作系统Word格式文档下载.docx_第7页
第7页 / 共15页
51单片机操作系统Word格式文档下载.docx_第8页
第8页 / 共15页
51单片机操作系统Word格式文档下载.docx_第9页
第9页 / 共15页
51单片机操作系统Word格式文档下载.docx_第10页
第10页 / 共15页
51单片机操作系统Word格式文档下载.docx_第11页
第11页 / 共15页
51单片机操作系统Word格式文档下载.docx_第12页
第12页 / 共15页
51单片机操作系统Word格式文档下载.docx_第13页
第13页 / 共15页
51单片机操作系统Word格式文档下载.docx_第14页
第14页 / 共15页
51单片机操作系统Word格式文档下载.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

51单片机操作系统Word格式文档下载.docx

《51单片机操作系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《51单片机操作系统Word格式文档下载.docx(15页珍藏版)》请在冰点文库上搜索。

51单片机操作系统Word格式文档下载.docx

#defineOSEnterCritical()EA=0

#defineOSExitCritical()EA=1

#defineEnterInt()EA=0;

#defineuintunsignedshortint

#defineucharunsignedchar

#defineMAX_Tasks3

#defineFalse0

#defineTure1

#defineMaxPrio2

#defineIdlePrioMaxPrio

#defineOS_Task_Create_Error1

#defineOS_Delet_Task_Error2

#defineOS_Delet_Task_Not_Exit3

#defineOS_Resume_Idle_Error4

#defineOS_Resume_Task_Error5

typedefstruct

{

ucharOSStackTop;

//SP

ucharOSSuspend;

ucharOSTCBDly;

//delaytime

}OSTCB;

ucharcodeOSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

OSTCBOSTCBTbl[MAX_Tasks];

volatileucharOSRdyTbl;

volatileucharOSIntNesting;

//用于中断锁死

volatileucharOSSchNesting;

//任务切换上锁

volatileucharOSRuning=False;

volatileucharOSStartStack[MAX_Tasks][20];

volatileucharOSPoint[MAX_Tasks][2];

volatileucharOSPrioCur;

//volatileucharOSTaskPend;

OSInit()

//uchari;

EA=0;

ET0=1;

TMOD=0x01;

TH0=0xB1;

TL0=0xE0;

OSRdyTbl=0;

OSIntNesting=0;

OSSchNesting=0;

}

//PCL,PCH,ACC,B,DPL,DPH,PSW,R0-R7

uchar*OSStackInit(uinttask,uchar*ptr,ucharOSPrio)

uchar*stk;

stk=ptr;

OSPoint[OSPrio][0]=task;

OSPoint[OSPrio][1]=task>

>

8;

*(stk++)=OSPoint[OSPrio][0];

*(stk++)=OSPoint[OSPrio][1];

*(stk++)=0x00;

//ACC

*(stk)=0x00;

returnstk;

ucharOSTaskCreate(uinttask,uchar*ptr,ucharOSPrio)

uchar*psp;

OSEnterCritical();

if(OSPrio<

=MaxPrio)//创建的任务优先级有效

{

psp=OSStackInit(task,ptr,OSPrio);

//初始化堆栈

OSRdyTbl|=OSMapTbl[OSPrio];

OSTCBTbl[OSPrio].OSStackTop=psp;

OSTCBTbl[OSPrio].OSSuspend=0;

OSTCBTbl[OSPrio].OSTCBDly=0;

}

else

OSExitCritical();

returnOS_Task_Create_Error;

OSExitCritical();

/*=====================================================

任务调度函数

入口参数:

函数说明:

进入函数后,先进行堆栈保护,然后查找最高优先

级任务运行

======================================================*/

voidOSSchedule()

uchari;

#pragmaasm

PUSHACC

PUSHB

PUSHDPH

PUSHDPL

PUSHPSW

PUSH0

PUSH7

PUSH1

PUSH2

PUSH3

PUSH4

PUSH5

PUSH6

#pragmaendasm

OSTCBTbl[OSPrioCur].OSStackTop=SP;

if(OSRdyTbl)//如果就续表中有任务

for(i=0;

i<

MAX_Tasks;

i++)

{

if((OSRdyTbl&

OSMapTbl[i])&

&

(!

OSTCBTbl[i].OSSuspend))//任务优先级最高且未被挂起

{

OSPrioCur=i;

break;

}

}

SP=OSTCBTbl[OSPrioCur].OSStackTop;

#pragmaasm

POP6;

POP5;

POP4;

POP3;

POP2;

POP1;

POP7;

POP0;

POPPSW;

POPDPL;

POPDPH;

POPB;

POPACC;

voidOSStart()

TR0=1;

EA=1;

while

(1);

/*=========================================================

延时若干个系统时钟

延时系统时间个数

===========================================================*/

voidOSDelay(uchartime)

if(time==0)//延时为0,返回

return;

OSTCBTbl[OSPrioCur].OSTCBDly=time;

OSTCBTbl[OSPrioCur].OSSuspend=1;

OSSchedule();

任务删除函数

为被删除任务优先级

将任务从就绪表中删除

ucharOSTaskDelet(ucharpriority)

if(priority>

=IdlePrio)

returnOS_Delet_Task_Error;

if(!

(OSRdyTbl&

OSMapTbl[priority]))

returnOS_Delet_Task_Not_Exit;

OSRdyTbl&

=~(OSMapTbl[priority]);

if(priority<

OSPrioCur)

OSSchedule();

任务恢复函数

恢的任务优先级

恢复被OSTaskDelet()删除的任务

ucharOSTaskResume(ucharpriority)

if(priority==IdlePrio)//恢复的任务不能为空闲任务,为空闲任务返回错误标志

returnOS_Resume_Idle_Error;

if((!

OSMapTbl[priority]))&

(priority>

=0))

OSRdyTbl|=(OSMapTbl[priority]);

else//返回的任务不存在,返回错误标志

returnOS_Resume_Task_Error;

/*===============================================================

定时器0用于产生系统时钟,这里每过20ms中断一次。

===============================================================*/

voidtimer0()interrupt1

TR0=0;

if(OSRuning==Ture)//如果不是第一次调度则保护任务堆栈,有部分堆栈进入中断时自动完成

{//定时器自动保护的堆栈可通过反汇编查看,以此确定堆栈的安排顺序

__asmPUSH1

__asmPUSH2

__asmPUSH3

__asmPUSH4

__asmPUSH5

__asmPUSH6

OSTCBTbl[OSPrioCur].OSStackTop=SP;

else//第一次进入则将OSRuning置位

OSRuning=Ture;

if(OSRuning==Ture)//如在运行,

i<

OSMapTbl[i])&

OSTCBTbl[i].OSTCBDly)//如果任务需要延时,将任务延时参数减一

OSTCBTbl[i].OSTCBDly--;

if(OSTCBTbl[i].OSTCBDly==0)

{

OSTCBTbl[i].OSSuspend=0;

}

(!

OSTCBTbl[i].OSSuspend))//查找优先级最高的且未挂起的任务

{

SP=OSTCBTbl[OSPrioCur].OSStackTop;

#pragmaasm

POP6;

POP5;

POP4;

POP3;

POP2;

POP1;

/*POP7;

POP0;

POPPSW;

POPDPH;

POPDPL;

POPACC;

*/

#pragmaendasm

voidIdle()

voidtask0()

uchartemp=0x01,i;

while

(1)

P1=~temp;

temp<

<

=1;

OSDelay(10);

temp=0x01;

voidtask1()

uchari=0,j=0;

16;

P3=j;

OSDelay(20);

j++;

j=0;

intmain()

OSInit();

OSTaskCreate(&

Idle,&

OSStartStack[2],IdlePrio);

task1,&

OSStartStack[1],1);

task0,&

OSStartStack[0],0);

OSStart();

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

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2