51单片机操作系统.doc_第1页
51单片机操作系统.doc_第2页
51单片机操作系统.doc_第3页
51单片机操作系统.doc_第4页
51单片机操作系统.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式实时操作系统,可以充分的利用单片机的资源,提高CPU使用效率。操作系统最主要就是实现任务的调度、管理。同时对于实时操作系统来说响应时间很重要。操作系统编写最主要就是用到了堆栈SP于RET指令。这两个东西怎么用呢?其实在我们每次调用函数的时候都会自动将函数的断点地址(执行函数调用时的PC)压入到SP中,而从函数中返回时其实是利用RET指令将断点弹回到PC(程序指针)中。所以利用堆栈和RET指令就可以实现简单的任务的切换。这么说肯定挺模糊的,接下来一步一步解释。首先,要知道任务是一个死循环。如下面所示,可以看出两个任务都是死循环,按照以往的情况,程序是跳不出来的,只能在while(1)中无限执行。那怎么才可以实现从task0到task1的切换呢? 其实如果我们能够改变PC的值是不是就可以改变程序执行顺序了。任务的调度切换就是利用改变PC的值来改变程序执行顺序的。其次,就是要解决如何实现PC值的正确变换问题,如何让PC指向我们需要执行的地方。这就是通过堆栈来实现的。我们可以为每个任务建立一个堆栈用于保存任务PC的值,以及任务寄存器的值。这样每次进行任务切换时只要从相应的堆栈中取出PC和寄存器的值就可以实现任务的调度了。在程序中于寄存器相关的程序使用在C语言中嵌入汇编来实现的。因为直接使用C语言不能直接控制寄存器。在本程序中,入栈和出栈是通过汇编实现的。一个简单的操作系统如下所示,只能实现简单的任务调度,延时。必须注意,空闲任务(Idle)必须建立,否则会出错。#include#define OSEnterCritical() EA=0#define OSExitCritical() EA=1#define EnterInt() EA=0;#define uint unsigned short int#define uchar unsigned char#define MAX_Tasks 3#define False 0#define Ture 1#define MaxPrio 2#define IdlePrio MaxPrio#define OS_Task_Create_Error 1#define OS_Delet_Task_Error 2#define OS_Delet_Task_Not_Exit 3#define OS_Resume_Idle_Error 4#define OS_Resume_Task_Error 5typedef structuchar OSStackTop; /SPuchar OSSuspend;uchar OSTCBDly; /delay timeOSTCB;uchar code OSMapTbl8=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80;OSTCB OSTCBTblMAX_Tasks;volatile uchar OSRdyTbl;volatile uchar OSIntNesting; /用于中断锁死volatile uchar OSSchNesting; /任务切换上锁volatile uchar OSRuning=False;volatile uchar OSStartStackMAX_Tasks20;volatile uchar OSPointMAX_Tasks2;volatile uchar OSPrioCur;/volatile uchar OSTaskPend;OSInit()/uchar i;EA=0;ET0=1;TMOD=0x01;TH0=0xB1;TL0=0xE0;OSRdyTbl=0;OSIntNesting=0;OSSchNesting=0;/PCL,PCH,ACC,B,DPL,DPH,PSW,R0-R7uchar *OSStackInit(uint task,uchar *ptr,uchar OSPrio)uchar* stk;stk=ptr;OSPointOSPrio0=task;OSPointOSPrio1=task8;*(stk+)= OSPointOSPrio0;*(stk+)= OSPointOSPrio1;*(stk+)= 0x00;/ACC*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00;*(stk+)= 0x00; *(stk) = 0x00; return stk;uchar OSTaskCreate(uint task,uchar *ptr,uchar OSPrio)uchar* psp;OSEnterCritical();if(OSPrio=MaxPrio)/创建的任务优先级有效psp=OSStackInit(task,ptr,OSPrio);/初始化堆栈OSRdyTbl|=OSMapTblOSPrio;OSTCBTblOSPrio.OSStackTop=psp;OSTCBTblOSPrio.OSSuspend=0;OSTCBTblOSPrio.OSTCBDly=0;elseOSExitCritical();return OS_Task_Create_Error;OSExitCritical(); /*=任务调度函数入口参数:无函数说明:进入函数后,先进行堆栈保护,然后查找最高优先级任务运行=*/ void OSSchedule()uchar i;OSEnterCritical();#pragma asmPUSH ACCPUSH BPUSH DPHPUSH DPLPUSH PSWPUSH 0PUSH 7PUSH 1PUSH 2PUSH 3PUSH 4PUSH 5PUSH 6#pragma endasmOSTCBTblOSPrioCur.OSStackTop=SP;if(OSRdyTbl)/如果就续表中有任务for(i=0; i=IdlePrio)OSExitCritical();return OS_Delet_Task_Error;if(!(OSRdyTbl & OSMapTblpriority)OSExitCritical();return OS_Delet_Task_Not_Exit;OSRdyTbl &= (OSMapTblpriority);OSExitCritical();if(priority=0)OSRdyTbl |= (OSMapTblpriority);else/返回的任务不存在,返回错误标志OSExitCritical();return OS_Resume_Task_Error;OSExitCritical();if(priorityOSPrioCur)OSSchedule();/*=定时器0用于产生系统时钟,这里每过20ms中断一次。=*/void timer0() interrupt 1uchar i;EA=0;TR0=0;TH0=0xB1;TL0=0xE0;if(OSRuning=Ture)/如果不是第一次调度则保护任务堆栈 ,有部分堆栈进入中断时自动完成/定时器自动保护的堆栈可通过反汇编查看,以此确定堆栈的安排顺序_asm PUSH 1_asm PUSH 2_asm PUSH 3_asm PUSH 4_asm PUSH 5_asm PUSH 6OSTCBTblOSPrioCur.OSStackTop=SP;else/第一次进入则将OSRuning置位OSRuning=Ture;if(OSRuning=Ture)/如在运行,for(i=0;iMAX_Tasks;i+)if(OSRdyTbl & OSMapTbli) & OSTCBTbli.OSTCBDly)/如果任务需要延时,将任务延时参数减一OSTCBTbli.OSTCBDly-;if(OSTCBTbli.OSTCBDly=0)OSTCBTbli.OSSuspend=0;for(i=0;iMAX_Tasks;i+)if(OSRdyTbl & OSMapTbli) & (!OSTCBTbli.OSSuspend)/查找优先级最高的且未挂起的任务OSPrioCur=i;break;SP=OSTCBTblOSPrioCur.OSStackTop;#pragmaasm POP 6; POP 5; POP 4; POP 3; POP 2; POP 1; /* POP 7; POP 0; POP PSW; POP DPH; POP DPL; POP ACC; */#pragma endasmTR0=1;EA=1;void Idle()while(1);void task0()uchar temp=0x01,i;while(1)for(i=0;i8;i+)P1=temp;temp=1;OSDelay(10);temp=0x01;void task1()uchar i=0,j=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论