- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
51单片机操作系统
嵌入式实时操作系统,可以充分的利用单片机的资源,提高CPU使用效率。操作系统最主要就是实现任务的调度、管理。同时对于实时操作系统来说响应时间很重要。
操作系统编写最主要就是用到了堆栈SP于RET指令。这两个东西怎么用呢?其实在我们每次调用函数的时候都会自动将函数的断点地址(执行函数调用时的PC)压入到SP中,而从函数中返回时其实是利用RET指令将断点弹回到PC(程序指针)中。所以利用堆栈和RET指令就可以实现简单的任务的切换。这么说肯定挺模糊的,接下来一步一步解释。
首先,要知道任务是一个死循环。如下面所示,可以看出两个任务都是死循环,按照以往的情况,程序是跳不出来的,只能在while(1)中无限执行。那怎么才可以实现从task0到task1的切换呢?
其实如果我们能够改变PC的值是不是就可以改变程序执行顺序了。任务的调度切换就是利用改变PC的值来改变程序执行顺序的。
其次,就是要解决如何实现PC值的正确变换问题,如何让PC指向我们需要执行的地方。这就是通过堆栈来实现的。我们可以为每个任务建立一个堆栈用于保存任务PC的值,以及任务寄存器的值。这样每次进行任务切换时只要从相应的堆栈中取出PC和寄存器的值就可以实现任务的调度了。
在程序中于寄存器相关的程序使用在C语言中嵌入汇编来实现的。因为直接使用C语言不能直接控制寄存器。在本程序中,入栈和出栈是通过汇编实现的。
一个简单的操作系统如下所示,只能实现简单的任务调度,延时。必须注意,空闲任务(Idle)必须建立,否则会出错。
#includereg52.h
#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 5
typedef struct
{
uchar OSStackTop; //SP
uchar OSSuspend;
uchar OSTCBDly; //delay time
}OSTCB;
uchar code OSMapTbl[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
OSTCB OSTCBTbl[MAX_Tasks];
volatile uchar OSRdyTbl;
volatile uchar OSIntNesting; //用于中断锁死
volatile uchar OSSchNesting; //任务切换上锁
volatile uchar OSRuning=False;
volatile uchar OSStartStack[MAX_Tasks][20];
volatile uchar OSPoint[MAX_Tasks][2];
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-R7
uchar *OSStackInit(uint task,uchar *ptr,uchar OSPrio)
{
uchar* stk;
stk=ptr;
OSPoint[OSPrio][0]=task;
OSPoint[OSPrio][1]=task8;
*(stk++)= OSPoint[OSPrio][0];
*(stk++)= OSPoint[OSPrio][1];
*(stk++)= 0x00; //ACC
*(stk++)= 0x00;
*(stk++)= 0x00;
*(stk++)= 0x00;
*(stk++)= 0x00;
您可能关注的文档
- 20091025文综.doc
- 2011(浙江卷)生物.doc
- 2011年注册电气专业考试特别好的一篇经验(很详细).doc
- 2005年国考行政能力测试(B类).doc
- 201105八年级地理阶段练习18-21S.doc
- 2011代数结构解答.doc
- 2011年11月份人力资源2级.doc
- 2011版国家基本公共卫生服务规范考卷20121026(A卷).doc
- 2011级通信原理实验安排.doc
- 2012教育法教程.doc
- 人教版英语5年级下册全册教学课件.pptx
- 部编人教版2年级上册语文全册教学课件含单元及专项复习.pptx
- 人教版8年级上册英语全册教学课件(2021年8月修订).pptx
- 教科版(2017版)6年级上册科学全册课件+课时练.pptx
- 人教版PEP版6年级英语下册全册教学课件(2022年12月修订).pptx
- 部编人教版2年级下册语文全册课件(2021年春修订).pptx
- 人教版数学6年级下册全册教学课件(2023年教材).pptx
- 湘少版5年级下册英语全册教学课件(2021年春修订).pptx
- 人教PEP4年级下册英语全册教学课件 [2}.pptx
- 人教版6年级上册英语全册教学课件.pptx
文档评论(0)